|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % ]/ H2 r- } p6 O* E6 K
. S' ?. M0 e& |( K0 q x6 L0 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ Z4 d' R* |/ q* z& z) {5 E
#include <unistd.h>
4 ^: r3 n5 @; i3 B! o6 r- X. J6 ^3 M# \#include <sys/mman.h>4 r4 A- ]( ~( A4 r5 ?) M% C: e
#include <sys/types.h>
" r7 a# c, O8 [4 h5 i. S' V( P& ]6 q#include <fcntl.h>
; I; `! J7 u; R' q! t+ ?& N+ k- l" q9 A2 q8 [& C4 j `
#define SHAER_RAM_BASE_ADDR (0x80000000)
, W; ^: f7 t6 q1 r. W6 P% y' q+ C K" `
typedef struct
; }) v4 u0 \' a) p5 X! S# V. d{5 I" `' Y2 T* }) n( k a, X5 ? Q; x
unsigned int a;
% e' F' x: a+ u# I3 u3 N: j unsigned int b;8 @1 _; ?- }+ l: D' V
unsigned int packet_cout;
, P* p- {6 N1 X1 i: u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' o* o6 K7 a' P! a6 J. }* k6 o
" s& Y: s& u% A5 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# t" c3 m- [) n5 \+ J
unsigned int count_copy = 0;
0 v. s, H' [& X; g$ x, i0 g( s3 z
' ~, \: h# B# B* l8 r L c& v6 W0 U7 Q/ V+ [
int main()
" z- ~( v- j. b/ e5 U6 R/ S{9 N m, q; a4 O* U
pRX_MSG_PROTOCOL pshreRAM = NULL;3 Z5 C. ]2 `2 x% b/ [0 b( J9 m: H0 M6 W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 T7 T @( d- I" ] c4 X
$ n0 y6 f( z& ~/ ^+ y while(1)
" B; w* @4 e( p4 F+ s- R' ~ {
, c/ a$ {5 O& |0 X& W read_MSG_buffer(pshreRAM);1 {: @( p8 g9 {
} " @ g4 D( I& M6 t
}% l% c+ k# y! \
" k( z; n4 r: F. `0 ]' Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 p/ ^0 @, m/ v7 c) d4 Y, h
{
1 q; S* m2 |6 j3 @ RX_MSG_PROTOCOL buf;' _/ g6 n0 a0 N2 D& T
/ M, s0 \& L3 Y4 O: | buf.a = pshreRAM->a;1 `; o2 j9 z$ \7 O* @+ B
buf.b = pshreRAM->b;# ]3 f2 C6 F3 X3 V
buf.packet_cout = pshreRAM->packet_cout;
3 ^- a* @2 C9 F( D9 ^
* P U; \/ f4 x if(buf.packet_cout != count_copy)+ m, G. k3 y2 I1 z5 ?
{- z- _. y% i& O" k M1 \; i3 D: t
printf("a is %d\n", buf.a); ?7 P- k# J: l' m9 C
printf("b is %d\n", buf.b);
' ~$ R! \3 m: \' ^% ^ printf("count is %d\n", buf.packet_cout);8 `2 d! T, n v. f
count_copy = buf.packet_cout;- `" P# O W. |( Z- o
}4 [" Z0 x+ m2 I9 e
else9 u! x( T" R- \+ S; `
{. ^, t( G7 P! y% ~0 O' H' ?
printf("No effective message!");5 u H+ Y+ F- S. C$ ~ n5 q
}
. d+ t% c0 D0 h% f/ O}4 l6 R0 X8 P4 a( _3 ~8 {) F' \( b
$ C: C6 y- Z5 F4 |" Y+ X; B
* q7 O" o+ U) T# ~- B9 Y8 G& [ v& }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 G: V n- p$ K: k- i
使用下面代码,对内存使用了mmap函数后:& b8 a, Y7 {# W) [ o- Q
#include <stdio.h>
- O3 {. O4 e* L; ~* D/ D#include <unistd.h>& \; S% z5 Y+ h: H# N- s) B
#include <sys/mman.h>
2 n+ f: m5 h# Y" E2 T#include <sys/types.h>
% L# o0 R( {" y. z0 x X, s#include <fcntl.h>+ j* [/ \; N- f
2 S; y% a" I4 N#define SHAER_RAM_BASE_ADDR (0x80000000)$ ~8 L, o% f) V/ b$ ?; X
#define SHAER_RAM_SIZE (0x20000)
/ R2 k$ V4 d: H5 T6 H5 E; e, w5 Z# K& W1 u& c& L
typedef struct
! d1 Z- o) c: H% w0 H{: J2 G" Z/ @5 y; @+ u, M4 [
unsigned int a;
: S$ D4 u0 g5 A- C5 u% { unsigned int b;
& ~! d, z; B9 z# ? unsigned int packet_cout;& {2 l1 `! L% ^, i) f9 F Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" w0 u( n$ W) l; |
' M" Y, R; y. Y7 |* Ivoid read_MSG_buffer(int *baseaddr);
) O1 R" m7 b. i8 Z0 n: T& munsigned int count_copy = 0;
8 J" W/ O1 ]/ [8 s
$ g( T6 T3 q1 u# B$ Nint main()
9 s" z: `$ p1 h4 r3 I8 r5 z{
3 p. A% J& j* _9 r) B. b int fd;/ Z4 g5 \6 z, x7 X8 O. b0 ]6 [; i
int *mem = NULL;0 l" U' p: Y% {3 _" ?
! B) e! {* [- b G
if((fd = open("/dev/mem", O_RDWR)) <0)) t# i" [" |* H/ `
{
) a3 p: p$ k5 f d; E3 ?1 c; J J1 P perror("open error");
0 u; o' ?" c* H: m9 m. |2 h6 C3 { return -1;
% b! o, \; I- u$ y/ C, u; l3 ~+ b }: S5 }0 ]0 ]7 l5 f) I
/ H1 [% u; u) F, d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" X! j# i+ T2 s6 A
1 |( m! U7 F0 \% ` G: l2 | while(1)7 [. A, r+ @; k- r1 a" F; e
{
" B2 ?; R# O" t/ u7 o5 ?6 J read_MSG_buffer(mem);
2 b, o3 W2 t4 [3 Z }
) i0 Q* r" j* U9 `}$ f; j+ x4 E8 n, x
. f3 M: l1 f- W, B
void read_MSG_buffer(int *baseaddr)
- \- z1 |$ l% p; p{
! B3 Q s6 U% N: O pRX_MSG_PROTOCOL pshreRAM = NULL;
, G" K! Q4 X5 l: z* T
1 a ?& T. l! J. E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 L% E' y& m6 q: d% V: J! c
6 q! ~# R# [3 q% ~ if(pshreRAM->packet_cout != count_copy)
h9 x" A' G4 F( F& @7 a {
. [3 }& b* V h) Z5 Q printf("a is %d\n", pshreRAM->a);
. [; }: ^% O; P; B+ |0 d* @8 @ printf("b is %d\n", pshreRAM->b);4 ]1 b8 v8 N! W6 q# y! n
printf("count is %d\n", pshreRAM->packet_cout);
, |: S# Y, S$ c* D" M count_copy = pshreRAM->packet_cout;
, i9 @" y( e. Y7 ?( ~( s }3 ]* n7 }$ W- {$ y3 U. b7 I
else
( _0 t; x$ `" r2 j# V {
, p' e- R+ K" B5 H9 H' K2 \ printf("No effective message!\n");
* R! g3 W5 h/ I: i4 B }* E9 m; d7 s/ y
}
" _' L F- s3 A/ c! f( S5 b; X( z6 `4 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* }. o* V0 x. C$ ~
) B6 C5 E. R7 r" [: D- J! I& e# ^7 `- K
e: m: f7 m# Y1 S1 N, K/ c, o/ I/ X
|
|