|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! a. G ]) D6 v& [
0 N: h9 j0 ~; c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; J. N0 u) {3 X( U7 a+ m$ {, U) S
#include <unistd.h>- n- {$ p8 f7 Q3 e5 K" g N- |
#include <sys/mman.h>
- N1 c' B* U0 ?9 r) r#include <sys/types.h>
4 A/ s: X9 C ?& D#include <fcntl.h>
3 ]6 g+ J2 k3 h8 X2 C, Y7 |' u# t, J: q( k% F+ D/ a& k
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 v; k' d6 w6 N, F- E8 z
6 c9 a% ~2 w' r, {( p0 |, P; @8 C) U% utypedef struct' [( @1 S$ z1 V* d
{* Q; P t: m# \( V& `4 S
unsigned int a;
( J* x- p$ b1 Q4 I6 [; ], p8 v unsigned int b;" x7 j; [, G2 v' X2 Q& d
unsigned int packet_cout;% V+ H- g2 |6 \4 t) ~7 G- u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' x- ]9 L% t) D* d+ |/ ?. X i2 O- m4 b. ]/ G& q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% A8 B. `6 R% N' Q% ~unsigned int count_copy = 0; R. {3 P1 k# G' a2 u1 E" I
7 c6 c2 t: O$ Y: F, Q3 U# i
8 ]6 G2 k' I/ Y+ z) iint main(); A1 Q9 ]5 P* ]3 B2 L. I
{
8 E, X5 m4 _: j pRX_MSG_PROTOCOL pshreRAM = NULL;0 J( ?! c$ e( }+ V: D- ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! g D: V- y ]1 F0 m. j! D
* p4 O5 n ~" b9 t. k0 _
while(1)
( e& b# ?- T+ W' \- V {
1 f p6 p. X: s. | read_MSG_buffer(pshreRAM);6 A6 g, {6 O8 P3 V+ e; G R
} ' |7 A5 C7 O5 i. R- o+ Z0 ?& m- ~
}
* c$ _) C) m4 B" y" J* Q1 L# G0 s9 h# t( @; p/ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' i, m$ L1 V" A{
* {6 Q* ^$ Q9 H) C0 S# L- n RX_MSG_PROTOCOL buf;/ q: e0 p6 l% V2 V7 V: t9 k
/ W) l7 m/ P+ T7 G! G% P/ N
buf.a = pshreRAM->a;
. M$ l; C% ^! L- ?1 ^ buf.b = pshreRAM->b;0 }" M! K7 _) f C7 [; ?
buf.packet_cout = pshreRAM->packet_cout;
. u; E. k: Z9 Q- D9 Q 7 }/ S# U# [ i: m9 Y/ i2 G- O
if(buf.packet_cout != count_copy)
" w0 _& h8 R! J, _ {
5 x: p% K, d9 b% d8 E5 Q+ w* f printf("a is %d\n", buf.a);% E7 p- c' ^( y% c) E; S0 v) `
printf("b is %d\n", buf.b);6 i8 E! B$ Q2 N7 t
printf("count is %d\n", buf.packet_cout);. _' Q- \1 l& Z
count_copy = buf.packet_cout;% `" l2 }- ]& R# D
}
+ n+ n4 t* f' {$ Q. s P7 f else
5 l1 a! p' j2 d+ y3 y- _4 H' Y7 F6 | {
% D/ K8 y/ G+ z J/ |1 s5 s printf("No effective message!");# o" Q! C) m7 H a
}
1 g/ E- h- {0 B/ m# f}/ [( P# z! ~$ a5 f4 I9 J& M
) a1 [3 P a6 ]
r( O+ ]8 C( t, f- D+ D4 n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 g$ X* k4 c9 D5 v1 E: B6 Q
使用下面代码,对内存使用了mmap函数后:
# }. o( @* @. D' O9 x# |#include <stdio.h>
: P. v# i8 `) P( ?/ ]1 j7 ?#include <unistd.h>2 n# f7 B; Z8 k" ?" W7 y1 o
#include <sys/mman.h>
3 W, J# O5 r3 n j5 l D#include <sys/types.h>
9 q. d4 S7 }6 s1 g$ y; I( N#include <fcntl.h>4 q5 w9 Y" ?" X7 Y" ^; n5 E
' h1 }9 W L9 _. {# t: q#define SHAER_RAM_BASE_ADDR (0x80000000)9 |% H$ |* N% e- K
#define SHAER_RAM_SIZE (0x20000)
/ U* O" Q+ X: ~' W% T, O9 X3 t+ g" q, W+ [/ T R* [
typedef struct2 \. a n- n: ?/ i
{2 P9 v) ~7 j# r
unsigned int a;
' V! t7 k* W. W9 ^$ g0 A unsigned int b;
) l1 q" P9 [. {0 f7 ` unsigned int packet_cout;5 _) z1 L0 v/ S3 P* D2 |! w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" I& }+ M) J2 e3 a6 N P
$ R/ Q3 ^* G) u
void read_MSG_buffer(int *baseaddr);! B' U1 M" U& j& p. X/ N
unsigned int count_copy = 0;
! e! g& v1 P+ W8 T. h+ v, v
" d7 Q3 p( y; c3 J6 u9 T# fint main()& |- M' G. l7 K2 a$ ^
{
, y( L2 p3 o. G& o8 O( ^0 K int fd;! Q* X0 w% T; k. u- U; F
int *mem = NULL;
, w" u+ @! J& H) b+ z: K. ~' E* W/ t2 g
if((fd = open("/dev/mem", O_RDWR)) <0)
3 m' s9 ^3 e/ ] ` {/ k' q5 w& h* R0 L: N8 y
perror("open error");. v; Z. b% a0 d9 a
return -1;
) a& I ^ {7 y g9 R0 f+ |' M; v }
7 u0 D, u$ K7 _4 j ] / Z" i! w' }7 b( N/ N8 f# R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ^4 i1 I: M8 i: s& S ` p8 q
2 V8 j# O: {( p; M1 w while(1)
u8 P6 v" @% I* z {3 t- S$ b$ k+ p
read_MSG_buffer(mem);
# T+ ?3 r% b/ j) {4 v }
" O8 R1 e6 N) E. B. A}
; `8 q4 l' q( t
2 u: C. E* H: fvoid read_MSG_buffer(int *baseaddr)' d7 J9 h" |# Q) V! h; s
{" C5 u' K! }+ e1 h% g
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `) b' r' Q ~( v
1 K) g6 \; O O+ M: N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- @3 r3 Y: @$ H* ?
; y0 o; A: g" }' ?/ P- I8 { if(pshreRAM->packet_cout != count_copy)
2 K* k* ]4 R8 y' [, O. E+ _ { D- N$ @! J( ?# d
printf("a is %d\n", pshreRAM->a);( X0 m' h3 n- z9 U# Y, u: `; E
printf("b is %d\n", pshreRAM->b);& a" M; j9 E% G, k8 X9 x0 z
printf("count is %d\n", pshreRAM->packet_cout);# D K# J: F8 Y+ v
count_copy = pshreRAM->packet_cout;" s5 }* A+ s6 Y/ @8 ?9 c
}3 E7 U, q( N5 L5 g: {
else
/ u& x6 f! i: S; I' y {2 B( V1 ?7 _, ]
printf("No effective message!\n");
, ^( A6 ]$ Y; B" |' v }
8 C) g! |$ B$ @& |4 Q}
& o( j3 R+ M! e+ T( T! T# ]! b4 p- N8 a8 u' N! K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 X1 ?: s. P) w' g8 ?5 G! r$ h' W2 |
0 W# _* J9 h3 y+ e9 S" Z$ b, Y! E: o! p
* q2 D5 n! ?1 ]8 @4 d
|
|