|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; `/ j N" q) `5 r) \1 H& k9 S+ ~, w% T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 _, l* V) F" J- H% H& h
#include <unistd.h>
( x- v& ~1 A: C) [) Z4 T#include <sys/mman.h>6 a; y$ E5 X* h0 k$ ^$ r
#include <sys/types.h>6 k: K3 h, G/ d! P4 O' l
#include <fcntl.h>
) ?3 e& M) {3 ]& T
- x; Z& G: R1 D$ C/ W6 n#define SHAER_RAM_BASE_ADDR (0x80000000)
& n! p: ` S' y x' f b: V
+ O0 \1 c! }8 Ktypedef struct
5 L1 E) E/ _9 n8 m3 a4 U/ I{4 g7 H; F, Q( K( @" {5 U( x
unsigned int a;! x/ w" s$ n0 V8 _. _; D5 c
unsigned int b;
! F0 Q* R7 ~6 r unsigned int packet_cout;& g$ L4 _. U' T: k; N; D: O f z; E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; C( F) ^" R: |1 s3 w
$ o9 T# V; S/ }( E2 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 }) A4 w4 ^- W" p
unsigned int count_copy = 0;2 ]* p$ l8 m J v4 z5 v/ u
* W- Z( g% v+ f
4 Q5 X. l1 B% ~' y) cint main()
- I: r: X% r1 v- M, \( k{
. c) T4 e# X; v. _ pRX_MSG_PROTOCOL pshreRAM = NULL;6 i5 J1 c# g t# Y5 t: i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 E4 T$ L) q0 [6 v q
9 A+ U# g, Z- M9 \3 [9 ^7 Q
while(1)) Y5 M8 {4 \3 K" T: b$ Y
{9 ]$ l0 |, }4 H! U' A
read_MSG_buffer(pshreRAM);# {* L- L3 n% M( |& R
} 8 \: ^8 \# o9 g: B% L+ y
}
! }$ F6 P7 m' l8 U7 W, s) s2 @
; {' [# e$ |1 R% X) Q/ X% O- evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 A; n* _6 c L. C4 I T
{
4 c8 ~3 l* I' a5 B; c, p RX_MSG_PROTOCOL buf;
! B% d& N3 T3 v1 s) x$ `) H
1 e# `/ W* o, h) z buf.a = pshreRAM->a;
' y9 u4 a/ w1 K$ v6 ~ buf.b = pshreRAM->b;
C0 U9 C+ r1 o. |. a buf.packet_cout = pshreRAM->packet_cout;
1 {& ?$ h* Y! b- U$ b: n
" _- i- E, e$ t( T2 |% d if(buf.packet_cout != count_copy)
$ x$ S' G3 K" N6 C( g {( Y H$ V; K& c, ~. @* s' Z
printf("a is %d\n", buf.a);
) t9 l4 o% Q4 |; C printf("b is %d\n", buf.b);: z- y* ?, ~6 t9 T" j4 w
printf("count is %d\n", buf.packet_cout);
. Y( {, d9 r% W6 q count_copy = buf.packet_cout;
6 H2 u8 [; z/ u3 x }
! M5 P( h' H: O! s6 v4 B else# h* r4 Y9 Q. Z( p
{$ d. q, r. a5 j6 i1 c1 S3 q
printf("No effective message!");
$ U! G. D6 x2 e* y+ ]1 _4 y$ M } ?2 V2 _3 B, z* o: \
}$ H5 Z( ^! \2 V' I, Y
1 W( h' P1 z% X9 X2 v# l/ U
) ^* H& I' @+ \5 R7 P2 A9 I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# Y9 c& x; v$ k T& q8 T6 `
使用下面代码,对内存使用了mmap函数后:' B) B% q" j: S7 }0 D
#include <stdio.h>
4 @$ t! X l# C0 n7 P/ F#include <unistd.h>2 C) r3 N: x% L& r* x
#include <sys/mman.h>
2 \& n. x! z8 n, E. `" T#include <sys/types.h>- O: K, h6 n V6 \9 j3 C+ r
#include <fcntl.h>( r& C, e! Y& [- ~+ g
/ V& @. E. H; e/ G* ~, h9 m) D$ @
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 p% k% }3 q( D' D. q' @#define SHAER_RAM_SIZE (0x20000) ; ^. ~2 j# W4 R) ?3 y5 k
$ R" w8 G0 L) z+ U# j8 J3 k( L4 G& H% X
typedef struct
+ S! h" H) D* `! R4 U. Z Q- e( D{
/ M8 b8 |+ {8 N) R" w N* v- M unsigned int a;, u8 O$ N$ v& X# D
unsigned int b;
- d3 N( | K5 i unsigned int packet_cout;
s' |( T5 }0 s1 |! j0 q* T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
D9 q1 Q0 @; s( h- B( k. \# W) R
, F, {- Z% @, X5 W5 F! bvoid read_MSG_buffer(int *baseaddr);6 B6 I, \7 r9 |+ k
unsigned int count_copy = 0;
% `# B6 i* N, Z, U' E- l. ^& x% I: X- H+ q1 ~
int main()3 B2 E6 }% N8 z! e+ W7 X5 I
{1 D& \. C- }+ _- O
int fd;
+ [( g0 x- T% v- I int *mem = NULL;* x. z2 y" s' g& J
# L! T0 h- s' q( G. ?7 \2 w if((fd = open("/dev/mem", O_RDWR)) <0)! q- B8 Q1 ^& d
{) z( X1 O6 e0 b* `8 w
perror("open error");
. @6 t' p) C) D6 z return -1;. W' r& N3 c! C7 h
}
" H( T( U3 U; o4 z& n, I3 l- v
7 W; n& ~1 o; V i mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) s5 V& ^7 {$ F, u& i
. k7 B) ^8 N* w b/ R$ F4 E while(1)
@2 V' B: @* _0 S/ Z8 ]- J! L {- c4 Q( M: }. V9 d6 ?5 H
read_MSG_buffer(mem);& ]/ q3 j* ]& w0 O# p% u' O
} 1 h4 C* i8 {- s' d+ ]7 }
}
0 U: ^( M5 d! ]) ^0 @, X9 e4 Q- E
9 a* l7 q/ {. K( h; C2 G* Wvoid read_MSG_buffer(int *baseaddr)
( a6 X7 X& g7 ?5 j; d) L{
X& x2 c# y+ G: M8 ~1 E pRX_MSG_PROTOCOL pshreRAM = NULL;
2 C) k% W" @8 o i
) ^! Q3 @7 ~4 Q( M" B pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k8 \) _' k- D* V, d' g# ?
; Y- O8 N1 y( p; [5 F* K if(pshreRAM->packet_cout != count_copy)
3 n% W( b' z* T& u3 z* t {
5 ]5 M x( C* g printf("a is %d\n", pshreRAM->a);
6 P& F4 o3 v& Q% D printf("b is %d\n", pshreRAM->b); C3 z' M5 c) ?& V. [- _
printf("count is %d\n", pshreRAM->packet_cout);. p' f3 N( N6 p2 e* o& q3 |
count_copy = pshreRAM->packet_cout;
# a9 b5 l' U' U# m0 o2 q m }* r, j" c" |) f% S9 `
else
: e. L& M3 r6 T1 K' V2 t {
}2 }0 m1 R% ] printf("No effective message!\n");. Y* G' |& p4 _0 J7 v
}! a! M' m$ K) e2 H% |5 l1 S
}4 Z$ \1 _5 ~1 u) b7 q, k1 T
- E' |' \# u( q3 `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ p) x" \8 D. P! ^
; W O- a+ F5 e3 p9 s$ q* p' A* h
2 \6 H% l) S5 b/ l% g* F z, Y. D" n
|
|