|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- d7 x. Q! T$ B7 C" ^, Y; c* N
% t( n$ G9 ]6 r. E" pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> R# y* r. u* c
#include <unistd.h>% h: a. o( E( Q9 B1 k6 W! w ]
#include <sys/mman.h>$ _3 E0 Q4 t, [6 t Z
#include <sys/types.h>1 ?2 n0 P A) K! |1 I* {+ j% `/ q
#include <fcntl.h>
) o+ \( U4 F/ Q' R) S$ {1 u
7 g% X( P& B/ U#define SHAER_RAM_BASE_ADDR (0x80000000) ! \1 ~9 P' u6 s# S- A
2 c# |$ W* `" |. N
typedef struct
. R* K, Q% i% n{0 J9 H) C# B3 j- ~
unsigned int a;3 J; B$ \" ^1 z/ ?
unsigned int b;4 h5 p* }7 A$ b
unsigned int packet_cout;+ U) k' C& B3 l8 q; i( h) u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: L1 `) U5 I, ?4 @/ h5 D b
/ m7 }) f" h. `/ {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 M" D4 d4 c$ {unsigned int count_copy = 0;
, K8 {' L G1 c) L2 w- X7 a: z0 g. Z0 ^' G( M
! {$ }( j. E( I' c2 X, zint main()3 g( }4 ~$ U! t. |. k
{
7 s! y& E7 ^" g; A4 J. f6 s pRX_MSG_PROTOCOL pshreRAM = NULL;
& x! v9 g, j6 H- f" ^$ Z7 {* U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 V/ Y% O+ i. p6 {8 W, Q
+ N- k" n5 z- b( n% B$ K6 @
while(1)" m# C% S9 @* G, t7 t
{2 K$ [$ ]9 m& ?: |
read_MSG_buffer(pshreRAM);
* J. ], s2 V; `! B } ; @$ w5 B; j/ [ o5 E- {, \. I
}
0 p# W- m& W1 c& t+ {; n
3 \" T. D% [4 |" w. L& Y5 i: Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P# l8 L# c* I# c) [( x+ V{
8 l8 [5 w$ u$ g8 h RX_MSG_PROTOCOL buf;
, \4 ^$ y5 `$ u' o( G: r" c/ L 9 s- Q! Z; z3 H4 Z5 n) d
buf.a = pshreRAM->a;
, U6 e! h; j$ S g- y buf.b = pshreRAM->b;1 m# D: s; h: y# d* j* N
buf.packet_cout = pshreRAM->packet_cout;% x; G9 V. X: T; [/ l
1 H Q' j7 d/ p7 \ G! p5 n if(buf.packet_cout != count_copy)
. P0 W7 A$ t/ G. t) H) L3 N3 }+ p {. W: k k1 m+ [8 h
printf("a is %d\n", buf.a);5 f. n/ V4 x6 a$ ~& O0 \; E$ P' O
printf("b is %d\n", buf.b);3 r$ g6 {& _! _% j$ t
printf("count is %d\n", buf.packet_cout);
L: Q+ O) p% P5 S; Q count_copy = buf.packet_cout;( J( l$ \1 u' z* h5 L# O% L
}
& N9 R4 t3 B: Q8 G, \/ v else
6 V! U$ K. A% \* L$ Y3 c {" D6 y& u0 \" n! l
printf("No effective message!");
4 U; o/ @' B% D) N9 S }( v$ S; f6 h, r' P
}! \0 j1 U% s% X, @5 [" X
& X: @8 x# C r0 U8 Q8 L6 A/ g/ z9 ]; E! p" {" L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- o; ?* t% X: H; j" Z# _& g
使用下面代码,对内存使用了mmap函数后:
1 ~- g, Y0 o2 O0 o#include <stdio.h>) r' Y4 o9 T: ?2 U+ `5 [$ {
#include <unistd.h># w$ y% K; @# |8 S9 t8 v
#include <sys/mman.h>% e$ m! t7 q4 G
#include <sys/types.h>
) }1 u' O l A: v0 z#include <fcntl.h>+ {: B0 R a- m1 v& h' H
, ]9 E# [ m7 l2 ^: n# @#define SHAER_RAM_BASE_ADDR (0x80000000). t* {8 W3 R' ~- E6 g6 d7 F6 V4 u2 A2 Z
#define SHAER_RAM_SIZE (0x20000) . K* v6 Q1 v2 a$ _* T& K; T! F1 X
* b/ O) h5 x& t$ ^. E: a0 B
typedef struct* W7 t2 C) @+ N2 w, a
{
% L) I2 f" u* z6 | unsigned int a;5 J& E, C( R# p0 ]3 ]
unsigned int b;! F4 B3 \- W" R" \. Q6 k
unsigned int packet_cout;1 X0 W6 m+ F4 o* z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 g W8 [! N# g6 A5 {0 w' r/ m+ {/ l
void read_MSG_buffer(int *baseaddr);
" Q# m1 X. B1 `" t# F; V2 v; Funsigned int count_copy = 0;
- c: {% R6 h8 W' {$ q# m% x: y
+ \+ O3 p9 ?" |9 _) v; A4 Qint main(), N& q K7 G1 _8 d4 Z+ q0 Y7 c
{
$ g7 a& p* L. z% e: M int fd;
5 \* K) N6 d# s* F/ i int *mem = NULL;
) X( T8 m2 _3 Q: u) `) H6 c% ~) \1 S. @$ R6 H# y) p
if((fd = open("/dev/mem", O_RDWR)) <0)
3 _( H" u1 u3 O0 b. b+ B* \ {, z/ x6 _3 c$ s$ g- F
perror("open error");
2 r; e% |& |$ p return -1;
. U3 }+ z! U' m% \2 O7 o }* T3 w: w0 H+ }- K# C
" B! p$ {8 M9 G% M mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: [! G# Z9 a% k
2 s1 \3 J1 e% } E while(1): A, J6 x3 X& O6 e7 V5 U
{
/ a3 U+ f b2 ^$ \ read_MSG_buffer(mem);
- u2 Q. B: n1 U! t) U* Z8 o: V } ! T/ a* q8 c9 ?7 M; Q# m4 R, H
}
( H& s6 y; B+ @: c* V) [7 `/ p9 z" ?9 {: k
void read_MSG_buffer(int *baseaddr)" y( g& q" y8 p; ~0 }7 k& z2 X, x$ ^
{
" x* [1 |0 M0 G' Q( a! B) U pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w {' v( y' [% h( V; b% c' p+ j9 z8 N" Z2 O2 k5 J. t
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ^! |1 B+ G7 m7 V! L7 U5 I; Q% P7 r: ?
if(pshreRAM->packet_cout != count_copy)$ h3 Y- S2 G( k, s; }; [; \
{
" ]7 U9 R, }/ g printf("a is %d\n", pshreRAM->a);
5 C6 x4 x V& Q! G0 {$ o( { printf("b is %d\n", pshreRAM->b);
. ^2 n0 Q' N1 R/ w# M printf("count is %d\n", pshreRAM->packet_cout);- L0 O) j4 `' B; ~% o
count_copy = pshreRAM->packet_cout;
5 L& ^1 S3 _9 s n' N; x, T/ Z2 K }2 o7 m2 d& x' }) S
else8 ~5 q; o& D) n
{! A% i9 j- U* Z; L4 G2 J
printf("No effective message!\n"); W, e7 B+ [" Y
}5 W7 `. `: N9 K) D5 M2 r; P
}
& e4 j6 w4 Q/ A' l# C' v3 B# b5 E8 X% K5 P p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% r; v2 q; C+ \$ w
5 T D0 U2 L1 z2 C- o, ~
5 V6 p$ ^# q: |0 g( o
6 \: i! ?! |' {3 F8 Z. X) m% ^9 m8 k/ x: O1 n9 w
|
|