|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : {* W$ i% W7 ~' d
4 m7 i& O0 A! x0 A- _& eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ t {7 M$ `$ S9 A
#include <unistd.h>' n2 {4 |6 Q# K! c. V
#include <sys/mman.h>8 l% q. {! c6 n' d" g
#include <sys/types.h>! m1 ~2 |- H! ~+ Z$ Q3 p
#include <fcntl.h>3 O0 J2 m' n ^, j" h" t$ ]9 F
$ T/ J, `6 h6 J p# d4 D
#define SHAER_RAM_BASE_ADDR (0x80000000) 3 H# ?6 M7 f7 F+ A
6 b3 f3 y$ |: rtypedef struct
6 A @$ F) r/ m6 R{6 i! H, Y8 [1 S8 n8 d* p
unsigned int a;8 S5 G* N" C+ H$ R
unsigned int b;2 | @) D2 r% ^! b: U. w
unsigned int packet_cout;
. M; n# W' y4 F( ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. l3 p# H Y% a3 A, W
1 t; h8 s9 u; [# f& fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) G+ j9 }7 |: p, W, Runsigned int count_copy = 0;* x9 Z4 | h ?% @& j" V+ R; B
2 I ?1 A( `8 s- s
5 J3 p4 ]2 c+ ^0 ?9 Z- K3 F- a' jint main(). a/ s- i1 h/ M* H2 ?+ }0 y
{
1 y4 U6 D y r- W; m# j pRX_MSG_PROTOCOL pshreRAM = NULL;
6 d, k5 y* t- {1 y0 P" ~& m r pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: X. O- M' P4 l* q+ j2 ], i& f5 |4 _" g: K+ r8 L- m; m# @8 b
while(1)
* m* E F0 A6 ^' l* ~ {
9 G5 `: `( W6 @' n, @ read_MSG_buffer(pshreRAM);
4 @. D$ U: c' G/ S7 }5 d }
1 v& A2 s+ k1 s- r% h}
6 k2 g4 }" y) Z5 m! L# ]5 f+ {/ u5 t( x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) S8 T$ P8 J t+ t; f- `
{: d- e" r Q: E) R/ s
RX_MSG_PROTOCOL buf;
3 \% ~; t$ q: b0 d9 ~; s: D. q
, a! \# {8 \# ` buf.a = pshreRAM->a;0 T+ Q0 b7 c$ s$ o0 Z' c+ Z
buf.b = pshreRAM->b;' D( c( e$ a, n7 N; a% H6 j- c2 N
buf.packet_cout = pshreRAM->packet_cout;
/ _2 H! c/ k- R6 g
9 y( U, V9 d) g1 M U$ p0 G: p% k if(buf.packet_cout != count_copy)2 K$ Q8 g% L! p1 Z) s
{; `- |+ F! }; a% p {
printf("a is %d\n", buf.a);
$ S2 I7 C1 j3 ]2 \ printf("b is %d\n", buf.b);6 @. q! f8 ]+ E) ^8 X8 x" i6 l
printf("count is %d\n", buf.packet_cout);4 B( O2 z5 Y+ d f: {$ J, ]
count_copy = buf.packet_cout; z. ~& {8 u' G5 |
}4 J. `% m! D) x7 k8 E
else
5 _# v4 Y F" d. z {
( p# @3 j# @ @- A0 n# B# u printf("No effective message!");
1 v' Y/ t" E% o) l% V6 o }- g [. D+ X2 d3 G6 ~, |: j/ K
}3 H/ R. L2 u/ z
5 P+ r! E" s/ j+ i* w/ Z$ M- j$ a. N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 j' a; f2 }2 y+ z" d- v
使用下面代码,对内存使用了mmap函数后:) ^) }3 J" C e
#include <stdio.h>. F- M% t* I! Z) J. r% W! E
#include <unistd.h>
0 ^ w1 j; J0 H; ~#include <sys/mman.h>
+ p' A9 W' f6 x, W#include <sys/types.h>
+ n5 W. h" m' [$ Q- b6 B: L#include <fcntl.h>$ I4 l# D; D/ g' c
1 }2 \; `7 `- h8 ^#define SHAER_RAM_BASE_ADDR (0x80000000)% r, d, B, U" |, d4 ]0 i
#define SHAER_RAM_SIZE (0x20000) 6 Y4 Z8 A3 K8 i
4 u' a) {/ T: Y& etypedef struct
/ Y: @3 ~& r8 J2 p( S0 _{
" f9 w* g/ r4 O9 p( t3 k* k unsigned int a;1 w" C4 ^4 G7 D2 U* e# G
unsigned int b;
- T# g. z5 K& v unsigned int packet_cout;
" j; ], B4 l- N3 O; ^9 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; ^) P/ g+ K( c, c4 g
z: D9 ]* ~ A4 m2 g) Z/ c4 R
void read_MSG_buffer(int *baseaddr);
7 i% g( T: c3 ]3 Iunsigned int count_copy = 0;
+ q K# B( J8 W4 p7 ^5 K( J$ D+ |' |& E
int main()+ Q& H; g. m% x. D
{0 o- r. T% z& f' Q; i- m5 o: ^3 }
int fd;9 s" G& i8 k4 \
int *mem = NULL;
8 T; \+ W1 y5 `! d7 b9 `1 K$ x; m) r9 \3 B0 [( Y
if((fd = open("/dev/mem", O_RDWR)) <0)
* D' |; M3 j% U9 F {& ^1 g1 E1 o! Q& O0 }" ?; t# K
perror("open error");; A! i* W+ S9 r3 a4 [
return -1;- N) W! ^# m; S5 H Z1 o% V" G
}* t' }( r5 Y) o8 ~: M9 \/ S- k
: [4 N: f9 J4 Y1 J( g) R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 r' l7 u, j A& `5 ^
1 P2 T% `& Z' H( ]. _
while(1). `8 J/ }) ^" T0 Q' D, j
{# T" y0 w% |6 a. u
read_MSG_buffer(mem);
- l6 s. E2 L: y( q }
' \" n! m7 s* |}
o0 W: W- Y+ W; i7 }! s3 Z, X( E# |& {# K. l
void read_MSG_buffer(int *baseaddr)
; |+ u* }! ^" ]8 v3 P{
- f5 ^) Y' l | pRX_MSG_PROTOCOL pshreRAM = NULL;
1 C' z/ x/ c5 K/ a) Q: a
, o) ]- z% c. z9 _* g' ?1 N3 R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ b4 m# G( D! r9 P7 _% ?' T/ b
& H) y7 l# [' e. l if(pshreRAM->packet_cout != count_copy)5 U& ~1 b0 `& ^/ b
{1 D3 F" h0 r+ A
printf("a is %d\n", pshreRAM->a);7 f6 L' t+ y% u2 P% b: P3 ~; T
printf("b is %d\n", pshreRAM->b);
' f% a1 W+ x, {5 f printf("count is %d\n", pshreRAM->packet_cout);
& f* z, p6 {0 B# t) N9 H- l5 t count_copy = pshreRAM->packet_cout;4 K; U) _- X) C
}
7 f2 F- N; O7 k- `$ ]/ X else
' l, P+ f8 ^, ?1 v& M2 v# w {
: _: g2 j+ V- H% r printf("No effective message!\n");
8 B* v7 ]* F9 L. O- z9 v }
* y2 A' J0 s' G, K+ Z8 v/ X4 z) g}: V& o: ?# E8 W' n3 I
. g" r" r2 O8 O9 x+ d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 j" n9 a# p' C4 X; L% \
1 K. W9 W& h* U
' h) u0 s: y" w" y' V8 c$ q9 Z+ ] f7 v D* m# n( S2 q
: y# p" L' }$ L) v3 Q7 a, u R |
|