|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 i/ P c' _: q4 P( w' v- Y) D" r O% `# s9 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 z/ E7 ?! p' h9 z#include <unistd.h>
7 {* |3 w8 y1 b1 }3 E+ B#include <sys/mman.h>' U3 Y r8 s7 B O" W: ~
#include <sys/types.h>, x6 G$ w2 y! _& V/ K% N& ^/ }: ?
#include <fcntl.h>
' E6 B0 p' {# s5 g
* T* y, L4 _+ q$ T5 F3 W4 e: U" E! z#define SHAER_RAM_BASE_ADDR (0x80000000)
' y3 n& o6 h( Y+ R$ f7 [. V* U" Q, J m3 w
typedef struct3 U( V9 ~* Y7 _; \
{) j+ Q- U2 {( I7 s) J$ z2 A
unsigned int a;
' d' X: c/ ^$ k1 U: B unsigned int b;! Z: t% v* ^0 z
unsigned int packet_cout;
- b8 }+ \% V- _ _3 ^. k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 V% w: n8 `' a& l. _5 s) C
" v w- |4 C& |* L% J" m" j( B6 a" Z1 j+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' O8 e. d8 S1 E: h4 M% e
unsigned int count_copy = 0;
! T. z. M4 X1 P( N7 W- Q0 S9 b: ~! K3 t* v6 ~- E# W
% m$ f- B2 H. j; p: j
int main()
/ I; d7 D( E: W5 }& l, j# V{) o/ A4 q) G) _. ^3 L! D
pRX_MSG_PROTOCOL pshreRAM = NULL;
# Y6 J. s4 ^8 k8 U8 a" B pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# g D# d# x5 ]4 J6 o8 P; s' ?1 v1 u% Z, C& k5 ]
while(1): O6 \7 r, X+ E/ f
{. N8 j b; b1 I: m9 Y" L% ]! u
read_MSG_buffer(pshreRAM);7 P# i6 x1 i0 I* U
}
2 r+ ^4 O& }2 J% _) c}
; V# Q) `3 X. _* {1 ?3 s4 B- X7 u* T1 _3 j! v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 v# v3 [% d" P) p) V5 ?' B& R{& } O% t3 f5 y& {1 _
RX_MSG_PROTOCOL buf; M( I. X3 z( w6 ]
z% \0 l( e- a" P
buf.a = pshreRAM->a;
, v( Q3 Q! w4 P0 x; }) |; d& `9 C/ i. ^ buf.b = pshreRAM->b;
5 E% f' d2 x( J8 [( V; | buf.packet_cout = pshreRAM->packet_cout;& \4 S; J4 u6 I' P. A
+ S! v1 Z% @0 ]* e7 X G& j
if(buf.packet_cout != count_copy)
0 X N8 q8 U7 d3 ?& [ {: q# f- \2 w2 J# k
printf("a is %d\n", buf.a);- x+ ?) W' z( b5 V& \: q7 N
printf("b is %d\n", buf.b);
; W6 t# c6 S. D; I t printf("count is %d\n", buf.packet_cout);
8 k, q; u2 F+ x4 n count_copy = buf.packet_cout;. z4 D5 K& A5 K/ j% g
}6 E& `) q. D, d+ u+ L' [
else: e+ h1 {4 w" Y1 C5 N
{" |# G! S* k: N
printf("No effective message!");
5 T, u9 R: L: V/ p! x4 _ }* o: Y+ C2 k1 |' G% f
}6 N+ o+ w( Z0 G: u
1 y/ ]* q6 f. y
+ X8 p, e' n5 t7 l0 T% L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 t( p" `3 e3 [0 Z
使用下面代码,对内存使用了mmap函数后:' O! c5 [# z. M7 ^( n3 {% [ x
#include <stdio.h>1 P! V) M4 U, }9 \
#include <unistd.h>
) ?5 L; b& k3 g# |+ Q* F5 r#include <sys/mman.h>
0 y# a. v! W( b/ x: ]0 E#include <sys/types.h>0 j- l- O$ a7 X/ [' Y7 Y+ V, ~3 r" T/ E
#include <fcntl.h>
; @: T! h* c$ d* b7 W. }
2 n- @- @- k, Q: u6 w) s, A#define SHAER_RAM_BASE_ADDR (0x80000000)
7 }7 g% l7 y. C; H! C& H#define SHAER_RAM_SIZE (0x20000) ( L( S0 q/ A- t' Z6 E% t; z6 s2 y
# _4 g E" w) @& ?% Z6 c+ Mtypedef struct
0 k4 J( h t2 E" R{
" G, I: E0 Q Q' W& O) d, S0 O unsigned int a;
+ {& C9 r8 m% t' f# L' q unsigned int b;) D4 @. k7 k0 O
unsigned int packet_cout;
, Z6 f3 w1 `- j- I! m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 r% _. f9 c4 q* Q/ ?; w4 x
1 r8 [# p+ w) P, s- Yvoid read_MSG_buffer(int *baseaddr);6 X: x, F9 r; b1 z5 N
unsigned int count_copy = 0;
$ g$ n: d# A/ p5 s2 }) e
0 f- h9 w; P' l9 u) Y6 Rint main()
. ]* H& o4 K+ E8 s: Q5 `% ]( W: k{
, x# _, |+ x! a; ^ int fd;
6 c; Y8 b6 T' M+ l# r int *mem = NULL;: s6 c* ]* y$ W
+ B1 u A# k2 Y5 @
if((fd = open("/dev/mem", O_RDWR)) <0)6 s4 m- O5 y# B g( m& \0 I% m6 B
{
2 I1 B+ o4 B! C: V1 O& e perror("open error");
& Y, p; B! P) k) _# @! s. @9 Q return -1;
8 }1 L }& o% U/ H0 j, S: N }
: P+ V) f* Y% m8 v+ O 3 @5 A# H- T: c7 ~- i ?# X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 X# ^# S: R# v7 o# Z* Y
" f( p/ K) ] t9 m, c2 N% a- l' X
while(1)
! h: D7 X+ }. q- } {' ]- E9 ^! d* b; ^; ]
read_MSG_buffer(mem);; I5 J9 h, Q9 c/ a: f
}
* p" X1 ^. a0 z9 L8 O}
% ]- k$ }% S8 `( M. ]3 N" W& T. G2 C# Y; r
void read_MSG_buffer(int *baseaddr)
3 f! u/ p! ?1 f# B# o% u{5 E- q b+ K0 p9 n8 d7 g$ q
pRX_MSG_PROTOCOL pshreRAM = NULL;
# V' X- o! f7 [; h; k2 {8 b4 Z
$ P* R& Z; E& Q, i1 f pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# L# X O- m" a" A4 q6 G( T5 t
- x+ B ]2 O9 Q' K+ T5 C9 c) n- z: W8 c
if(pshreRAM->packet_cout != count_copy)( l# i* p8 y7 |- x( R* v8 H \8 R
{/ G3 Y$ m$ K' P+ o. g* X
printf("a is %d\n", pshreRAM->a);8 R( f* r1 [4 A6 [- w3 G
printf("b is %d\n", pshreRAM->b);- [8 N; X' C' \' y% x- l! L5 J4 k* I. G
printf("count is %d\n", pshreRAM->packet_cout);& e. n8 Y, a' T0 \9 o8 ^ p
count_copy = pshreRAM->packet_cout;; Q& [ Z" v* |5 {2 v
}
# C" B: `4 U9 b" B# g+ b else
& T( j) [& T9 v) y/ P' b9 p' K { k6 b9 P, o- m6 {" ] A9 u1 m
printf("No effective message!\n");
8 m4 x. g h1 A2 t* A1 A4 ^ }
5 Q7 w* G9 Q v}2 C5 q5 S; v! i1 v; m1 R
$ I; p/ K; d3 u! \; ~4 z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, |9 S2 L7 J0 `0 I2 @* A. H' t& B
+ y% C' P3 y* O8 N$ P5 B( ^/ M
. K' d0 x/ i+ \- b7 \
) X e0 B. C% s5 u. T7 ?( R. U& Z9 s7 k
|
|