|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 l2 y4 Q9 ` B0 Z# t% a" R9 `
) b8 \) Y! y6 j; ?! Y$ L+ s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 I9 e, i/ {- O& T+ t- `: V: B
#include <unistd.h>
/ Y$ H% O# g0 p* t#include <sys/mman.h>; m- f( v+ l; m
#include <sys/types.h>
6 e( [) V& s4 W$ S; W1 r#include <fcntl.h>
3 |: v4 ]* g9 s* M4 L) D: ]. U: g) W1 f
#define SHAER_RAM_BASE_ADDR (0x80000000) ; W* G" X" q+ ^( A1 s( |5 t
7 l i6 V; `& N0 ^0 m& V
typedef struct/ ~, w) w* }4 N* S, S; z) }9 {$ v5 X
{1 W a9 ^ v" |/ P- _, S4 A) B9 k" _& v
unsigned int a;/ q i, Z1 |+ j, R0 v _
unsigned int b;
! e' t) I1 F0 z1 p6 O# m! B _ unsigned int packet_cout;
4 t' u% H' n# ^7 K" j7 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) e8 q- j8 W' k
8 T# l! |- e! i* `% p2 e! Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 d4 [! }! I/ C1 C3 ]unsigned int count_copy = 0;
2 Q4 i! m9 D( f' R1 `, ^+ Y) I6 j. t3 W9 Z1 p
# B0 t: P/ u" n% }+ h3 |int main()1 H. @9 P' k& r
{& M: }' j3 P& u# m2 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ N2 j1 e! I! y# f N, j pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 S2 e# A9 X, C) F" H; \" v) }6 c9 `! d; G
& a7 {2 ^9 M" s# s4 O/ t& s while(1)7 X* B- j7 D$ X# D. o7 m
{
I, g# Z8 h0 Y' R read_MSG_buffer(pshreRAM);) n% _ e+ A h. Q L
}
: {5 J9 x4 p. q}
/ E* V5 Z+ s, D3 o/ ~9 E" m
+ a9 P, O& m: n) xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 G& A4 P5 u5 S7 g1 t7 i/ u{: S- P: C$ y+ Z
RX_MSG_PROTOCOL buf;
' r5 p- C6 G3 e( a
; M4 G a$ q8 e buf.a = pshreRAM->a;# [: k" z R9 S* c
buf.b = pshreRAM->b;
' d* g0 U3 O: Y6 Y! ^8 ? buf.packet_cout = pshreRAM->packet_cout;
0 j$ K/ M! \2 Q# v; \& J+ t1 {
+ {5 w' n0 ^2 f! e: @ if(buf.packet_cout != count_copy)3 m3 q3 g& G7 L7 [9 E" v U3 w% ~
{
^( Y9 J. ~+ f8 x% r printf("a is %d\n", buf.a);
" f. G1 U3 w6 o2 }! N printf("b is %d\n", buf.b);" ^& @; P# g. u- v$ t, c
printf("count is %d\n", buf.packet_cout);( p! t: h( l. g: N1 G
count_copy = buf.packet_cout;
7 j3 c% w1 c, F) i }$ L4 S c, x( u& [7 [0 Z
else
) |9 d% G' E& O u7 m, v7 o3 V {
: \. }9 \- q2 W3 v; {1 Z) W6 s+ c printf("No effective message!");" n" T8 c" U- `$ {/ Z
}
+ z1 P) E- l( G% c' o}/ O. O8 k/ ]3 W) _( h/ R! U
: o/ p; Q9 I8 s. w% y- r5 n* X& ~# ^0 \4 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' V8 ?' K+ \, K
使用下面代码,对内存使用了mmap函数后:
; a+ R" L1 B3 i3 N" f#include <stdio.h>" O: x1 @* j: [. U1 W
#include <unistd.h>
: `& i3 x# U# A9 ]1 m#include <sys/mman.h>2 I9 x% ?/ j; h6 J% @2 Z
#include <sys/types.h>
& l$ D/ [1 ^8 I! |0 c' d4 J3 P#include <fcntl.h>
% u! Q6 m+ M4 M: ?7 T6 U! X; |7 T# V
#define SHAER_RAM_BASE_ADDR (0x80000000)0 \4 K; b0 a6 P7 X; f
#define SHAER_RAM_SIZE (0x20000) 7 c8 \/ I2 `* {, C. f; A$ F
0 @% e" t0 V+ y4 V& [6 [1 @8 J
typedef struct
7 g2 Q" r5 a+ ]0 P{
0 R, _+ B1 L |! L" A3 ^ unsigned int a;
1 P* Y$ q9 z& D unsigned int b;( b( Q8 s2 n8 C1 n
unsigned int packet_cout;5 f4 J" F3 }0 H2 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 k5 j# l* `$ Z9 D7 e( Y3 d0 S% }5 P
2 @4 o: G9 a0 a' f3 D& X$ R- O" V
void read_MSG_buffer(int *baseaddr);0 d3 p9 g6 b) t6 O1 S5 e
unsigned int count_copy = 0;- P, {0 J! E. H& N& X' E q
' \% B9 n) }& b8 hint main()% }- z* n H ?0 u4 k& e5 b* O
{: _4 U a+ M) k2 V0 k: N, i+ X. s
int fd;2 Q# A! u6 t4 r' q# L/ G
int *mem = NULL;
0 z5 i3 F6 L/ T4 o6 i) P
# [2 @2 d9 M/ A if((fd = open("/dev/mem", O_RDWR)) <0)$ {7 ?4 X8 ? y( x
{! d4 R$ D! B" F: h% z
perror("open error");
@+ y6 X) f0 U5 g return -1;
2 i3 o- l& K. b8 A6 I" D" Q }+ ~) g5 d1 O) ~- q. n- U# u4 v2 I
! ~0 Z; W0 [" z9 f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 l+ J, {% m9 @4 P( ]
! O5 A! V! G0 i while(1)
+ d/ m& F7 @8 E+ N {" C" H+ i& j! k. l% Z) @3 Z* ~0 Z
read_MSG_buffer(mem);" L+ i4 p" ~3 N/ O' k
} 5 t' e6 y3 f7 k6 C- K
}* y, Z C M) Y4 _
) p, \/ [, q1 \) Z' ]void read_MSG_buffer(int *baseaddr), L7 S7 O1 |1 v5 L& s5 X
{5 C2 P0 J0 L4 _9 s5 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
% j8 u5 Q: _. ~9 d* F- [% n9 Q5 Q- p" N/ `; {- V# |, l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' H6 \# H, x8 b; |& J( ]
& j' g7 N* g$ M9 c5 I- u6 W if(pshreRAM->packet_cout != count_copy); P2 E7 s) `; E' i @- ?
{" i) h! |& }/ g) d
printf("a is %d\n", pshreRAM->a);, \4 D! Z4 r* ]9 r, x! [) h
printf("b is %d\n", pshreRAM->b);
2 i" l+ [ c# u: D9 L printf("count is %d\n", pshreRAM->packet_cout);% X& m2 B2 e0 Z- ]
count_copy = pshreRAM->packet_cout;
, o$ E& b$ }( Y8 o% b% b# c! h }
/ b4 N' V3 S! D9 {, {) A else
+ O6 a" T+ n3 q9 b/ l1 J; V& y {
' L1 `5 }* t9 B5 S printf("No effective message!\n");& Y# K2 N/ }! n6 w" A
}
s( g& b# P* e O C}
9 X" l2 ~" V, C( w5 t6 j/ X+ v3 D3 d8 M) ?* L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) Q5 B; t. W2 {. b- O6 V1 b7 Y- d
) y) V7 P) d& M' W1 T4 H. _
4 W1 C9 r6 c: S0 ]8 u) }3 K6 e! O$ }0 P& z& V: `
|
|