|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % j5 t! W2 u5 A- x
6 m6 A- w) N& W0 D& YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Z6 w' ]! F$ o' R) A" L#include <unistd.h>1 L0 _2 {- n, q! n; ~5 A
#include <sys/mman.h>! G# y0 b; Y W* x
#include <sys/types.h>
' G3 }5 p4 Y. A#include <fcntl.h>1 W7 q. d! W2 K( O% ]1 u- {! s- F( S: z8 }
9 A* a! d1 Z8 e1 R#define SHAER_RAM_BASE_ADDR (0x80000000) + U* ~/ _9 x( p7 f+ k
2 d3 t9 ]- b" A
typedef struct$ [7 E1 F' |6 Y! y& q5 N. }
{' N% \1 U5 Q1 `4 F
unsigned int a;
9 L' {/ o" [% B6 Y3 B8 { unsigned int b;! V/ U/ W7 h) L9 n5 l
unsigned int packet_cout;, G) E4 m5 W3 w' Z- C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: R: C( P' S" s2 p3 p6 p
, J' W% t, _3 X4 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 C. @ }! m% gunsigned int count_copy = 0;
k9 `* M2 S/ L9 ?4 W/ K
2 n; z7 ]( d0 Z$ b) w, Z; f1 L7 x. E, A+ z9 B) `7 ?$ `
int main()
5 y+ k% O6 Q9 d* V5 T8 c! U y{8 Z0 @' P+ g z
pRX_MSG_PROTOCOL pshreRAM = NULL;
! @4 _9 f- B) N# } pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( c U$ C" p O
" q n- S3 j* C; d2 X' z. }0 n while(1)
& X* u2 V3 i. F# t {
3 ^) c8 Y8 w7 ~1 z* B read_MSG_buffer(pshreRAM);$ G. _0 N0 U: I1 x8 g% y0 L
}
4 v' d4 Q& e, F+ I4 h$ u& H0 e7 Q) A}
# t. P6 N4 [9 K' W% R: r% D2 m( y+ z0 \$ ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" [ N5 l$ A9 Q: M( s4 A4 t8 m{$ R" U$ R; P( M8 k1 w5 J
RX_MSG_PROTOCOL buf;" h* l+ @2 o" @5 V$ I# A$ s' a
1 x/ `4 S4 ?3 b+ B! C buf.a = pshreRAM->a;
( p6 R/ u6 b) r& T buf.b = pshreRAM->b;8 Z0 M/ h. B' Y- Y# g
buf.packet_cout = pshreRAM->packet_cout;
2 E2 U2 Q+ O' E9 f
' G) Y4 a) G% P# X if(buf.packet_cout != count_copy)5 y: k' ?5 B9 l9 |& S# N/ Z
{2 [1 ^/ X+ U! }8 R" n
printf("a is %d\n", buf.a);& C; t2 u/ a: j0 W- [* f- z
printf("b is %d\n", buf.b);
% l+ Y5 z' T# h printf("count is %d\n", buf.packet_cout);
( a9 d& A6 _: g2 }5 P4 m; d8 g$ s count_copy = buf.packet_cout;
, \5 Y _5 U& u# r5 ^7 W- }! D }
) h7 e4 l. A/ _1 Z4 D' h$ E6 H8 R& s else) A S* R1 Q6 D; o
{: a6 c- h$ p; M, z- D
printf("No effective message!");
( s. R' R5 H& z. Q; k% } n3 m }
' `; i/ h% V5 L# {( Q J9 R}4 v, R& R9 r9 y$ }
9 c I; H* \6 p- u' f' G$ N
9 T& _4 L& x5 Z" P( D7 }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. K9 D) F' a1 J使用下面代码,对内存使用了mmap函数后:
" [) P" W$ u+ e#include <stdio.h>; E5 E+ A; ]9 ?# K& ]8 q' t
#include <unistd.h>
" o7 _+ M7 q0 \#include <sys/mman.h>
r V* \& o5 ^5 K) y#include <sys/types.h>
: h& S# f9 f' R- u#include <fcntl.h>
) J+ F3 o V. a' Y! P; M
% Q5 |$ C5 T6 E3 X+ j: w: E3 d#define SHAER_RAM_BASE_ADDR (0x80000000)' j$ B7 R) U" p& W7 T9 Q- Q: f
#define SHAER_RAM_SIZE (0x20000) ! s% n+ `7 U5 `- @, Y' I; g
2 _ h; Z: V" R( n, g) x
typedef struct
# _% i z- a/ z# v7 O6 o" o. f{: i. ^/ M8 Z: i3 B
unsigned int a;
5 c# {+ s; Y& @! L$ i unsigned int b;5 X! c& Q* k1 _' D& e, ~
unsigned int packet_cout;
3 Y7 D+ r% K& j3 d# E9 Q$ a. L7 ?" n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; B. Z/ R% n& ]! E i
: P+ |3 F: `) v6 X$ K1 kvoid read_MSG_buffer(int *baseaddr);
+ @9 ?3 L' N, Punsigned int count_copy = 0;4 ?0 _+ F/ w/ Y
" n/ l/ a0 T. Y% \- ^; r
int main()( T# u: ?6 j W1 h
{
3 L! A( `. ?5 f% e: n4 q int fd;
+ Z: y' y- U: a int *mem = NULL;
: o0 u0 V k( g( K) L+ b
- `) @' q% J1 A if((fd = open("/dev/mem", O_RDWR)) <0)
) Y! U, [4 p( r t E" | {+ h0 k% q3 g, l, C, |
perror("open error");9 k" V2 h* A1 q
return -1;' q- M# N5 Z( g( c9 n" ?
} n9 \, c/ }8 R
& D8 R( ~( X+ ~# m/ X mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 j+ N3 D7 E- ?8 H4 j, G- B4 m: e, O& Z* Q- E
while(1)
4 K& r9 O L0 z, W/ q {
; m7 N) h0 Z/ z read_MSG_buffer(mem);8 r/ P% m& l7 R0 d- I" s9 h
} : q4 V: k) J) r3 m4 }8 v5 q. o6 |
}
' ~* C% ^. p3 c0 f) }; w% G M I7 @# q1 Z, s3 H. p
void read_MSG_buffer(int *baseaddr)" C/ e& U& C, {" T
{1 g( P2 e( p) e
pRX_MSG_PROTOCOL pshreRAM = NULL;2 n% f v8 a$ s7 y5 @# N( I
( t# }0 a( o$ w0 H {5 d4 i) e, U/ p
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ~ p5 s9 b: n' y# H
2 T! U2 H" _7 ~% G- Y6 [
if(pshreRAM->packet_cout != count_copy): m* e: R- {* v
{
4 M/ d) G! v$ h% H printf("a is %d\n", pshreRAM->a);
2 H0 X' v, m3 ]* w% R printf("b is %d\n", pshreRAM->b);8 ^3 ^2 |+ M' J* U& ?* G3 b
printf("count is %d\n", pshreRAM->packet_cout);
$ n" y0 `* W4 _& T" q% f5 d$ b count_copy = pshreRAM->packet_cout;
" ~! j8 h8 R" f- c7 ^5 l- a }
# A7 [3 _. B5 }6 S7 C else
% R* F p! i2 \" R* S0 p. X {
% x' o4 {0 s2 e$ s# `; A printf("No effective message!\n");
7 w+ e ?- ~, Y( _' m! r+ g }& S7 q" @, m- z, ~; Y2 y
}
8 i5 s# q: z3 T' |& d' ^& h3 t, {+ M* O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 k2 o, D' s& b q4 X6 o
! Q6 \! T0 y# f
1 e& d$ n3 i; y z( l3 c6 k7 p v7 q7 B) {
9 w9 e$ o1 i9 r) L$ A) J8 |* M |
|