|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 N+ q0 i4 I+ q# T$ A( c
- {5 G- l3 h! _( r, K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' d$ W; e1 \) c0 a b! [: d#include <unistd.h>4 [# {, o% {0 v0 V8 T
#include <sys/mman.h>+ _3 x# S) }+ c& l( V
#include <sys/types.h>
1 D: z. Y( O; Q9 ?' F& i* W#include <fcntl.h>% ?* T2 r# O2 b* @7 ~
" J! c; \' `. q* I* b" I8 l#define SHAER_RAM_BASE_ADDR (0x80000000) 1 a0 x7 F% R- |, B7 g
; p$ T2 u+ M+ u: Otypedef struct3 p0 w; g8 t* R5 o
{
, a! d6 u! z( Y" A, n unsigned int a;
! n- _' @" _+ o& ?/ u unsigned int b;0 V; V5 z2 Y: `7 N; k
unsigned int packet_cout;5 Z* C/ a# \" i* Z; g1 `& t. s$ X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) W/ y4 F4 B9 }5 N. V4 w9 w5 a% t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- G4 ^) Q/ z# | x. y" Q" R# h: x
unsigned int count_copy = 0;
4 a) R8 I/ N0 p$ r' W! u
% C0 A. I6 I' B1 X/ Q8 u3 p
) \5 w l5 ]4 F0 f( U, ?2 K. Kint main()
: ~3 j& `$ C& M2 o{$ x5 l0 E+ E8 g4 _
pRX_MSG_PROTOCOL pshreRAM = NULL;, w" t7 M6 ?) f! u5 a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q0 { U C. D( a; P6 w# S" P* ~+ l
while(1)* _" t! k" g6 a ? V% Z; V6 g& Z
{' ^2 `* V* J. n
read_MSG_buffer(pshreRAM);. r1 b5 U0 X4 {
}
% ]9 F8 @+ n. ^2 z& G* @}
3 O1 \2 S/ Y5 [ V2 c; o9 Y8 R* K: m* I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' ~7 t. p: j( ]: H5 m' U
{: e* v M0 \/ t- W
RX_MSG_PROTOCOL buf;
* _! e0 w1 M% B$ K" f4 J
+ f& E$ u. Q" w" F buf.a = pshreRAM->a;& @8 {& w4 K0 N6 N5 ], L
buf.b = pshreRAM->b;. @$ p. ? i/ w
buf.packet_cout = pshreRAM->packet_cout;
: s; Q. t6 K" _, }* p ; Q+ D- P' v' p) }% i2 y5 F. @
if(buf.packet_cout != count_copy)
3 H$ r& ~& a" h: a3 k) T {
( S: u' s0 x; l ~' ^ printf("a is %d\n", buf.a);
, N" P' |7 n2 _; b printf("b is %d\n", buf.b);
- F( e/ M* \ n) x* H2 ^! _2 y printf("count is %d\n", buf.packet_cout);
# a3 d I" A( C0 q6 C3 ?; U count_copy = buf.packet_cout;
4 l6 ^' X$ d j8 c, |- k }8 C2 u9 T( l, W, M
else- k+ n- S6 Q3 T& n0 t" U; a
{# |- w* X2 J# A% l# g
printf("No effective message!");
& h5 Q1 r; Y/ J& o2 Z! B5 T4 f }
' H' j9 C4 J& M& J}- H- n6 I5 X8 g' @3 C5 ^
! c2 O: L; e5 m8 O% ^- i5 p: k/ i/ s# k. N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 Z8 v: P7 a+ x, Q, `; C2 W使用下面代码,对内存使用了mmap函数后:5 e. G. A0 W# P) Z5 i
#include <stdio.h>5 l$ X8 `& Z4 ?: P; Q% j0 q( D5 m) c
#include <unistd.h>0 j5 ?- L0 {3 \" w. d/ I
#include <sys/mman.h>
. U% f9 x; s" `" X- _) P+ s#include <sys/types.h>8 a2 ?2 G7 }: r' P# H* G; C. n# A4 S+ d
#include <fcntl.h>
6 R5 y8 V- ^! r
9 `# S) }5 y1 G" A1 w6 w2 g#define SHAER_RAM_BASE_ADDR (0x80000000)
& J+ e. h5 t0 E+ X$ w#define SHAER_RAM_SIZE (0x20000)
- d/ w- k- ]9 `* n/ I
/ c" R, i9 m" ~$ etypedef struct( m$ P: W! r! k, a
{
! A$ d8 r. ?9 x unsigned int a;
" x0 Y. O3 h5 a' l+ a. l unsigned int b;
7 \, K) h* ~' v* F2 e9 G& K unsigned int packet_cout;% p3 c/ t# q% J9 X: o% L+ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 n- N+ o, f9 ]
/ S' S8 E; Y( M1 Svoid read_MSG_buffer(int *baseaddr);
( q9 y4 A6 w- i1 Z6 _unsigned int count_copy = 0;
! E1 q: {; t" p7 Q% `' p% m. p; X% `- ^- \6 i7 B6 q# k
int main()
5 T! `8 P. n. J8 y, r; Z{
+ D. f+ B: z0 D& f int fd;! V ?' A V9 D& [; K# g
int *mem = NULL;
) c# X5 z8 e" \0 `( e3 ?' j0 ?" f' e- p4 X3 t) z
if((fd = open("/dev/mem", O_RDWR)) <0)# ~) X# S# X# x9 x. S' ?
{
# D5 Q# i" y+ L' L: l, w perror("open error");
* s1 W# z) v1 b% q7 r return -1;1 F5 y! ]7 d7 G" |% v s
}
8 D" |2 J# b& x( ~" u. h ; I" b; t! S/ v; m1 l* U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& j/ ~6 }4 o- r3 f4 {! H7 `2 U+ l
while(1)+ H0 t/ N. L& \) G# F ?% e
{
0 o1 O/ k3 u4 n' |$ h8 Y2 c+ g read_MSG_buffer(mem);
$ l, w& @: e- A$ G }
7 a# r4 z" C- X4 {9 f D- i y- q( a}2 [9 s9 W: X, C& I2 v( Y; I
$ |: T% b7 ], Svoid read_MSG_buffer(int *baseaddr)
( f! F( C& N3 S% p ^1 ?{0 Y9 d+ o& b" P! h
pRX_MSG_PROTOCOL pshreRAM = NULL;- l, H2 h# y7 s+ H! w& j$ v
( r7 X: B' `$ l4 W* _* w pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: X* X3 b/ O( R& G6 O+ T: _* B3 f9 b/ G- H8 j
if(pshreRAM->packet_cout != count_copy)2 t8 g% g/ p# t* q4 @; ~
{
! R) x. P- V6 a* K- n, Q printf("a is %d\n", pshreRAM->a);+ h. d& `( H0 m# ^0 y i" g8 h
printf("b is %d\n", pshreRAM->b);
. B# h7 C5 M' d: S# o2 s3 K. u printf("count is %d\n", pshreRAM->packet_cout);8 N- G8 D. H( @! E5 _. i! a
count_copy = pshreRAM->packet_cout;
( k6 `+ L/ K! b" m }
1 ?" X9 p# ^3 B7 J else: Z2 T1 x: _0 u8 E% T& {
{
: t2 N: j, ]/ | printf("No effective message!\n");( M# i' z O6 A+ L
}. Y) Z0 |" ^6 X2 ?: I/ ~
}9 R2 M- e* e) E% R. y2 B& _
# B% t4 u |9 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 l' l! a6 |% p
: G, |; u' E& H; M% {
3 g" M5 X% c8 s& M# J+ Q9 L$ C9 O0 ]/ D. _2 Z# s9 I+ b
/ D, Y. ^) W- e/ O8 p |
|