|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , p7 [0 u% u# S! V
F! Y2 o1 M! H( t$ QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; Q, J9 h ~5 G) v" |9 R
#include <unistd.h># M8 g( ]/ N1 \0 \
#include <sys/mman.h>& P. d7 P3 r8 [' _' H+ J5 M
#include <sys/types.h>
6 Q( y6 c* v. ?8 f2 j: N8 {#include <fcntl.h>( }+ p2 Z8 s T0 H5 R3 x
" b' e" p" b$ Q#define SHAER_RAM_BASE_ADDR (0x80000000) % R; S" U3 m& O+ @+ c
4 D( ^: t- \% ?" d& ]0 J9 P
typedef struct* X& F% L/ N* {5 d% w, Q# D
{& \2 ?8 ?* e- S' Q8 U3 w
unsigned int a;
8 [6 h0 @3 r8 `& \ unsigned int b;4 f4 R8 o) c1 B7 k
unsigned int packet_cout;
% P- n% R& L+ d/ @; z& Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 l& Y& C' v2 b. E7 N$ w, k J
; p2 u5 i4 v" A) x3 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
^3 m! v; t6 c* B# q# @) Eunsigned int count_copy = 0;
, i$ _7 a3 Z- ~% v6 `/ w6 q$ w5 R& }$ Z; E) n
$ C8 j; `9 L) zint main()
9 H8 t# l$ c9 b" _2 ?+ ?{: y; j% e3 L% B: i
pRX_MSG_PROTOCOL pshreRAM = NULL;; y$ W" j2 `+ ]: w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) s- \- O' U( C$ x! ~7 ]
' ]4 c. a4 b0 [0 ]5 K1 A+ x: x' x
while(1)
0 S4 E0 o* F- k( o" S {
7 u0 y$ F( z$ S% p# g1 ?5 o! P9 r read_MSG_buffer(pshreRAM);
% H* g4 v! D* l }
$ [1 ~7 F% Q# p. x}
0 H* I w) a1 G) f0 C, t7 u7 L& k( q" r- c+ o3 x" Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 R, K! ?$ \6 C4 s& j
{7 ?! r! _4 P' @8 p
RX_MSG_PROTOCOL buf;2 L" g; k. B% a; m; w
7 I; l& p" z9 A3 g4 U7 @ buf.a = pshreRAM->a;+ T* X; t: s( ?- l" w
buf.b = pshreRAM->b;
6 d: [$ _0 X1 o4 _: i7 G8 f buf.packet_cout = pshreRAM->packet_cout;
1 S+ {& c7 R4 y3 `: [+ o
8 j( ^6 f; v/ b q if(buf.packet_cout != count_copy)
, f6 Z' X: F* c F5 n {
, v* k9 i7 N% ?3 u8 x1 |- o printf("a is %d\n", buf.a);7 e$ {2 u2 w5 T' C m( |1 |- j- ?
printf("b is %d\n", buf.b);
( @+ }% `% ^/ o8 b% q+ Z U printf("count is %d\n", buf.packet_cout);
+ Z7 b3 u6 V2 n1 c5 h3 G$ D. O6 E! g count_copy = buf.packet_cout;
/ e H1 K {6 G }8 @4 z- A( a! I+ F( S
else
0 r2 S- V& u% A* M0 g3 L$ w {% `( v8 O s X) h5 u- n- G
printf("No effective message!");
+ I6 ]; i3 M7 E" B }
. I/ [( o! j- q! L; n9 _5 N}
, A3 i/ L6 [" v: R' E$ ~: ^
) F* A, R0 `5 f5 m+ K, E9 y4 ]. o/ k0 h# K1 P" s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 G1 L/ G5 k: _/ W使用下面代码,对内存使用了mmap函数后:
1 A V6 R; }# U) o#include <stdio.h>9 x2 g3 ?+ T: Q7 K# p8 i: m& z% y
#include <unistd.h>
4 Z$ f* v3 w/ _+ x. Y9 I4 G#include <sys/mman.h>
, a I8 |, ]: w g( @. }0 K#include <sys/types.h>. @ p/ H, b% _ P2 U7 y; k
#include <fcntl.h>: o/ l, B- x: {4 L- ]
2 E6 _" [" Y8 }
#define SHAER_RAM_BASE_ADDR (0x80000000)
" J) V! L7 o8 @3 h#define SHAER_RAM_SIZE (0x20000) , A2 h' N; N# A L2 }- B
$ }5 r# b; }5 X% g3 o
typedef struct
- o# i& Q0 {- Y; B{
* q5 v: B4 h2 q3 f C unsigned int a;
+ G" c; d' ~9 h, `* s/ o: _ unsigned int b;
5 M- G3 @1 q2 g: i unsigned int packet_cout;
, t7 v, s+ T+ i! S) e3 g# X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 X+ y, P! {+ N' ]2 h8 V- w- U' u
; |* ^" b7 L& p( V+ H) e: T
void read_MSG_buffer(int *baseaddr);
( x8 X4 S2 ?$ r: A q: m5 junsigned int count_copy = 0; Z! p7 v& F& B7 n6 w' q
* s* `4 d; J5 ~' ?5 ^% e7 _int main()8 I; ]) O& V9 f0 z8 k9 ~
{
' X) n9 n! b" Y5 [$ U1 H$ j* Z int fd;
: z% P4 L6 k- ^, B6 r2 x int *mem = NULL;
- s8 A7 x. N% j$ S5 ~" M% @' G3 [
if((fd = open("/dev/mem", O_RDWR)) <0)5 P2 Z& @, o0 r. i& u
{. ?( y; l; P0 U4 a# m
perror("open error");
9 L! Z( C) U1 X% ^0 L* \ return -1;
- `: j8 J9 `$ P/ \# ]% B( |; k2 ^ }
9 ]+ {- x+ h6 G5 k, g8 n1 l 9 Z& Z! U; B1 W. E9 W+ L! Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ E+ M: ^! G" O- e& E5 X2 A4 R3 M
+ y5 C7 _/ C* _0 @' I) a; N
while(1)
K' I* l/ x1 N# O" Y { N$ e. D; p2 }# d
read_MSG_buffer(mem);3 n0 T1 U' x: D4 t
}
7 `3 ?2 }% z* ]8 _7 F) S}
f: \$ U( Y/ T* K
% C' \* b! L4 j; f% H# I" M; B Svoid read_MSG_buffer(int *baseaddr)
8 v/ `3 m& i {( x4 R* } R% b{) f1 F) k; c0 y3 L, [
pRX_MSG_PROTOCOL pshreRAM = NULL;5 y- [& E: L2 b8 \2 R; ]3 g
- G( M: L$ s! E1 k pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 F" m) T/ @! ? p
: k6 I" }+ u; U7 B( \, T if(pshreRAM->packet_cout != count_copy)1 [! ?- A$ s3 T0 b3 J6 t
{
) s5 B c$ w: r8 @) M) C6 _2 p printf("a is %d\n", pshreRAM->a);0 |: N+ a4 m e q5 A' i* {) [) \
printf("b is %d\n", pshreRAM->b);
5 q+ k$ ?& E4 M/ ~0 \ printf("count is %d\n", pshreRAM->packet_cout);9 v {' ?2 U2 O1 V" s
count_copy = pshreRAM->packet_cout;
8 F Z* L5 X. `$ }" H$ o }3 i9 q( G+ }6 d7 V' h$ S
else3 b) E, }6 h1 ]6 V0 }" o
{/ f/ G4 v/ Q- K. ]2 ]8 l
printf("No effective message!\n");; o L- e {5 V2 j$ T
}8 m* y5 k" ~" D9 P
}# V- ]& o1 W1 z( U
, Z$ j; c8 R6 Z7 l$ w H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 A U) @4 j2 n0 P% S \, {) Z2 m8 ?3 o% |: c4 X! K2 S
0 A, j; n+ W9 t% B9 Y" E
9 j! E$ F; Y4 q; t' \; I9 K! P1 s5 D: r* `1 a/ p a1 J" m/ W
|
|