|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Y# I% R x: v, i2 ~
n0 m9 t4 p+ O) ]. s, LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ i& N4 F6 E4 E4 A& l0 K& a#include <unistd.h>( }' E2 R% [+ ^
#include <sys/mman.h>$ V/ J- {' T1 K
#include <sys/types.h>
& `! y- B5 F" m1 N- V#include <fcntl.h>
7 v7 G. `0 r7 a. d ^1 E/ e4 x
& ^2 y" k" T# F9 o5 V3 p! n2 s#define SHAER_RAM_BASE_ADDR (0x80000000)
1 z+ V8 H" i* b2 J: C7 f; y, h( e
+ {" c5 G# A; S+ B) c! T2 utypedef struct
/ S7 ^( p# H% E# g* c{
4 W8 O4 Q' t/ G! |+ M) @1 v, i unsigned int a;2 [! `; n) P8 t# x d( [" S
unsigned int b;" U' v0 W' k* G- o
unsigned int packet_cout;* s' Z, S0 A4 j+ w- F. G9 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; P! k- L" o6 G4 ?6 m" S5 d! ?
: C( A I# u$ A0 Z! avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) i: F* d9 m4 W ^+ D1 X* O5 }' g! cunsigned int count_copy = 0;
4 k" R2 @' }4 ~: ?" ?7 X4 a( P# ~' N$ v. |6 U
b5 c) n* k8 R$ `# Aint main() c# {* ]% }& w( _! g4 T
{
3 U3 F. p# c \+ A pRX_MSG_PROTOCOL pshreRAM = NULL;0 _( B, Z. o: r9 h% c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- V, W3 C" g3 J/ B+ T0 t( J. V6 R1 Y
) G" V% ]! K& x* P) h) B2 ^ while(1)
. \/ @- s( M# Z% S4 v+ u, o$ [( [ {) H( A3 o( B8 {7 u
read_MSG_buffer(pshreRAM);, j" u& u8 i% N @7 r( W& Z$ r
}
" Z/ M0 M6 \9 W( e0 i& {6 Y/ R0 E}
6 Y! z0 t8 V/ U0 ]: V! P% H5 ]
# H/ u! R- A5 D% s4 C0 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' m! H! m/ w v{& O6 E9 ]; s, I9 ]+ J }' N
RX_MSG_PROTOCOL buf;* ^. p# w2 r9 z: I/ G: c
@( z7 `/ J$ ]' I buf.a = pshreRAM->a;9 A% V, |. {+ ?& F* C" y2 j
buf.b = pshreRAM->b;
1 m% y" Y9 x# h2 K2 N; X buf.packet_cout = pshreRAM->packet_cout;
6 j: T6 Q" I5 f4 }0 T + W, P5 `$ V7 |! s% Y8 s
if(buf.packet_cout != count_copy)/ g1 {, K+ x! z8 Y
{
( c, [8 X- B ?7 |/ ~" \( v2 f printf("a is %d\n", buf.a);6 f I' }- z/ y* Y! q
printf("b is %d\n", buf.b);
8 h6 v& O5 w/ T& d$ W1 p printf("count is %d\n", buf.packet_cout);
/ R, F; {" V2 [, z/ N8 @$ r count_copy = buf.packet_cout;
! U8 _6 _& X | }' [% o9 Z1 Q2 a7 L. C, y
else
) F3 |+ |1 R4 k* l6 n {
, h, D0 t) e/ ^8 m' W# O! L printf("No effective message!");
7 ?3 B! z7 P& l' N- z8 ?! K1 t6 Z }, j8 }5 J2 V8 k7 x2 @1 j7 M2 e2 E
}
. [$ z5 _8 I8 X: J4 q- Y* v
( W- U; ~- r4 w" A/ E1 z2 \
% r$ a/ E( {) i, ], u% p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( @% r8 ]6 |" r" m
使用下面代码,对内存使用了mmap函数后:( ]% |3 _$ T' n' a. Y0 a
#include <stdio.h># T) _0 g" Q. b
#include <unistd.h>- ?* G- g+ ?1 E7 t6 b; y
#include <sys/mman.h>
; a2 B2 s0 X& u3 W# t* E6 W#include <sys/types.h>0 f6 e( ]/ [) @* H. l, l( B* @/ w
#include <fcntl.h>
( P8 M1 P8 q ?5 F6 `9 \$ k
+ f ^' Z9 ?. O! D/ X8 u#define SHAER_RAM_BASE_ADDR (0x80000000)
0 r7 {" S4 y) R0 x0 U5 E) H- u#define SHAER_RAM_SIZE (0x20000) # Q2 b& L3 I8 e( z( j: g D
3 ^+ H+ w% r- g7 T j% [* f. Ptypedef struct
7 q" b7 Y7 r/ G$ k, g{
5 t \8 q2 R+ l0 A unsigned int a;: k+ Z9 o: c9 Y* {: \! x$ ]- k9 K
unsigned int b;
) O5 y2 e) j: v' S% \/ Z, m unsigned int packet_cout;
& E1 j+ J3 C J+ X" K! x: A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; Z& u5 r3 d% ^* d" J$ g; l
1 n1 ]' s8 I" G" \( o4 d1 R$ A
void read_MSG_buffer(int *baseaddr);5 t1 _4 h8 s! G, l; ~* ]
unsigned int count_copy = 0;) Y7 |6 P% t" U
, I9 E: E- f- iint main()
4 g* k/ _$ E- i) s+ f( X) N$ p{; \4 J* f7 l' [! R8 ^( e
int fd;
" g' { j: L7 N* o% _' T int *mem = NULL;/ j) |1 N+ P3 {4 d# Z6 T. N. D( }) S
3 e t( p7 s# c2 K, K! e9 U1 N if((fd = open("/dev/mem", O_RDWR)) <0) ]5 R& k; [" C$ B8 _
{
7 Q: a) p" X0 v9 p perror("open error");
) D+ n$ V! r4 J9 d- t g" j return -1;# B0 D H. C' L/ F
}7 g5 J `7 q2 E X; h) I
5 y8 n: ^. [9 _+ }# L' I' P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 X8 s+ y# J: W9 a3 D# c3 n: J7 X& C' [ l# u2 b- ^
while(1)& K: H& x H& z8 O6 z, ~
{
+ {* r* G8 L6 s' y read_MSG_buffer(mem);( m' \8 s# k3 L" R
} 2 o, ~$ h( h/ l' E9 o. F: I4 k
}
' G6 v, o7 |1 N- s7 |" u ^' q1 z2 F) I; `5 R2 v4 L
void read_MSG_buffer(int *baseaddr)8 r4 h' f: M r9 j! ?3 [% }
{
" {1 [# [# ~: P1 E) R pRX_MSG_PROTOCOL pshreRAM = NULL;) X/ k {5 P i
, C& d; B/ k1 W4 _ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! j( |6 N k! m1 E9 x* q: u" V" P/ v+ ^* W. S; O
if(pshreRAM->packet_cout != count_copy)( ?- s2 ^% T3 f/ m, O: |
{
, X4 z9 L* J; G0 m T# u4 I v printf("a is %d\n", pshreRAM->a);
w( P) J8 X1 n+ ~2 o: t printf("b is %d\n", pshreRAM->b);
) E1 S. i4 `1 \3 @& g2 c/ J printf("count is %d\n", pshreRAM->packet_cout);
3 p g6 P7 {; D( g2 K: [9 m% x1 m count_copy = pshreRAM->packet_cout;6 G/ j* i4 r3 S1 ?( i, s
}, C5 `, ^* d5 R3 s
else
: Y0 J1 w! P, ^7 [0 c7 R {
8 B; e& J4 x# C7 c printf("No effective message!\n");) b8 \9 o: u$ m5 M) w
}( S. H2 a/ V7 ~) l" _1 o- i
}2 p. w; {3 |1 ~6 J
& W7 {; W' g4 V2 Y# _( h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ M3 A- u- @# t \1 J2 q+ A: N+ [: O: {0 J, _
8 o& `0 \( p! P$ M5 l, V& _- c3 F: }# H; e! n1 p( {
6 s7 t. y% I% v) [0 D |
|