|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 c) {4 {& g+ N9 L5 r7 a. W* b1 j
" e8 K* ^. |6 R) d5 ^/ C! F( E& u9 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 A# Z$ g% f, {" [- |#include <unistd.h>6 a* Y. u# D% _! g- }0 Q: \
#include <sys/mman.h>6 ^2 a1 h. O( X% r
#include <sys/types.h>
3 d* P4 {% q, Y#include <fcntl.h>! @; Y2 } F) d" | {9 o
/ l. {& y6 z& D8 J) ~3 z
#define SHAER_RAM_BASE_ADDR (0x80000000) " G2 A( ]5 D' I* s; D# D; E
* B: B% X2 p- j% I" p Q, z
typedef struct
B) G+ O2 C: h/ P- l2 F2 `{) \# s( Y/ ^* l2 {+ {/ p+ S
unsigned int a;
! v1 O$ U; Z: H; H6 U unsigned int b;
5 n$ h. h. [9 h# l8 w9 K9 j, |1 S unsigned int packet_cout;
5 C" x( E# v; D" f% _! Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 x+ N( g) C/ L! u- P
, k" Q! n2 b3 ]) @* cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; K$ S+ e, U& {( r3 J& N
unsigned int count_copy = 0;( _3 C& h9 L6 z- ? p' ~) E
' h( N. F) K7 y7 E0 k! Q9 A4 h5 L; `3 T2 ]
int main()
9 Z, [7 x$ h! B4 v# v{
l2 |+ s+ X' {8 I" e( j: b pRX_MSG_PROTOCOL pshreRAM = NULL;
+ C; @ Z& H6 D f pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: x) g7 O) O9 V: H( v# i1 t, Z9 E& |6 w: G
while(1)
/ `: k# ]& h- |+ a5 ` {
: G( {/ `8 y y# O/ E+ x5 U4 A( h read_MSG_buffer(pshreRAM);
) w/ D6 v9 H7 ^2 x } 5 W% h" E& s/ y- [
}
2 f3 D$ v% C/ [5 u3 a6 I/ E7 t' `, ^0 E2 C0 ?' K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), N' |. p0 P9 K9 n7 S' S# `
{
& S; a; r* F" k6 a, C& H: a RX_MSG_PROTOCOL buf;- p8 R0 }$ X! D7 B. b
9 l5 a4 Y1 U" @$ X0 k: ^. s buf.a = pshreRAM->a;
* ?. O$ }9 s& ~9 g4 K5 ` buf.b = pshreRAM->b;
1 D# {! P# {) O O buf.packet_cout = pshreRAM->packet_cout;
% K( a8 Z3 _3 \# j Z. [: f$ q! E
* J) o4 l+ A. _+ z5 \ if(buf.packet_cout != count_copy). m. l" f. b$ W: B6 U
{
% W7 o! N0 F2 c5 c* p0 x printf("a is %d\n", buf.a);2 F4 ^' z9 g; ]1 s6 v }
printf("b is %d\n", buf.b);8 _1 x3 D. h. S+ M2 |& w1 j
printf("count is %d\n", buf.packet_cout);
+ v; b ?1 Y( @ count_copy = buf.packet_cout;2 D: v1 ^2 U& p) r% O
}/ |8 j9 Y; v j* { J8 l, G
else
" b9 ]' ]0 X, I" Q) x9 w! S: @ {9 h$ x) x& _. D
printf("No effective message!");6 B( D7 |4 o2 C& P% p8 y
}
7 x! j! P5 e; t0 B7 R}
. t* J: }, ^, T9 ?
$ V$ \! ] |$ d3 b' O$ R# F/ g, V0 ~ @. ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# g' c2 i! p; r# g( ?8 N
使用下面代码,对内存使用了mmap函数后:
* p- A1 a8 Q' |- r+ p1 A" u#include <stdio.h>
2 O8 n2 Q7 D7 b$ L6 ~#include <unistd.h>
$ c4 d' k9 B# Y" E#include <sys/mman.h> k- Z6 i6 D6 y# i! H4 r. Y
#include <sys/types.h>5 p/ D" L. J, h ]8 U" l
#include <fcntl.h>5 ?' W$ s0 F1 Q
7 i, S7 f* a' ?% H
#define SHAER_RAM_BASE_ADDR (0x80000000)8 {) u5 p8 v0 f# D! i# d5 y' b
#define SHAER_RAM_SIZE (0x20000) 5 H& r. q; J! E' y7 W
4 s$ S. y/ s, }; ]
typedef struct) M4 b9 E5 | ?
{; x& E4 s6 T5 M
unsigned int a;
: f! F4 Z' J/ b. x. Y+ h unsigned int b;
: y% y) v- J! M unsigned int packet_cout;
- V+ R8 ^" H D8 q& T+ B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 C6 f6 F9 R3 Z. r9 o9 _3 o
3 E+ O- \/ i9 P, d- j# avoid read_MSG_buffer(int *baseaddr);
* J& G+ z/ b/ X6 O" T2 u. X2 junsigned int count_copy = 0;
$ m. `0 |5 V& J) M+ m9 w5 x& ?7 V) u8 d( ^
int main()% c+ F$ f, D+ \% V# x5 a- M
{7 X6 N: @) d- E3 ]* x4 W
int fd;6 T7 m( z% Y, }3 @5 l, Q% ?# T
int *mem = NULL;8 p3 |/ ^! v7 L* ]/ c! I
, b2 O% f! x3 f( n" n1 O, R
if((fd = open("/dev/mem", O_RDWR)) <0)
9 w4 }# t1 N8 w2 R; O' r. Z/ I: _3 ` {: G- x; v/ {1 g% n* c
perror("open error");/ x6 ^! h( U; s8 M8 O6 x
return -1;
% W/ ]+ O0 E& |2 X: U/ W* w }
. m+ z4 A) ?" N! ^& T, q 1 g; ?2 A2 V- @" ~2 S( n( ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 }$ W( g ?/ q; }
8 t- \' ?, g; |% b$ E
while(1)
2 g. c- j: j' u4 T4 H/ T$ F; \ {
- M, ?4 ^$ T7 j) K+ G read_MSG_buffer(mem);
6 H! Q6 Y4 V- z }
) a1 A+ f( z- y( f* N- o$ j}
4 ]' ^/ V& x0 G& ]3 k- y
- o" G9 _1 U1 h. p. Ovoid read_MSG_buffer(int *baseaddr)$ N0 j( e, \8 L% A
{
1 Q; W0 P$ N. ~3 ? G O# \ pRX_MSG_PROTOCOL pshreRAM = NULL;
6 G5 Q6 k& q+ m, h2 C% d, P1 n1 C) }/ H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, [' M: r9 ^3 k0 P' g) I# @! Y+ E+ d' e/ E7 I
if(pshreRAM->packet_cout != count_copy)
8 r( m- F4 A$ o6 r4 [4 G* ] {
* @/ f" \. u0 C2 l1 U2 q printf("a is %d\n", pshreRAM->a);
2 X) b# d- w8 q1 `% n% W printf("b is %d\n", pshreRAM->b);
" L2 ]( k4 c. f; g printf("count is %d\n", pshreRAM->packet_cout);" R: g( z! ^5 O! c
count_copy = pshreRAM->packet_cout;; O% S3 v" a1 c9 |7 [$ _+ l- f
}3 L( D2 ]* L W
else( c9 c% A7 Y; H; X0 j C/ e' n& ?
{9 v& b& w. o8 O: G3 p0 J# n
printf("No effective message!\n"); `* S/ L! Z7 x/ [* Q
}
. h9 z ]2 G3 A8 i, T}9 D$ V V! @6 n3 g7 f2 X
$ Y% e( W; A; m; l P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? _2 r7 O: w" G3 x5 g
4 b5 O3 }5 i: ]9 n9 O7 i8 @6 b' M
- a2 a& e, ?6 t: O _+ j/ X o4 C7 I, q; @
( k0 i1 ]0 D. L
|
|