|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : d+ f1 e( I6 i) \0 ~/ e
' e9 R: D: ^0 O4 |5 G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 v" F4 u" Q- p# \- t
#include <unistd.h>
# Y3 O" j1 r, M" O& d8 @/ Y0 v- \- N6 g#include <sys/mman.h>
1 J. b) j" l/ O# c* A#include <sys/types.h>& x& t: {1 ?5 ?) \
#include <fcntl.h>
+ L; ?2 `* A) o$ ]: h7 |
3 F5 D* d7 V' ~1 z- d3 K7 H# _#define SHAER_RAM_BASE_ADDR (0x80000000)
3 N9 i9 [0 e* e* p" A$ E' x& ~& E$ H, M
typedef struct
- b- e+ c0 r1 `! n{ A6 ^- L, U6 O( n3 b% z
unsigned int a;+ O1 c6 M; B/ m5 @8 N
unsigned int b;3 l+ S8 p1 }6 ? i
unsigned int packet_cout;. R5 Z; P K! ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: }' X" b* {, }+ R
: s2 C( x# I! L8 k& V6 c Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 U; A* S o8 u7 w1 a5 }unsigned int count_copy = 0;0 {& |; F- G" Q& w# O! b& @5 v( s% U
- T: D5 H M; j+ z2 a( g
1 W8 V$ O" N4 A. e
int main()
% B5 t, x- \ u# o) l/ Z{
! ?( g! o. n! E pRX_MSG_PROTOCOL pshreRAM = NULL; J1 p/ V. N/ d$ B, Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 n* e9 p) N/ M6 ^8 v/ t
3 c& k6 ]5 b$ Z; l9 s7 f" t while(1)
) r: V3 O2 ~9 r/ @3 n# H& w0 ]" k {9 K) {% J1 q* _1 L0 p
read_MSG_buffer(pshreRAM);
5 V& f* I5 m0 W$ W4 X } 7 m3 t, M0 j5 m# o
}9 u0 [4 _- Y: W: V6 F
2 a) m! v/ N9 k3 h1 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' l& p9 R+ G4 j: L- m3 B
{3 `2 ~% y' A8 [0 ?
RX_MSG_PROTOCOL buf;
6 Y+ ^2 {* j, Q; ^
, d/ v! j- x, B- P9 r! O2 W# O0 W' U buf.a = pshreRAM->a;+ {2 y. d8 a" u$ d- Y
buf.b = pshreRAM->b;/ t$ j$ q7 @1 ^
buf.packet_cout = pshreRAM->packet_cout;6 D7 `* l( t: e
5 Z: u1 I: K# W% ]) L. I: C7 @
if(buf.packet_cout != count_copy)) x: N) \4 ^, p- ~$ B
{
' |4 M& l# B+ c, P, ]% P printf("a is %d\n", buf.a);
1 C! @) b# q0 p- O0 |# F+ @ printf("b is %d\n", buf.b);
: Z. c4 J6 G) T7 y" Z& k printf("count is %d\n", buf.packet_cout);! ]& M/ K! x) C6 i9 Y! S
count_copy = buf.packet_cout;
- |+ j" |3 T3 n( B4 ~# c, X7 ~! I0 b }/ o9 `' I3 O1 ^8 N+ r. y. _& b
else7 P+ K; m4 K* H" y# B& G
{
7 {+ \( E2 a3 q1 g+ S* Z0 E printf("No effective message!");
4 [! j' S% B6 z5 T9 v. ] }
. a8 t! W# k; d! q1 |9 U! o}% N6 N Q o# t- R4 H0 e8 n
e) \) E' v+ c" T( o! v
( R9 c$ z$ o3 b' W# z7 R7 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ p4 s1 k0 c0 H& Z
使用下面代码,对内存使用了mmap函数后:
- s1 z% }0 V3 f2 f#include <stdio.h>) S1 K" b9 U* \0 w% N
#include <unistd.h>
+ M) e+ O' S- u5 a5 I#include <sys/mman.h>
$ e9 G# K$ x- i& W% Y+ T* n#include <sys/types.h>6 n+ t( I- x' F4 T0 @0 Z
#include <fcntl.h>
! g9 C/ c2 T t4 o9 E# g
$ J5 d9 m9 Q$ o$ R3 _' _ a#define SHAER_RAM_BASE_ADDR (0x80000000)' F* D+ J0 g* }$ G' K5 t7 g
#define SHAER_RAM_SIZE (0x20000)
0 C$ }& k, t2 }% i: O% ~& r4 O7 ]3 d3 ], M
typedef struct
: d' d Z; H2 A0 }{5 b9 Z$ B* a @. r) r. S/ ?+ X
unsigned int a;
$ X5 M+ W/ k) }" w unsigned int b;
- f; R U. z6 h P4 b3 n! E unsigned int packet_cout;
- e6 v, ~% |' o7 l" ^+ g- F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 v$ G% s( v& S& ^: g; `5 d
9 r9 S! m& w/ tvoid read_MSG_buffer(int *baseaddr);
: {% n( t, T; `unsigned int count_copy = 0;
3 o. G9 Q* |# k; o' w
& _9 E* V& X; `6 W# B4 I/ dint main()
- D: ~* R9 q+ E" \$ y3 ^{
) b. i/ A' E, }- ` int fd;0 R7 c( z3 c* A! Y' p7 \
int *mem = NULL;7 ?. [# q, ^2 E5 v
( }' l/ `4 U, ` if((fd = open("/dev/mem", O_RDWR)) <0)
4 y2 [& } N5 l {) F0 ?# z! Y+ L# e9 G7 u
perror("open error");
: \# V0 L; u9 p1 _+ ?7 a return -1;
4 ?, S* k( a# \% j$ } }3 ~; n0 M* @, W5 q( O3 V
# {, a. J% Z% D- s4 O4 y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ T4 u; {% B9 L2 d! R3 u
7 O) T0 r* N+ G$ `( i: v: V* L while(1)9 Y/ f- Z5 F! w# t% Y6 u& L- q
{
. I& w2 r% y" S) u read_MSG_buffer(mem);) `* u$ { w) d. O" b. `
}
0 C1 s \& k( n}
- B8 A" b( A* X( Z; j- `0 a Z7 @4 J* O. J) z
void read_MSG_buffer(int *baseaddr)
' w0 @( u0 `) u( z{
( D9 S8 }5 B) P% N* k4 M pRX_MSG_PROTOCOL pshreRAM = NULL;
- f( h' N* l+ ]3 f! D
% G8 Z+ s3 c8 U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# L" R5 N+ B5 `+ _1 l
" Q5 _: h% Y4 G' K3 G6 F) F0 e if(pshreRAM->packet_cout != count_copy)
% C4 ]6 S0 y) b$ s x+ p, i {
7 ~, `, c: [% f$ H# M& | printf("a is %d\n", pshreRAM->a);
, _2 p/ F/ _. A g printf("b is %d\n", pshreRAM->b);4 ^' r3 l3 u( O: n3 x3 u5 Q6 r2 |/ m
printf("count is %d\n", pshreRAM->packet_cout);
- t# R! { _' g6 O7 t( C count_copy = pshreRAM->packet_cout;( i4 r7 X! o' L: T
}9 b+ ^' _! l' | t' L9 }
else
( v1 e ^; I; u$ ^+ i, O( \4 A {1 W# c1 {2 M$ q7 d0 p; u7 n
printf("No effective message!\n");! X) s% ?; { Q0 l
}
% r; M& q; |0 [; n0 g}
1 [1 ^$ X" }* S5 Y7 n/ Z) x0 w) D: x8 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" F6 |' i g$ @5 u% V
g; L C6 ^ j
6 \4 j/ |) `' T& B' n& R: {5 N. X# Q- @% I( @) G! n
4 ^# r. K) U( _4 k |
|