|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, U, v5 ?' u2 _
, b& w& U$ u9 X$ r8 mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ h0 r% M8 J, L4 {' X8 k#include <unistd.h>( m3 z: `& k9 K4 Z7 d, N" e
#include <sys/mman.h>
! a& w4 e0 W+ g3 @# n& N+ X: c#include <sys/types.h>5 D/ f) k: z5 j9 n0 p6 E' ]
#include <fcntl.h>$ _9 H8 b" a8 V* M# l9 O
5 W3 V# D5 M9 n/ R, ?* U( U1 }
#define SHAER_RAM_BASE_ADDR (0x80000000) & s8 B4 `0 T/ O9 c! Q9 f/ |" l
* L* k, s# w$ R: e) M: F. l' o, I6 V
typedef struct
/ O, B* l$ Q# R7 b{
) o6 v6 n' j5 ~7 J! J unsigned int a;8 E( m) C% o2 b2 E1 M
unsigned int b;& R# {& b: U# J2 a& E3 \. p
unsigned int packet_cout;! ~1 f1 [/ i" h" M% O, U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 m8 Q' W: O/ {
, W6 p c" ]1 K5 j4 [$ {* qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ S! m8 Q" ~0 ]; f0 l
unsigned int count_copy = 0;
* P9 Y) G% I v3 E" m P, Z0 I4 Y; B7 O
# V9 `) I. m% V( v+ U# R+ q Dint main()
$ h1 [, d2 p: h- l9 I: R4 y+ |{1 j( s Z" G5 E" Q @) i9 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;/ q2 g' Q) f: e5 G0 O9 F- B' E/ Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 U3 L! z8 m3 w* k4 A
7 f7 n; J, p6 D; c1 u& y5 P' s; J while(1)
: ^+ \7 S8 R2 r3 C5 B% g$ J {5 |" t+ ?% e: G+ w: `
read_MSG_buffer(pshreRAM);
7 G: x) }* L3 V" P- @6 C }
) k% w% X2 Y1 H) I5 `$ I8 Q}
* J U5 s& o# Y5 r0 V" s( n. P2 b5 Q5 K7 w( L0 ?& U: t( v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 c2 U0 {$ p) Q) d% g{3 Z/ a! _' |. w% j
RX_MSG_PROTOCOL buf;
1 _3 ^/ z( b7 K8 A5 @6 X 5 V( ^, D3 [+ J$ Q* q$ q1 J' N- o
buf.a = pshreRAM->a;
7 H. V. H6 V3 z( O% ^/ B. Q buf.b = pshreRAM->b;
, m! X6 Q8 W$ D/ @ buf.packet_cout = pshreRAM->packet_cout;
4 s( d8 Z9 u' @5 d$ @' I9 S+ p! J! V 2 p& c* K& D+ R- d% j
if(buf.packet_cout != count_copy)5 n1 h8 _9 ?% ?9 N; e6 Q
{
) w6 c/ Z' H7 ]" u printf("a is %d\n", buf.a);; |2 X; q- W* x, f0 {( u* A
printf("b is %d\n", buf.b);. f# R6 p% t- ~# e
printf("count is %d\n", buf.packet_cout);! X9 i. @$ ]+ N& P
count_copy = buf.packet_cout;* E0 l4 m! x# q I$ B1 A7 C, D+ S
}
G) z b# s g* B1 R. m else
* i; u+ S- t$ t J1 P: ~1 x {* {. `% A2 a+ F0 F$ U$ O/ J
printf("No effective message!");" A/ P2 t, A+ T* C4 u3 f7 |% s
}: K: T6 |# W0 h9 y
}
* E7 d' W' a! S
& p/ e0 s' c+ h3 p: t% D
. z) T/ O$ Z# c& D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% n! A' P* y6 }) @) @
使用下面代码,对内存使用了mmap函数后:0 y! X8 O) r5 \' C1 Q; C
#include <stdio.h>
2 L4 [: |; s$ Q5 h8 ?- \#include <unistd.h>
6 f* O0 p6 @9 v#include <sys/mman.h>* _: U. Y* Q) r) o- }
#include <sys/types.h># {) E" p- Y' {: Q
#include <fcntl.h>
+ i. p9 K( L( x. Y: S
! \5 l3 x" S- Y) Y: i/ j#define SHAER_RAM_BASE_ADDR (0x80000000)
. {( D- ^ _7 X0 e#define SHAER_RAM_SIZE (0x20000) ' C4 z W5 z& m" }# S3 k% N7 Y; m
1 o8 O& @4 g I' f; b+ [- J6 Ttypedef struct5 ?5 s( e" L+ ^
{
+ x1 w. \) I ]. t; c7 m: \+ q- b unsigned int a;
$ x- e0 Z4 T( n% j7 ` unsigned int b;
3 r; m; a, O& d; R' d7 B2 |+ b unsigned int packet_cout;
) \( y6 J7 H! V' p/ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ c. @3 l3 X$ q# ^/ t$ g. |- E6 l/ g* F4 r9 V7 B
void read_MSG_buffer(int *baseaddr); l% O+ G$ N! v: x
unsigned int count_copy = 0;
& Y% s1 u" O( N9 h7 M+ o
% c% S* U9 k: f7 W0 _int main()% `1 _7 y! I" A' Z& r3 z+ G9 o
{# d3 z: |, p8 v1 {
int fd;; ]2 \/ i1 q ~5 a, d
int *mem = NULL;
$ l/ Y0 F/ P/ _2 K( ?! C+ ?, Z$ C7 y
if((fd = open("/dev/mem", O_RDWR)) <0)
+ E& h$ c3 w1 ?3 D {
) y( a* r! z) Z' k) |) z" s perror("open error");
' _0 [+ B0 E* S9 S1 i/ }8 K0 Q& x return -1;
+ ?/ U t4 y, j3 u }. O/ d9 H* A, F& H* s$ M/ p6 A
4 b" u4 t6 y+ v2 f. ~) g- q9 Y mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! j K4 y3 r' Q, d
* r' w* v' N! F) n B. e while(1)
* Q4 ^0 l c2 _8 y( [0 H s: | {
! h# w) N) x7 T9 O read_MSG_buffer(mem);$ `0 k1 d$ V; x% G8 C
} " v8 r; O1 H4 g6 p
}3 ^1 M6 \+ G* s0 D* Z
* ]! T3 N& j h, K- ^void read_MSG_buffer(int *baseaddr)
; i6 w' R! ~2 R/ P; }{4 Q" `' `" i$ u9 I# Q1 k7 W7 E
pRX_MSG_PROTOCOL pshreRAM = NULL;
: S, z" ]2 R( F/ L8 y* t% c9 f! P
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: I. x/ f ]: C+ M# S
: ?; y& O6 Y/ r if(pshreRAM->packet_cout != count_copy)4 U! l# n( m' I% `3 p; W
{9 e/ x4 o0 ~) {" t9 w6 k" N5 H4 c3 p
printf("a is %d\n", pshreRAM->a);7 ?8 @! O9 i" W5 O
printf("b is %d\n", pshreRAM->b);
& w8 o; ^* K' H9 G+ F# J% i$ |& }' G printf("count is %d\n", pshreRAM->packet_cout);8 W6 u) N5 X$ q9 S* F
count_copy = pshreRAM->packet_cout;
F4 k2 M# Q" v2 ^ }$ r5 M/ D4 C0 }+ l
else) C9 w" D5 L, _5 `- y. w. E
{
5 ?# }1 o4 R. O$ S( L3 h ~ printf("No effective message!\n");
$ G0 j# g/ s* d& M7 j+ L }7 r" d9 h, c6 G8 T) B* N
}1 }. i4 ?7 A$ A( C; n
2 |3 x' B g, k5 s" B& g5 U8 ?( a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 E C" r5 Y$ G( `0 Y; u; u. O" W; I, e% R" M' k
- b' O( ^/ U6 I9 H
% S% H* Q6 |. D+ t0 U2 W, e6 ?9 |# ~$ O! N" k
|
|