|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 l1 R. U5 e/ D: d* l
$ t8 E o: ]& ^, Y+ U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ v" F* [+ o. ?. U5 I#include <unistd.h>7 q* m! {6 e: j, V4 ~& I+ i# s
#include <sys/mman.h>
3 t7 ?3 ?& C- | y5 g- d; f5 A#include <sys/types.h>
/ X/ N) B. v/ k) Q0 ^2 h8 [#include <fcntl.h>
0 A; _5 o( N4 f( P. I% \/ u. Z$ W; S. R: Q. s
#define SHAER_RAM_BASE_ADDR (0x80000000) 3 `% Q+ K# s+ c! q
5 o' _9 a+ H$ B4 wtypedef struct. l7 ?+ ]) E( J$ o
{0 d$ a! G$ J: j4 U3 M1 }
unsigned int a;
4 y( K; N/ X! @1 A" ^ unsigned int b;
: t' s; U9 B7 d6 N2 O. a unsigned int packet_cout;
% \& a4 x. R2 X4 i# f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 V X' L6 D s% j1 I* u
1 A/ d9 T% ~7 |' k! a" m4 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% P" a$ @$ M+ f. Yunsigned int count_copy = 0;: T, q9 q, y6 b7 H, N( e8 z
& H+ V+ C) w+ K7 {1 ?' c X2 j
0 q9 |4 r: `6 t) \int main()! W1 K6 I5 g1 o$ d
{9 ^8 h& J" `1 E
pRX_MSG_PROTOCOL pshreRAM = NULL;- g6 J- w h% k+ p: v( D& T+ b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# L% E$ n( q# [; N, D5 t" Y1 f
" C1 }4 Z& i0 w while(1)
& B1 s1 ?% l( y% }, m. ~, X7 w+ M {
3 h% z }$ k# c Q9 G read_MSG_buffer(pshreRAM);' D# ^* h" o1 ?( H& Q2 b: `
} 5 N7 |% }' U# c6 u, E
}3 E5 B ~9 X, w& F
8 B2 V( g5 }( Y O2 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 t0 l* k/ {) t5 |9 z{, p9 j; o# ~% O2 h+ r. z- t
RX_MSG_PROTOCOL buf;: v6 t7 @# Q; x! s* y
$ `6 N* X0 {) B3 q buf.a = pshreRAM->a;
& v9 k7 R5 i P R h buf.b = pshreRAM->b;6 t3 n s7 K+ Y) q
buf.packet_cout = pshreRAM->packet_cout;' {& N2 l8 K( `2 j' G0 h; G+ e
8 z L' U* N, @5 ] if(buf.packet_cout != count_copy)
/ V: d7 e8 T7 W7 [0 I% A {
7 D ?, b0 i7 f1 C! y; z( c printf("a is %d\n", buf.a);
) q$ l. y* m- p3 s9 U# u8 N+ _ printf("b is %d\n", buf.b);
# U4 Y7 a( B( B4 v! w printf("count is %d\n", buf.packet_cout);% u q2 ?( ]4 c# m
count_copy = buf.packet_cout;
8 c) M& f. h6 e }4 _6 Q9 j: Y. H
else* y) Z; m# P [: ^
{
r% _* E' g* i/ p. H4 `7 l! n; ^- ~ printf("No effective message!");
# U' t: p( g* Z/ a }
0 H+ B" a# t5 L4 V( c6 ~8 f}. l8 `, r' E1 {. l7 e6 _$ e7 u' o
7 O7 k$ k9 a% \ ?6 \$ u
: _: ^0 K1 M- \ O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) d% d' R9 K+ i( C* S0 U
使用下面代码,对内存使用了mmap函数后:* F) m6 s% h8 X- @ c
#include <stdio.h># G6 \! l; s# q& L
#include <unistd.h>/ H/ L4 o! w c# c
#include <sys/mman.h>
! a f. S1 ?; P3 U8 t1 l#include <sys/types.h>
: ]5 e% c5 z* j& O$ s/ U3 s7 `#include <fcntl.h>- M2 ~) I [4 q" y
9 u3 s' L& L1 Q7 d
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ L9 o+ t. [4 l5 w# y5 J. w( C1 V2 l1 \#define SHAER_RAM_SIZE (0x20000) 8 k- S, ? M2 K1 K/ r# F* C- G
% m$ |4 L4 I8 Ytypedef struct
, S* C1 @ m( `7 Q! | x{1 f5 }5 k& K. X% h0 k! A
unsigned int a;( @9 j8 P8 p+ p% D
unsigned int b;
% }8 A: S# M s* X unsigned int packet_cout;
5 u6 |% d W4 y1 F' h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" V* d* r u0 m+ x# V
+ O1 t: |1 e+ ~, d0 X
void read_MSG_buffer(int *baseaddr);
7 J5 a; l% A' x: V; q' `unsigned int count_copy = 0;
, [) z' O% l1 b% z7 m
0 X q, U/ g& p, Hint main(), P& m; {" m1 d' a5 m3 M" I5 G
{
7 H7 U! U( [( c2 q: b S int fd;; _1 n; g, X+ B5 u
int *mem = NULL;
; V' J" J( F! o
! u; m1 h2 y% C if((fd = open("/dev/mem", O_RDWR)) <0)
" S( b) c% e% p" U x( ]4 u; Y {1 L' H. P: Z5 X. i: o3 d( {$ g( x( C
perror("open error");
* R8 L: t& r, @2 l! q return -1;
) _2 f5 r' ^! P0 i }6 Y2 c% {7 c. j' j! ^* X
5 ^# j3 H1 c9 z' E1 ?: S" ~' }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 x, c! g( K) N i
$ w) H, ?* d0 n, v( `5 o: Z while(1)6 Z; h/ }$ W6 v7 h5 r
{( h; ?6 Q8 D# v. e9 C. }) q; a
read_MSG_buffer(mem);1 \( t' H7 U% j: v! z& h% Y
} " k! F& r& u8 A5 s0 i$ I9 K3 T$ z- @
}% ?' ^' a ]7 S3 Z/ f8 S
$ L) o" M/ H. U0 \ N- e: `
void read_MSG_buffer(int *baseaddr)
4 f$ n0 E- K0 C# v( }{2 X2 p/ i! ~7 E, H
pRX_MSG_PROTOCOL pshreRAM = NULL;
' K& S" ~: q& w7 L2 i' c2 A- y
4 ~) A$ w3 q- _4 b( o pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 i0 H. u- X& ?7 D3 Q+ e
* M( e1 H( c. M8 s/ ?0 p if(pshreRAM->packet_cout != count_copy) g B i8 N$ w' j( b
{
- o; _3 h( c$ t5 G! E/ |/ x printf("a is %d\n", pshreRAM->a);5 g7 W$ x* C, [; _8 f7 v/ T! \
printf("b is %d\n", pshreRAM->b);
6 s3 x3 y7 T b0 m& F7 S c printf("count is %d\n", pshreRAM->packet_cout);
* d2 y& D! S. G count_copy = pshreRAM->packet_cout;
0 b; ~, r) S, y/ K2 L2 n% q8 Y! J5 I }; f: G- s% n0 t6 W4 l+ m7 w
else: @6 r* b$ ?2 _' y8 U+ ^7 L; F, G
{
& O# |" A+ k2 G; z printf("No effective message!\n"); o6 M& O: Y# {0 B% M
}
; p3 V$ O" L2 O}
( c ^! T1 z7 I
+ V: A) k' B0 v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 v! y; n* D2 D0 r4 d- Y+ L: n" B9 Z7 l; q3 o
# t% w7 Z, v2 L( ^
( a$ l1 a5 F( C7 n9 X$ o8 D( I7 H. ]0 c5 X# L4 h
|
|