|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 l1 G9 s, M4 l
2 ] C9 |3 s) u( o* Z( LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) W8 B- t7 r( |7 o X#include <unistd.h>
3 J) f0 _. b! V# Z1 T#include <sys/mman.h> ]' v! p7 d/ @$ @; m" d
#include <sys/types.h># O2 g& N. X( H9 V; [
#include <fcntl.h>
$ I; q3 U! y1 r3 d& m) z8 ?4 h3 x& S( W! x7 a
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 u" d5 ~' b; H: m; H
6 N: T6 K* j6 x- V( T" q% x( j
typedef struct
/ y2 ~* u% @4 a# E: F) `2 y3 s1 h8 Q{
* Z1 F6 }4 |( `# h! n: }2 J unsigned int a;
6 W0 u. l+ h9 o1 m unsigned int b;9 ]& g! o2 Y8 a
unsigned int packet_cout;
9 ~/ i, a$ W$ g9 i, n- F% K& k0 t3 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" q* [9 x/ n1 _* ^- k; A; t! h7 Q+ L
' d2 p6 l( w/ J, }; _9 m, `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ @) P7 _ @, ]* @unsigned int count_copy = 0;
( F* x3 Q" H- ?7 Z, g$ r; a/ k7 q8 u5 f6 b5 J4 q) n# V, D
: ]/ b7 x" k, s( r/ R: ]- Cint main(): O9 M" K8 ]6 d/ ]; C( C1 C3 w
{: c* _) M; T4 E0 F9 V5 U3 H# n& c
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 z4 Y( P* O, |3 q6 g9 U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 m( L; T0 x+ A$ { [
$ n% B$ ^- s- L+ \/ j3 y while(1)3 p0 }" n& q) W( f. W2 t
{2 y) q+ ?" C4 o0 \, p4 B
read_MSG_buffer(pshreRAM);/ C5 Y. Q% B1 D! p) {% @
} 9 q# S" v% C7 R1 b( P7 V
}, s4 \0 P8 @. }4 O4 n3 G( m, ^- Z r g
! l) S: a2 o, T Y* Q9 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 Q: X* }0 B% i
{
5 I! q9 v* M d' `3 t: y6 B RX_MSG_PROTOCOL buf;' \8 R# I1 M# b' l" ]
! R8 t- }' b: _) x3 l& \ buf.a = pshreRAM->a;
! \- v- L# y' {- l5 N1 V buf.b = pshreRAM->b;. V9 N9 x" c+ a m7 F
buf.packet_cout = pshreRAM->packet_cout;
. }% E2 u' S; b- G
; t7 T3 |& l2 k! W. z6 {7 y- h if(buf.packet_cout != count_copy)
& C! d$ |. H+ B- z0 Z9 m {5 I* C- q& m% Q8 H7 r
printf("a is %d\n", buf.a);! {, D3 h! \1 @4 U
printf("b is %d\n", buf.b);! W3 D$ z# |, w3 N. V1 b* L
printf("count is %d\n", buf.packet_cout);
6 B; K* j; x1 a) P$ E count_copy = buf.packet_cout;% k4 f Y9 f2 j5 J
}8 [7 f( c7 v7 D: E' a
else
4 i. j) `) E: q3 Y! V {: G! Y" h9 m- ~+ K
printf("No effective message!");
% `# l) g X d, Z: Y }/ h4 v: z* B) D$ u4 {
}
, d/ s( L" A; t( [9 M: Q; [4 D E
4 Q- Y4 m3 n6 R: C8 V! N- a+ N: A% w9 ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 `# W: o" X$ e使用下面代码,对内存使用了mmap函数后:
% @- p( Q& P- _#include <stdio.h>9 m( G7 i7 Y* f2 q, w* ], V
#include <unistd.h>$ N" Q) J( X- v. i( G
#include <sys/mman.h>
6 F3 P& m0 c5 ]% y4 j" T#include <sys/types.h>
( g! o& a L, e9 ?: O4 i#include <fcntl.h> K0 H; U) \2 w) K
, R) k' b: |% P& `5 u
#define SHAER_RAM_BASE_ADDR (0x80000000)6 p J- s8 H9 S h. W
#define SHAER_RAM_SIZE (0x20000)
& O' v% ?& e' D$ A; f
- x6 G) V5 H3 d; Itypedef struct9 r, k, r/ g" o1 D, y& q ?' _
{4 t) ^8 D, v+ p. R
unsigned int a;
7 K7 n+ e7 [9 C7 z! J& o* L unsigned int b;% A& o% M* \( Z! C* D
unsigned int packet_cout;( n! Z! ?* A* E$ ?& B2 ^% a5 F1 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 @) V B% k6 k9 E. \
1 ^# Q; c. D' Z" c) q- K! ` k. [void read_MSG_buffer(int *baseaddr);& c7 d m1 c: F, v6 K
unsigned int count_copy = 0;
! E0 e: J' m$ o$ R9 b- g2 X
; u7 R% ?8 n' ~" j) pint main()# X9 V) `$ ~' N) }/ E4 {9 X' o
{
- \8 V( C" S/ E! [. P6 k1 N int fd; _" d/ t! Z' i* H$ Q+ c; @
int *mem = NULL;
$ Y7 ]" v0 j j. h, y | w* a& ?
; ^( x' h) ]1 [/ v& w' Y3 ^* d8 J if((fd = open("/dev/mem", O_RDWR)) <0)& V: Y, S* Y& j7 e5 d# t' a9 I1 m; ^
{% M6 d9 @5 Q7 y: G/ J3 D1 L% r: ?
perror("open error");' T+ c% V2 J1 f. E3 o
return -1;& f( x4 _8 ]4 e
}( f4 h" `, Q2 l6 _ a
+ J5 @) x0 Q( V% H+ y! u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# F( m+ [/ e5 v1 `# ?0 x
! [, k, C( s9 w, Z, G6 { while(1)6 o/ {: M2 g) C" V# z
{: D! P7 h/ q1 m1 R& Y h
read_MSG_buffer(mem);
" h2 q3 ]2 t; K2 o& ~( p } , k! D5 _$ `( e( e' R/ N2 c
}' ]; J* d3 h* K/ D+ x- {# P" n% p# w
+ S' F, s6 S8 B6 T, q
void read_MSG_buffer(int *baseaddr)
9 x5 z3 @4 k$ D8 i{
3 C& r0 l7 ]0 j7 {: f8 f* e3 { pRX_MSG_PROTOCOL pshreRAM = NULL;! f) e" ?. m2 `8 U, S. W: @. F
' r# ~1 w6 U) i; @2 b% s5 Q: h8 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 b% r' z+ K8 o+ m H1 }1 h; a$ c
4 g3 i* y5 Q5 u2 h9 o- v+ V$ R
if(pshreRAM->packet_cout != count_copy)9 Q8 ]/ p2 P: M6 f+ e) ]* ]- F
{
1 } e1 @8 I( M& | printf("a is %d\n", pshreRAM->a);5 a* u/ ~: f9 B
printf("b is %d\n", pshreRAM->b);
; ?2 U; @! k. v3 D3 u. e: j printf("count is %d\n", pshreRAM->packet_cout);
0 C2 s6 \# h7 K* J count_copy = pshreRAM->packet_cout;* n: a y# L2 G
}
! x$ h1 h; C) z) O% u6 g else
' A" l8 {! R2 x* ?9 A {
, A: ^$ ]; V0 R' `5 l printf("No effective message!\n");
: d, |% @: l: x$ E( z7 s% Y" B }
& `, y# A# N; @: S/ V}3 N$ ~. O& A+ y9 d& e
9 z1 j L" k f) [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 V, N3 a# v8 B" F7 t+ T
5 e1 ]% _" Q' o# O4 x- m: x8 u
; y" a( c0 Y# d
! N5 X( o2 I0 j% i! j, X" Y5 L( }1 }" t) O5 `4 M K0 I
|
|