|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 I( Q c @+ |. | r
6 l7 e9 o3 ~5 W4 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ I7 A% V0 Q9 k$ P
#include <unistd.h>/ d2 I" C3 u9 S$ |! O
#include <sys/mman.h>
: m3 [# T5 V D* @( f#include <sys/types.h>
2 x7 ?: D* F" w% J#include <fcntl.h>
! [" T i+ p) b# }& I
% s c/ S% N& ` O! e7 t4 c#define SHAER_RAM_BASE_ADDR (0x80000000) ( T8 _* L) C" k2 p, U2 z3 m; [
4 U" k$ o) N+ q. p
typedef struct' e U+ R+ I- I
{
4 ]2 h5 [ k y. R7 I$ y unsigned int a;
+ X; r$ a, u* p4 [8 F" d, s; G6 d unsigned int b;
9 p K+ l3 n7 H unsigned int packet_cout;- r! X& D5 |; F3 |: r7 p1 Q- i, F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 k% j8 c7 V% R N5 `6 K. }3 O* ]5 U3 ~5 V$ j, S! i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ L9 J4 x* Q6 o
unsigned int count_copy = 0;
; s+ |$ l y% N5 F6 b7 @9 e0 i
& H; p" a7 K( ]
. g5 p2 L! e7 ~, g; y, B) y4 t& fint main() H5 a0 p m9 v- U
{, x1 _' V; h, ]% S7 N/ C. }" Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
' o2 c# T5 t( G9 s) q$ Z- C { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" O0 p7 }7 p) S
# r, ]# L8 ^$ t! N1 t8 i# p5 E
while(1)
3 G+ U" p3 m. [- s ^$ _0 B! T {
/ K5 C1 L* d, ` |& ]$ t- i9 \ u7 D read_MSG_buffer(pshreRAM);/ I1 K3 `5 v4 }; ~8 T- t) @3 A3 U
}
# N5 w0 c0 M8 W( m}
( \" b/ p) { @3 y; X& m# s
8 ^% a- A( @6 D$ {8 Z# Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; G/ B& X2 u. H! Y* ^) h) E: P1 q{) g w6 e8 H* S: n3 d# g2 x
RX_MSG_PROTOCOL buf;
$ A0 c+ z4 r2 D0 G% y5 R# q: g
2 ~8 ^$ x3 _2 N& ? buf.a = pshreRAM->a;
6 D" F8 M1 m! {/ k buf.b = pshreRAM->b;8 f1 d- i8 M0 |. k0 \
buf.packet_cout = pshreRAM->packet_cout;
/ a+ ]8 L8 A7 @' D# v+ X
" C0 Z+ S: Y, _7 ^- u7 d if(buf.packet_cout != count_copy)- O8 ~4 A y! O8 T: ]/ v0 e0 ]: u
{9 k" W: Y$ W3 C$ Q) @: }" `1 R
printf("a is %d\n", buf.a);* ?5 I- y, k. R; K2 p
printf("b is %d\n", buf.b);
/ g) x q. K* Z, h printf("count is %d\n", buf.packet_cout);
/ q- ?3 W9 O% ] t) v" o) H count_copy = buf.packet_cout;
- b3 U: n6 v" p& E. P1 {" F9 Q% F }
& H3 B6 O2 C" I7 ^1 J& g else) Q9 f3 `/ z! W, N8 p0 |, L
{
& b+ E# y3 k C* p7 |( b# y printf("No effective message!");
( ?) T* h, Z; _ }
, }! R* m9 d6 @3 h}4 U5 \, G& m; e% h
, J6 r' g }+ x! J) z2 n
, Z9 p- z8 P1 w+ I% |3 L p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 U) x" [1 W2 M: ^8 B7 h3 {. b6 O! I
使用下面代码,对内存使用了mmap函数后:; L- Z4 W. ~- _7 p' {/ j" F
#include <stdio.h>, c/ F5 t( U8 |4 `5 u; Q! a
#include <unistd.h>
6 {6 D) N- h$ f- c$ w* v3 J#include <sys/mman.h># z" S$ A) c* N9 y
#include <sys/types.h>
' k& A0 _2 z; Q$ k- \" B#include <fcntl.h>
8 l G5 l. I/ W) d+ m
7 i$ q+ U, b9 K* l6 V8 z#define SHAER_RAM_BASE_ADDR (0x80000000)
2 |1 q: |/ K8 o# J#define SHAER_RAM_SIZE (0x20000) & p5 I) [( Z, m X" F7 v
( q U+ r9 A5 Q- M& M v6 v. }6 Y( x
typedef struct6 W, |# j4 D; W( v: m
{. h2 \ N2 e6 F# [( o1 f5 i
unsigned int a;
1 n# s* K: n9 t% Z unsigned int b;
- i: L3 Z5 Y, L, x, J& B unsigned int packet_cout;" j" W! W! {. R; M" Z7 B' E' _+ F0 x# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Z' L/ ?7 [5 g) ?. b N, x1 z
" c1 f* n6 J- u6 @( C8 H: n* tvoid read_MSG_buffer(int *baseaddr);1 S0 v9 `# a/ Q6 \; N7 j0 j$ |; u U
unsigned int count_copy = 0;
6 u- l- K( W, P1 g
7 X/ t# O, ~- e3 Zint main()
2 l$ F4 M8 q' t5 }( y T{, N) I+ G8 M3 S3 k7 |/ I
int fd;" R1 ~ y4 Y7 V2 y. u
int *mem = NULL;
/ C+ Q7 U- G8 G/ P& X- q
W; q+ ~3 J" J* |* e7 I* l if((fd = open("/dev/mem", O_RDWR)) <0)% B* e$ |/ v, s$ l; G
{
6 M. R- V! r5 M+ U perror("open error");
9 j& a3 q( }( N0 r g return -1;% [ {. s* g% \/ y
}2 H" M8 n) V* k- z
2 [; ]- T8 e0 P' q6 W: N m/ W+ }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 Q# i! k6 U X+ L2 B9 @
% N- p! q) o6 j( I$ e while(1)
+ g& D; B4 I; }3 B# G' \ {
* Z1 k" z* z) @0 q* X* j read_MSG_buffer(mem);, O8 N" y7 n# c! G( [. \
} & M( W* ?3 N$ ]: z/ ]- x
}" `; o q* {; _; ~, D. X: \
7 K2 h6 W7 l2 m5 m. A8 y
void read_MSG_buffer(int *baseaddr)
u d6 X* `7 w2 |9 [5 C6 U{; H; n) _" y4 @$ k
pRX_MSG_PROTOCOL pshreRAM = NULL;! V' K, p2 V) i3 S5 a
! B5 \3 _$ ^! K% \ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: I! L! h9 P) h
% s! `8 F4 Z8 f/ m* E, V if(pshreRAM->packet_cout != count_copy)6 A) [* f: B" _) U
{
( }' b' q0 D( Y8 h' h/ ]( w6 K printf("a is %d\n", pshreRAM->a);. j4 T8 Y& E7 V5 w+ @1 ~7 q+ u% Y
printf("b is %d\n", pshreRAM->b);
2 n) \1 J$ P9 D7 r+ B, { printf("count is %d\n", pshreRAM->packet_cout);
$ ~: d* D4 K$ K+ {" a count_copy = pshreRAM->packet_cout;
; B4 B: Z, H+ C% a5 B2 S4 Y }$ e9 @+ G; b+ q& b f/ ^# b+ x
else* `+ ~0 o$ p ]1 g( a
{5 L* Q( x4 Z1 N# h
printf("No effective message!\n");+ f/ u: x% U: o+ N
}
% f! I/ q- a2 B% F0 R}
" q( p1 V7 V* ?3 X8 ?8 u" K
3 u1 j; w" d/ y- d# C* K* A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! }' n; n, J9 {: \0 q4 |5 {$ w2 q1 m+ I/ U2 A9 c. ^2 c8 ^
0 B; e) k, ^9 j! i" s. P! @9 P
' ]- |7 O( c/ R3 U: e1 t9 p4 U
3 ^1 L% b+ Q$ L- Y |
|