|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 v% x/ I# Q5 b5 P3 I; G) T+ ~6 ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* k3 a4 `9 C0 s#include <unistd.h>. L# b a9 v8 N$ a
#include <sys/mman.h>( W: z4 z3 Q& [6 Q% X$ a
#include <sys/types.h>
- G6 K$ L/ u- @, s#include <fcntl.h>0 |7 `$ @) X: ^4 m2 W/ [
- F# l( K6 e8 a$ g# A" m
#define SHAER_RAM_BASE_ADDR (0x80000000) 1 U e( |3 P8 x8 I1 `' P, ^" ~
7 Z& Z0 i* O9 l; S0 | v( n
typedef struct2 F& E c; I5 H0 |# @ J
{; C% r/ I5 R' v% L- a
unsigned int a;3 V9 b6 [0 B; S! [
unsigned int b;
1 U8 G* \0 _! s( R unsigned int packet_cout;
( u# v' | s# V' ]7 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- x' \! V. N& t) `
3 }" a5 m. z. ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. b9 F* B ~. S; F/ [* A
unsigned int count_copy = 0;- G: y7 e/ g L4 K" ^5 a
. q+ m# q8 G( W. G1 d: w" Y4 e( q& F, [$ }. ?, O, j
int main()2 Z& D9 b3 }& ?9 h4 S5 `5 K& ?
{! R" j) ] R0 c) C$ O$ r+ P7 U
pRX_MSG_PROTOCOL pshreRAM = NULL;3 z0 P5 w- J, S. S7 c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 m+ R4 E5 z: {% ?- N2 r$ Q' B
" s4 E/ b1 d, |: C
while(1)9 i2 t3 C2 O2 X3 L! ]/ [
{, V h0 I; i0 q
read_MSG_buffer(pshreRAM);* w6 n/ d4 R. q0 }% J4 O
}
# Z) }; {7 r0 {7 S}
; Z6 I: I# K( R5 |
. Z6 Z1 [: {9 v5 f5 s3 gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! `. W: w7 V. ?* {{. ~* {8 I- f0 S( ~. y. K* s; @5 \
RX_MSG_PROTOCOL buf;2 G* }) g: h4 }& |; K
: X/ o+ T9 q$ R# @( }
buf.a = pshreRAM->a;$ f# b8 ?, s3 n/ B" r% c( I! q
buf.b = pshreRAM->b;/ r; V/ p" }' P0 a# [0 a7 v
buf.packet_cout = pshreRAM->packet_cout;, Z3 b J2 N1 M! F' Z
`' P9 {7 N7 J; W if(buf.packet_cout != count_copy)- b6 b5 ]! K" v: H# A/ L! `( ]
{
- X) Y: L# F+ I8 K( N7 t printf("a is %d\n", buf.a); d* K3 N: {- ~2 l6 S( x
printf("b is %d\n", buf.b);! Y- x3 k! S5 V. ^3 o
printf("count is %d\n", buf.packet_cout);
( \, r/ M8 E- D count_copy = buf.packet_cout;
r. F- N! ]7 o7 p5 b" R8 a. ] }
* C/ ?$ q! X* V5 O! n3 l1 V" T else
0 p" F8 R& B/ f5 x {# b. v+ y \1 U3 j" f' m
printf("No effective message!");
0 w" f; v/ K. q9 E5 r) O+ C }
' l& _; ~1 s" ~; }. p* B}* h& r* ?6 _8 z: f! e0 R
2 S5 n- v' |+ G5 F; X; l7 i @, Y/ S/ l: H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 j l8 x5 D& _" }0 Q使用下面代码,对内存使用了mmap函数后:7 |! E6 w/ b) X2 d
#include <stdio.h>7 Y/ c" s* X4 m; l3 m" ^8 E5 B
#include <unistd.h>, z p4 T7 z" v: D4 K9 J3 u. W
#include <sys/mman.h># g+ b0 R% O; x0 z0 f0 ^. e
#include <sys/types.h>0 ?4 }1 H, {: _3 O
#include <fcntl.h>
# E# x5 e- S7 _' x2 q: ]0 A; M8 n- g
#define SHAER_RAM_BASE_ADDR (0x80000000): K8 A: w) l6 K4 e( ^3 R: E6 }. i
#define SHAER_RAM_SIZE (0x20000) v3 J- P0 w2 Z7 M/ ^
8 M7 S7 u! d# d
typedef struct
1 ], s, }( {, g/ ~ X{
! e- n% v' O3 L: |7 R1 x3 j5 K unsigned int a;
( T8 j+ h5 |& B" C unsigned int b;) _% L0 p6 s. {5 ]
unsigned int packet_cout;
) ]4 ^2 C$ l( z2 C/ V% _$ R4 u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. R4 k# k* F; b
* Z3 R+ C" p. I, C& L5 Jvoid read_MSG_buffer(int *baseaddr);
5 u$ p" m/ J3 _unsigned int count_copy = 0;$ p" h! W; r' `# z: o6 j
3 c( J c1 m' `% Y: @
int main()/ A0 D4 u3 X* z0 u! ^# U
{: B" m7 t" m4 I+ P$ h* P! e* A/ S& i
int fd;
8 a) P( `2 a5 _ int *mem = NULL;
3 a. K+ d$ {4 \' Y' x
. u$ J+ V' {. }" I* O( k; i1 W if((fd = open("/dev/mem", O_RDWR)) <0)9 K( H6 ~& C1 d o' z% u8 E
{* |1 |2 X; z# y# W+ y
perror("open error");6 h5 X A' F3 ?
return -1;5 E$ v% z" A' U4 k* t& T7 R% Q
}
1 q3 R7 M& ?+ ]5 A7 w6 l % N, K8 ]! H4 b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 G7 v, ]7 {7 J1 o
, S/ Y) A A- b while(1)# p, w8 U$ l5 n- ^" s
{1 c7 P/ Z$ l: p: e# z7 j+ D
read_MSG_buffer(mem);
5 V5 z9 K$ X) u }
9 r' m$ l b2 b}- u2 w+ h# D" S, g! ]. W3 V
$ F8 Z% D1 C) ?3 N8 w [7 n
void read_MSG_buffer(int *baseaddr)
5 x' Q1 m+ C/ M* V5 t' w{& A# S' v) m5 I
pRX_MSG_PROTOCOL pshreRAM = NULL;8 Z) x$ c6 M( l. ~6 x& `/ k
; J$ l% q f* L9 k9 J, [% K0 n" i8 ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: j9 j0 R! r6 i. d( H6 P
H; p3 y% K9 E$ ]; T/ |8 w: l9 n if(pshreRAM->packet_cout != count_copy)2 s* o! L+ t" \7 d% y: F3 g
{
& f/ K/ J; j$ A1 r; f; d printf("a is %d\n", pshreRAM->a);
0 B% u6 ?$ J, ]( I+ }$ o1 |: q printf("b is %d\n", pshreRAM->b);/ _( [& a6 t$ c9 ]1 Q
printf("count is %d\n", pshreRAM->packet_cout);
+ h% `: v1 J: R. r# U8 A, g% Q count_copy = pshreRAM->packet_cout;) q. X) W* X! r/ y) ?5 T9 D0 U
}
" x3 w8 Q `7 g% u3 W1 F else% B4 P4 `) G, \+ T
{
+ h; R2 w9 v1 I0 j: l# _ b printf("No effective message!\n");0 P9 @8 r# S1 C6 t
}, a0 `; P! w4 N, R9 ?3 l
}
# W4 V& v) Y7 c! M( v+ V+ `% G# H- X# X8 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# J. h% H$ `$ t$ |" t# `. l
" L! I6 ~; s. ^: i1 ?2 b6 R3 j
* R4 i2 I# Q+ p, o6 s m) t/ I4 E0 Q' S0 g$ B; c
+ V* K$ F ]" C: ^ |
|