|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 r3 \1 R" ?$ P! ?% L
# o( g" f- E; `; I6 O$ x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 U- S- C. w" t# Y/ \4 y" f- j6 c#include <unistd.h>: t: {+ }# z* h8 T+ l) v3 t' X
#include <sys/mman.h>
g1 ?4 h% c4 ~) _#include <sys/types.h>) B7 j6 f$ O1 ]2 U; [- Y
#include <fcntl.h>" m: |+ `# w8 _* Q) d+ ~4 m. E
& }- C1 s# b9 q. \#define SHAER_RAM_BASE_ADDR (0x80000000)
! ^8 x) y0 m: J2 O8 e
; E F6 t0 v/ ttypedef struct
7 x" J. F& V! ]/ z8 q z{
9 j( R0 y+ ~+ O8 L4 l& k* q; Z% u unsigned int a;+ `5 ?; A4 k, U' t4 V
unsigned int b;1 B" A6 i0 D+ D
unsigned int packet_cout;6 F+ i% ?+ O7 m' q: A- D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# d* E- E8 p. t7 \2 B: a* l7 Q( W. W5 J' j$ y) Y$ J4 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. ?# x( q) U; O2 Z3 qunsigned int count_copy = 0;2 @- U5 p8 v: V1 F9 E
9 ^) _3 C0 q; S" I d
+ E6 K9 Q: N/ V, a8 D' fint main()
7 t% F# j4 H9 t. R! x0 ?{
4 W9 h+ Q. ]6 Q pRX_MSG_PROTOCOL pshreRAM = NULL;
. v% S8 O& s e5 c' h) s1 Z2 B3 X pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; X) R7 S: ^9 ]% ^3 C; E! ^: T
7 M5 c, T1 z. J8 b ~# h3 Q D* p while(1): X& g v; H, q( K6 A
{
9 ~6 P# ]- }, F read_MSG_buffer(pshreRAM);+ Q( C/ P3 W/ b: F+ T6 v4 S V2 ]
}
" M9 q G* V1 V' z1 s9 x- P}9 F+ h- c- r* I) b# S' ~4 Z
* q F* e5 `7 j% k- [( Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( ~) I; f1 k! h1 T9 T+ U{
7 Q5 Q& W1 C1 O9 ]& K RX_MSG_PROTOCOL buf;4 c! z% f) n' E
9 m6 A5 K4 l3 K. L- f buf.a = pshreRAM->a;
+ E- P; P* c, \2 U. f8 Z buf.b = pshreRAM->b;
. a. W: k1 x+ d3 w. F7 z3 i buf.packet_cout = pshreRAM->packet_cout;) D7 T7 j- v* K3 b
- u2 y& o% {, }1 t
if(buf.packet_cout != count_copy)6 n: g' v. x: v& G! H
{: M3 s) T3 @" Z2 d
printf("a is %d\n", buf.a);9 v, P! D2 t( h) K2 A4 a6 j/ I
printf("b is %d\n", buf.b);: M$ K, t8 y/ ?
printf("count is %d\n", buf.packet_cout);1 ^- v% P1 b5 t/ @, i
count_copy = buf.packet_cout;; V& {& `( @5 f; H7 T- X
}0 i7 c9 o+ ^, H) o
else
- S2 j( s/ N8 r- ^0 s {8 c0 Y2 ^3 r# y; y- U* b8 k5 W
printf("No effective message!");2 j2 U' O0 @4 w& ]- y4 s& h
}
; }; e+ s+ s7 S: U6 U}
, t' H W- Z9 r% ^
& {" }% H1 t$ S$ N) N' k6 D8 z" v: t$ [2 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 i( }* N; W y9 S* H! c使用下面代码,对内存使用了mmap函数后:) o. i8 u/ N: v6 I0 ~% w
#include <stdio.h>+ u) b, {6 {' T7 M# ]5 V! y1 I
#include <unistd.h>
# r J5 F' B9 D, B#include <sys/mman.h>2 i/ ?- e, U% {2 {9 U% J5 }
#include <sys/types.h>
) R5 V3 j/ c7 l% Q1 a" `+ N#include <fcntl.h>; o1 @( g1 g2 [, W+ \ c
+ b( i: Z. k7 [, [# t V#define SHAER_RAM_BASE_ADDR (0x80000000)- _7 a$ J* I$ o8 E; n3 t- \6 \
#define SHAER_RAM_SIZE (0x20000) # a7 u } n3 t
# Z& V7 _/ L% Z, c R8 \
typedef struct1 o9 z. g! Y: a, p4 ?. }* X
{
4 u, I1 S4 v5 n unsigned int a;# y+ R) w' G$ r! J, P! Q# H/ U
unsigned int b;
7 k# H1 _' f6 Y" C; `' d4 y% l: I" k unsigned int packet_cout;/ f# W- ~5 w4 e4 V+ }& s" _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 l3 X8 Y7 O5 C% I: L( S: h3 r* s0 g; a
void read_MSG_buffer(int *baseaddr);) i9 q5 z6 f4 }4 }: T- N
unsigned int count_copy = 0;
, m* T) N$ Q B- d: P1 ^- u
3 H/ |3 M5 r& tint main()- j$ B/ ^1 v* S) b3 s' M+ J' y& n" `: E
{
$ H6 |* W( @$ ^- S9 f int fd;
" t+ p7 j& X4 ]# O% o0 t* W R int *mem = NULL;
Z, v6 T. g( n8 E/ I
4 A/ Q2 c9 \, h! y7 M! I4 O. ` if((fd = open("/dev/mem", O_RDWR)) <0)
% A2 A( t* [, J3 ?; x# _! j {/ g6 h8 D+ {- b- x2 Q& Y6 N$ R3 c
perror("open error");5 d, x+ w. I& r
return -1;9 Z5 f: k/ w$ F) [7 }
}0 m1 V, x2 \& i5 K, D
( A7 `1 I2 X4 I3 v9 t! q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! g8 |1 }5 }. `, s$ d- |
2 F, c; a5 q9 c# O0 R& c
while(1)
* O; R: Z; @" p {+ f! R& F3 r& s
read_MSG_buffer(mem);
$ T" q3 s$ ~6 I# b: M2 J/ W* R }
' E( F0 Y# T" ?! s; F}
- B$ V1 s# k7 V1 k. Z# e2 M5 k, x. M9 s
void read_MSG_buffer(int *baseaddr)
/ K% d* M* @/ s! s{6 I4 L9 P0 z o+ O
pRX_MSG_PROTOCOL pshreRAM = NULL;9 S2 m# \# i, E
, F9 U# }) i3 {; Z* \( s2 |7 f
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 w8 o7 {8 j5 |/ K0 V) c2 }
5 }; e1 B5 Z, @' S" W$ h6 _
if(pshreRAM->packet_cout != count_copy)4 `5 ` {6 I* o! E1 P( p8 a
{
! F. i$ D# `3 i+ P printf("a is %d\n", pshreRAM->a);" c: H' z* M# D* A; h1 R
printf("b is %d\n", pshreRAM->b);" o/ m3 r0 l/ y; n& [: z3 m
printf("count is %d\n", pshreRAM->packet_cout);- K# _. q: h. ~! I7 @7 D4 `
count_copy = pshreRAM->packet_cout;$ A% M: Y- g! A f
}
/ {2 `0 D" g; h) x% j# Y3 O( R else
T; g: M3 G( L# o; ^9 n {2 z _* J7 y P$ y$ |$ g/ {
printf("No effective message!\n");
4 Z8 ?" [4 k" L. Q- P }
+ F) ?- e2 y! {6 @4 ]# u}- K+ x' W: V( q2 [, z0 z6 _ U
' _0 {( S! K! s |: }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
W l0 A4 ]) G. c: s
6 V4 e7 }' s: ~, m8 x p9 n; r
* U1 D7 v' r& S% [+ T3 d1 Y
: i- f/ q- n' v3 {( r( X1 ^* X/ k" H
|
|