|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& B7 Q+ ?* a% ^/ Z! N
3 o, l8 H( k+ u. T* a! yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ l6 ~( ^' C0 }9 {
#include <unistd.h>
U* \. N+ G/ F% P#include <sys/mman.h>- G1 U0 y1 p2 P; u
#include <sys/types.h>5 Z, `1 d" r0 |1 n8 J- ~
#include <fcntl.h>+ ]& B' I* `% s0 r7 n+ }
6 u( y5 v3 z# I* D. L#define SHAER_RAM_BASE_ADDR (0x80000000) K( W6 k1 W+ B& f- v" T
6 I! b5 U& w9 ^
typedef struct" g; D* W6 u) N) h
{
b3 ^; m# o8 O: Y. K6 } unsigned int a;; e; c7 C5 A0 m( J u b3 f! v
unsigned int b;
- V4 ^% Y# J4 k unsigned int packet_cout;
2 k' I( y( b3 ^. r) c) Z: K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ k% I, W8 q4 V+ R7 e7 {
/ ^+ G# c/ [( l' i( f* J/ g9 ^, Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 g G& A0 u, Tunsigned int count_copy = 0;$ q/ J0 Z6 Z, |( P Y) Q& Z* {
# m1 n1 d3 K8 @. h9 c; N
- q: F4 L/ K0 m+ Vint main()
4 Y1 j0 U/ L, q M' I; J{
5 t+ w: g1 a$ v! W3 A5 [ pRX_MSG_PROTOCOL pshreRAM = NULL;" X4 C9 a5 J1 ?9 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; i1 m. z9 `' r
+ T D1 e- X/ h# f while(1)
7 f4 x6 U( s9 B8 p) X& B; [ {) G5 X" U$ \) M+ H
read_MSG_buffer(pshreRAM);) ?5 X# f0 N+ m8 M/ B3 g5 h/ s
}
* |0 L6 u _" q) G+ \2 y}
8 \- S. x; B: ~, I% W% x
7 |1 n9 J7 J8 X& K4 s& v% m- tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% l9 J9 F7 j- @# J! v$ F/ G$ @{
, c, s3 m. V' H1 w' i: F! e* Q8 j RX_MSG_PROTOCOL buf;. M: J$ z8 |2 `# F' g* Y
8 R1 `9 |1 ]$ x. x+ J' G8 R buf.a = pshreRAM->a;
7 h- \8 N7 d; z buf.b = pshreRAM->b;
`: L5 ~" F* v/ G buf.packet_cout = pshreRAM->packet_cout;
d4 t1 o+ a, O# T8 \ , d4 V4 J$ Z2 q2 ?* t
if(buf.packet_cout != count_copy)
+ F. p8 [$ Q- _) r5 T- h {9 L3 m" ]" T3 A/ A
printf("a is %d\n", buf.a);7 ?- _1 R! F* D6 U! r$ T
printf("b is %d\n", buf.b);
4 x% _1 w" L9 Q$ ?& X( X printf("count is %d\n", buf.packet_cout);6 ?3 e& |) L% }6 `
count_copy = buf.packet_cout;/ |$ ]3 _' [+ Q8 F
} Y4 V' e7 ~4 Z$ R% m( X
else: n( p& f6 V2 i# A
{$ t4 I) s! k# Y* {
printf("No effective message!");( }8 V; Q! s9 g$ B. [
}( p3 ]/ w" l) w. \3 P
}) [* }8 Y& ]( V6 T% e& e/ f
; e" ?) n2 a$ |' |& x
N& q( t/ z2 Z8 v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 k. a( @; E7 {* s& v
使用下面代码,对内存使用了mmap函数后:+ p5 w5 e1 k/ M( G0 i9 n. ^. d4 q
#include <stdio.h>0 C2 ~3 u1 d( R. I, D' E7 ^
#include <unistd.h>: }$ h. W/ T5 Z& Y$ B
#include <sys/mman.h>
$ L2 S6 f3 `" `8 V1 c& q#include <sys/types.h>3 Q! {4 ^' `% p% _: U: P$ Y
#include <fcntl.h>
- S9 [9 D- v E: d3 c" `& C' q h4 a( v% t6 \% v% _
#define SHAER_RAM_BASE_ADDR (0x80000000)
" o: ^' |* d) }#define SHAER_RAM_SIZE (0x20000)
/ X5 j# e% A( L: t. b2 F9 v; A3 ^+ r+ w0 X
typedef struct4 S2 a2 U; P+ A) G! u$ P: v- J% q
{, w4 T( @4 G2 L0 y7 I1 r) n
unsigned int a;3 Q5 b `1 |4 t4 Q" ?3 A! m
unsigned int b;
; a2 E4 v' N$ q* } p unsigned int packet_cout;
. X" i% k! M1 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# F" `& x$ F! S/ f! E) z
9 a' S2 h5 D( n8 p
void read_MSG_buffer(int *baseaddr);
3 C/ ^) M" T9 i# Tunsigned int count_copy = 0;
* j& Z* r3 l6 D! I+ ~7 G: K# |& p7 s
int main()
5 U) w% D7 [* R/ {{
$ u) N9 h, P! d' F* R int fd;
) ?& C' l! {' | int *mem = NULL;
5 Z9 r( R* q# {/ o( r0 V0 \# t( w
2 A( ?- i8 E' r7 v$ r3 Y0 }. n; ] if((fd = open("/dev/mem", O_RDWR)) <0)
N0 k9 W' E5 U' |; o" u5 A8 _ {
7 P7 |# k6 ]. }, X* \ perror("open error");
. f ?9 b, k9 K7 w+ E- O; x$ o; ? return -1;
( s0 ^* x+ }3 P }
: G7 c3 v5 a8 L9 _0 Y" ~9 p' V
% @8 `& h& a+ V! U2 N mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 x# Q' e& ]0 P1 q- D0 F; m
6 \" s0 g) w6 a2 S' ?" ^1 |" D while(1)8 u7 O& X. I% { T& @
{
3 Y% |" @7 _% R' N3 p) r! K( S read_MSG_buffer(mem);
1 O2 d' e0 \5 m- h# Q }
9 v6 b' S. V5 |9 R8 y* _& j* s}: ?+ l E" j4 @8 G- g' G1 q
5 O6 d- z6 H( c- e
void read_MSG_buffer(int *baseaddr) f. b9 j' {" z% W
{( F; m6 L: C2 `+ _: d
pRX_MSG_PROTOCOL pshreRAM = NULL;9 t9 c. U7 m/ \
# H! @( s4 V/ s* Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- q9 o6 u' F: _
5 G. X% |8 U, f1 E- \ if(pshreRAM->packet_cout != count_copy)
/ l1 v: r. a4 @1 `6 W+ I. T" K {
# K' A* k- O0 v9 u, }' q printf("a is %d\n", pshreRAM->a);) A) p( a& V8 x3 X* K! [
printf("b is %d\n", pshreRAM->b);
: T V& L4 d6 U4 E0 S, O* q printf("count is %d\n", pshreRAM->packet_cout);; ^! Z& _8 H6 d% p# B) r
count_copy = pshreRAM->packet_cout;
: P# N' m+ M }8 S$ ` }; K" j+ M3 Z3 [* e6 |% D! a
else* G$ V. R+ Z; j& t' c, S
{
' p) \( g* p9 K* J) M( d8 G. I printf("No effective message!\n");0 E5 n+ \' l! l, R$ P# v
}
9 Z {( S; H1 U" L2 i, Z}
$ V4 K+ Q. c; Q( M
" _% Q( F1 M# y3 w* Y! M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; `9 K; g6 k D. X& O0 l( n
4 f1 w4 ]' A+ }& N+ ~3 y7 f- n N- F, j% k
4 N; V" y. J0 z0 Q
2 P7 ?" b/ _9 f# C' h( ^9 \ |
|