|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- D4 E5 {8 P1 Q7 }2 p9 C# e1 P( @' J( n' W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 u4 s8 H5 _9 W" |$ M
#include <unistd.h>
I5 V" f9 Q6 y4 |7 F) \- c* v#include <sys/mman.h>
* H; E6 Q6 X0 l% Q5 E0 l#include <sys/types.h>$ x) z8 X& B0 n7 W4 O8 y
#include <fcntl.h>4 P6 O. v; p6 R1 L2 q) s
/ A/ a' H9 Q& W' s8 T
#define SHAER_RAM_BASE_ADDR (0x80000000) ( Q: k6 K G. f
- n; d& H( ~, stypedef struct) @8 |1 W' ?4 Y/ M
{8 Y! s! K3 U6 C6 `4 O2 l
unsigned int a;
0 @+ ?. Y4 V. F) A unsigned int b;/ N# i5 z+ O8 p! a7 n7 J, B
unsigned int packet_cout;
' h. j" H' d. U# w/ s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: e+ ?5 O8 g$ y# S- ]7 ?# z- i+ J( R# H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- T3 Y8 K1 ~# @7 e0 Munsigned int count_copy = 0;
$ g" ^. u+ b% U+ N0 y8 p& T$ t' ]
2 ^' d5 @- [9 ^9 |( d* j( S
3 E3 b0 d7 Z! E2 ]% b" Lint main()
3 A2 V" l* N$ E{% o% L3 t# S: O+ r/ ~: K
pRX_MSG_PROTOCOL pshreRAM = NULL;* _0 f. r Y0 _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, o% m; _. p" j# N+ z4 B
8 _1 T" X, @3 R( Z+ m while(1)9 \5 P2 n& k+ B" P S* T
{0 H# w% Q* x: s4 A* ]# {# y
read_MSG_buffer(pshreRAM);- B, V: g$ N p* U0 T! B& j
} - M! s1 F- J- M" s
}9 f- H- @5 d4 Q! q+ O) q
- R0 q! q+ R3 J. _, y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% d; G; ^9 c) f# n7 |$ ^- L
{( Q3 E' P( W' S2 s& u M$ u7 s
RX_MSG_PROTOCOL buf;7 Y# o2 Z" b9 N" C0 \4 U I
* j$ M) a9 U- G+ n b9 l2 r
buf.a = pshreRAM->a;
2 a H Q( S3 P ~ buf.b = pshreRAM->b; Q2 L1 j- y& w- @5 j3 }+ @6 Q5 d
buf.packet_cout = pshreRAM->packet_cout;$ D$ _: |8 i. a. [: S- a1 C
9 Z8 a3 d2 M4 O$ K if(buf.packet_cout != count_copy)
" a/ s8 j% y! M {* K U# }) O/ f
printf("a is %d\n", buf.a);
+ ~( P: z0 |0 H4 J% P. w6 d, M printf("b is %d\n", buf.b);
: F4 R- U: M! t printf("count is %d\n", buf.packet_cout);4 G2 o) n# y( d4 q0 D" B
count_copy = buf.packet_cout;0 I% T, X% |: f" o' _' o" R
}( p6 R8 I. T' z, G4 X
else/ |2 h5 s4 M# _+ v1 F" p; n' J$ v
{
~' w u" ?* k$ S, s1 ]0 r* X5 X printf("No effective message!");
# n# b4 J! |( _4 ^ }
& e5 A# z4 v9 L. d( `# ]}+ f5 _# h$ W$ g2 ]* H" ?
/ |, `1 ]9 k/ V0 `
6 S" x6 w! w) R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ U0 h8 i( _/ o5 ]; l: n$ i
使用下面代码,对内存使用了mmap函数后:
* A% z' n0 Q. o* q) G/ w6 W! E#include <stdio.h>7 c1 j4 l6 c1 \& t! |( C8 s
#include <unistd.h>
; K8 n$ ^6 T/ e+ Y( X0 x/ f#include <sys/mman.h>
" E7 d1 t/ X3 T; Y& t! J#include <sys/types.h>4 u' F( p2 R: ]' E
#include <fcntl.h>8 P) ^) ?: f" C3 \ t7 ]
9 L" T8 \2 E" z#define SHAER_RAM_BASE_ADDR (0x80000000)+ N7 }9 ` Q( i+ w. ]
#define SHAER_RAM_SIZE (0x20000)
) R j2 C/ J& F8 w! J/ ^! w
4 a1 z3 H% S* c: g" O) f! u+ Wtypedef struct
' `+ w# ^, |. D2 o4 M. {6 U{3 _0 f: Y1 R V8 _$ n( B) h
unsigned int a;
/ r! V+ ^# P) P2 L+ @8 P unsigned int b;+ y1 ~8 g6 h+ `
unsigned int packet_cout;5 k2 F1 o u- O" Y. I) _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ B* Q0 ^/ v# e( z/ X2 S; P3 S {( ~- \8 s! J, s2 _; l
void read_MSG_buffer(int *baseaddr);
6 |/ C6 U" ^: S! s* v* E9 Ounsigned int count_copy = 0;/ g3 m/ H2 i2 e8 I. Z4 o$ z
! R6 U/ _' D0 B
int main(): \+ h* z7 Y( K" k! y3 |3 [/ p
{
1 ?. s/ s D/ j, l7 r int fd;
+ j. f% f. @- i# w3 ^ int *mem = NULL;
) I4 `, B/ M0 S, B$ A
: h" S( @! }6 V. f if((fd = open("/dev/mem", O_RDWR)) <0)4 H9 a, H% B% \4 C9 |2 e r- x
{
) V* a: U2 K/ D+ C perror("open error");
+ u. B S0 @: T, i g7 P return -1;
/ L6 }) T9 A# x. {8 G2 |$ p' R }0 z7 L8 u4 A L! K
" o4 `- U! r6 c) M, W5 i mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ a1 L4 @! t* O. K- M! c- I U
' y2 o, {! p) K* I while(1)" ~9 o! L4 X# J8 E" a* f& x( [+ F
{' B/ z4 |& j4 J
read_MSG_buffer(mem);
3 t9 Q8 L6 _ g5 ` r0 D/ K! t }
( y& w- r2 P7 j `}
& O; j6 w x' s2 r: R
+ e f% t d* b/ Xvoid read_MSG_buffer(int *baseaddr)- p4 \* L1 s, @9 o0 }& ?; ]; e
{, Y7 U) q. R5 t6 k! G! l
pRX_MSG_PROTOCOL pshreRAM = NULL;( ?0 D$ Y- m" ^- }$ k( ?2 l+ B+ V
5 \+ j! |& ^: `; P) ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ k' | {5 w- l( s H
1 j% q2 A; C2 \' R4 R* t9 s# Q
if(pshreRAM->packet_cout != count_copy)- G$ T7 l+ s, P9 W9 V5 \
{( c( B1 \! x! m i$ ~' [8 B7 c
printf("a is %d\n", pshreRAM->a);, ~! c) f6 N$ }; ]3 \2 v% ?
printf("b is %d\n", pshreRAM->b);
: R% m. q3 y! r* o printf("count is %d\n", pshreRAM->packet_cout);, ^. o5 f9 p5 A! L: B/ j, v
count_copy = pshreRAM->packet_cout;
. x* M5 I f) l2 P6 W }
0 i$ u- M' {) ~( K7 i else
/ ^1 H; j$ S7 x! T {
% L# S+ u% i7 O4 t$ b$ W printf("No effective message!\n");
! G( ?6 l0 p# T& a }
K& J2 o0 r. o}+ |" d7 `; d6 @3 b+ G
: b( s5 r M! q* _0 R( Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' x5 M8 Z& ~$ K: V" N V& L
! F) ]4 L) X A% @! Y' h3 `' S! _0 N, |
4 y5 W: e" ?! w
' s+ A- f- t! K' O: l |
|