|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & U. P8 u. {) `
5 v7 D9 O+ [3 t6 `# }$ |2 ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 M& _; M& f3 h( z h1 z& `#include <unistd.h>
5 s- K- D" w) X! o4 ]8 m#include <sys/mman.h>- F+ l. c7 K2 X- X2 t# B. U
#include <sys/types.h>+ j/ ~8 j* C! L; S1 w
#include <fcntl.h>6 D! }: H# t2 c3 B
* Q, k$ @7 f1 z! |6 a% T I
#define SHAER_RAM_BASE_ADDR (0x80000000)
, ]# H7 h6 K2 o
. g4 G& C4 N0 R6 C4 Ctypedef struct
1 e8 R# T7 H3 T3 o/ |{! b7 f0 }" G6 l7 t8 z. t
unsigned int a;
4 e5 f, f& i, j$ _# g5 @+ i unsigned int b;5 E! G; t" Y+ g, w/ r7 G( s2 S
unsigned int packet_cout;# A5 o' P$ u) c7 A9 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 c4 E4 c' C* Y$ \/ w1 \; J7 z. ]. Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 f9 M+ s0 }) N1 d, iunsigned int count_copy = 0;
d7 ]( w! r1 s" E% I. o' k+ E9 Z: Q7 U1 P8 D
" Z/ }9 g0 B( J) Xint main()0 x# r( f" f) F3 n5 d d8 B' o+ y
{
2 y8 T! A% x. n+ p4 Y, N: L pRX_MSG_PROTOCOL pshreRAM = NULL;
& [/ E5 ]# f7 g7 @8 B+ x5 D4 ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 I0 C" Q6 C3 l2 L/ P3 `, Y; j8 Y, m5 D% k; h
while(1)
y+ L0 d6 [! }( |( i" X {
' r$ S$ X7 q! P& M- x9 J) q1 j+ t! C read_MSG_buffer(pshreRAM);. B6 s5 `& R0 P: K8 E& P& T
} 9 x) l2 O3 t% _$ x6 r! ] ~6 q0 O
}
" M$ k+ Q4 K' E2 C" a. R7 s/ ~! d/ k+ r+ t; U' z! H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
U& r0 Z9 `' \' w6 |{' a9 H/ X" W2 E) o x# R! |+ T
RX_MSG_PROTOCOL buf;
+ b" ~; X# N ?2 ~; {
. P- w/ A; r/ t4 J, x6 E$ K& u buf.a = pshreRAM->a;
2 X8 N! P+ d4 h2 C: K3 A. Z, k buf.b = pshreRAM->b;0 l r$ i8 C# r$ M
buf.packet_cout = pshreRAM->packet_cout;' Z' i; s7 k' y
8 Q+ Z% m9 f9 i7 C {4 a
if(buf.packet_cout != count_copy)+ G3 Q% A2 u) S, S
{
* `8 P/ X7 e$ ^! H1 i printf("a is %d\n", buf.a);
2 f( d5 S* T* x, Z: X9 [. }6 f printf("b is %d\n", buf.b);
" b {, o& P$ |9 w F! r" k printf("count is %d\n", buf.packet_cout);
) q4 Z( ^0 e/ d( m$ E& h count_copy = buf.packet_cout;
" t: G O1 D/ C/ B }9 b9 P! \1 l. V& f* T) J+ ^$ I
else+ X* O5 x1 R5 u8 V! O
{
3 p& Z' B0 h- Z8 x printf("No effective message!");
2 D( d0 N5 n$ d }: R3 |9 m# ?* O
}
) w! X* W# W9 z+ o3 d! u |/ l/ y) ]% C$ Z" S3 w8 |
7 I, y" a& E3 k) |: O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( n' H% V1 J2 ^- t使用下面代码,对内存使用了mmap函数后:
' |6 R% W/ ?" z#include <stdio.h>0 n# \' b6 y* X7 R
#include <unistd.h>! Z5 k) l: M& w
#include <sys/mman.h>
. J/ ^9 i; B Y2 M) K3 N#include <sys/types.h>8 l+ \/ Q: b3 \; p3 f6 P; p
#include <fcntl.h>
$ E6 t& {4 o' J D3 ?2 n$ j! x( q0 E d) [7 g7 u3 ~) l& [/ _) [
#define SHAER_RAM_BASE_ADDR (0x80000000)% c8 o5 s2 x* e- @ w
#define SHAER_RAM_SIZE (0x20000) 6 K7 `' o: U8 ~, S
2 U. I$ Q7 ^5 C/ y! l3 D V" f
typedef struct" H- }, A# [+ u
{
% @& h1 ~( M3 b: A4 _6 v unsigned int a;
z& @" H( e0 E5 J0 ` unsigned int b;
) h! B& }5 f/ V unsigned int packet_cout;
+ j0 z+ q9 [- }7 W! b/ D" p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* F+ z; F* j9 Z( |& |
8 W* s* k3 X6 Q) }- @ o# {void read_MSG_buffer(int *baseaddr);
0 t8 f) x6 C2 q& H# V' k3 O8 _' Dunsigned int count_copy = 0;. ]; W: o1 i4 v% F
, Z6 s6 n0 {% Q7 D( M2 t9 D5 oint main()* a; Y+ Q; } c* ~. w" W7 \
{
. W0 p }6 l/ s% w2 z( X int fd;* o7 x+ K: n/ j3 Z6 m7 g1 |
int *mem = NULL; o# h9 E! b t, F
$ u B7 ]( }) Q" G8 I+ y( l
if((fd = open("/dev/mem", O_RDWR)) <0)0 G7 l8 r! K5 K; `* R; p _! l
{
. m9 l) j2 Z) U! q0 f9 B) D perror("open error");: M) z9 E, J8 P0 p/ p
return -1;- b, W: {6 o+ r4 K8 N- M4 u
}
$ x4 }/ L5 H/ \$ p: {' B
! M7 T" T, \' y7 B7 ~ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( ^2 \1 e* ]2 N x8 C: h/ S; B
8 i6 y0 y$ c) G3 P+ \3 U# I while(1)
: A# S0 q' z0 b* o {
+ Q0 F1 T! `$ k( u4 F8 y z read_MSG_buffer(mem);1 f5 ^8 i7 a5 \' `" i
} 9 w) y0 n! `" u
}- |, r6 l8 f/ C3 j: W( G
: d1 _: j* c1 O0 P& }void read_MSG_buffer(int *baseaddr)
L& T4 t6 y- T4 }" E: q, ]5 ^# }{9 F* z' v, a3 W8 w' M; ?$ S
pRX_MSG_PROTOCOL pshreRAM = NULL;1 e$ v- A5 f! r4 m2 ]- U8 { u
: A' x1 D D& P4 y7 C* n* p pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 A; l' O2 \1 S# z2 L8 `. Q9 C5 v8 w- w m
if(pshreRAM->packet_cout != count_copy)1 g0 g2 S: I- ?( a" [
{
* ]$ p6 x z) ~8 I+ T1 d. a printf("a is %d\n", pshreRAM->a);
1 T2 t% s9 I; |4 i) A6 f! w printf("b is %d\n", pshreRAM->b);/ c4 l3 ?9 `, m
printf("count is %d\n", pshreRAM->packet_cout);
4 z" t6 O* b( l* _0 w* ^ count_copy = pshreRAM->packet_cout;
8 b! `6 m2 y1 T( A, b, B4 A }
, P+ j/ ?5 Z, x3 l+ N* ? else
9 C4 ]9 w* ^* g% \% T6 ]: { @* K5 j {
( b/ G4 [! p# |0 l T- Y2 I printf("No effective message!\n");
( v, i- S( h/ s$ U$ y" S2 U* _ }
8 ~8 [' k( A$ J. h/ C! S! x; g- {1 ]}5 [, Y2 q1 s+ U
4 f0 N( h2 R5 V$ x6 q/ l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. e6 f* k9 I! G" |) {
& w) w, W) ]& _! q, H3 M9 A: k: R3 T( a( v9 I
$ S Q, M4 ]. {1 C6 ?( p3 ]. i( q3 I
|
|