|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : p7 c4 j+ H+ l( t6 e; b8 k
+ u4 S4 s* P2 F) D+ T4 K# U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! b( m& K2 s6 C9 B% x2 h* M% b2 D
#include <unistd.h>: v2 U2 U' C, c4 t' \! |4 D6 d7 P- a
#include <sys/mman.h>6 r% ?9 j* P A. m* v' R- H
#include <sys/types.h>6 r, o: y- q8 T, ]. S% o
#include <fcntl.h>
6 x h* O7 M3 ?/ m% {1 V. s' p; j- `) |* i; Y. x& u& W
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 f7 V( a1 a ~/ M7 t2 X# P2 o3 W9 q
( D! ]4 S4 b8 _2 @! l/ c% x5 Stypedef struct( [+ `' j5 T( |9 P4 c) c" P: X
{# \% }3 h7 v/ P4 v
unsigned int a;- _6 M: f4 T0 h' ]
unsigned int b;
9 b5 b0 H. t' J unsigned int packet_cout;" h' o/ D" N+ e* h: P* f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' J/ j. o3 d* Z9 J
% a* i( ?& M3 E% T: Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 c4 q: T" d- M' ]: W! M, T
unsigned int count_copy = 0;
) n- d V3 A$ J) f. u
! c$ }% _! _( N S& k0 V2 B. g2 S5 s2 d; P: m% Z) J( l
int main()5 a/ e0 j9 @) E
{
+ l( \: ?2 n! z) Y& n# d! b pRX_MSG_PROTOCOL pshreRAM = NULL;9 L2 B! C* `1 [8 u. D! N9 L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# k/ Q, b* l% L* T& M: S$ _
; J: N; T: D* h+ i
while(1)
( z6 @9 w7 P* R5 D6 h) C" f% f {
9 B z: G! E+ K. y3 I! M read_MSG_buffer(pshreRAM);6 q: [& @0 j' @; P
} 8 e0 j! z" }& P2 v8 b8 s
}; f" x7 t9 {: G
( j6 P1 C9 A8 T7 J. Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( V: Z8 {- \( S# j m( f) C& \
{
/ M# Q( Z- U* Q! [/ d2 G RX_MSG_PROTOCOL buf;6 d# ]/ z# F9 f
4 ~9 ?8 Q, v; u" ? buf.a = pshreRAM->a;
8 Q% i K- ?7 @' y* D' L" @ buf.b = pshreRAM->b;% W0 x2 l2 l g+ m: n
buf.packet_cout = pshreRAM->packet_cout;6 u- U) R" z% H$ [- [+ Q, a! D
+ z$ b; S* g A; t8 z: n
if(buf.packet_cout != count_copy)2 A+ c6 i9 z& G( B9 I; b- M
{( K8 Z2 S1 ^7 @ q) j) V
printf("a is %d\n", buf.a);
( s+ [& {" T# N3 ~6 f printf("b is %d\n", buf.b);. Y" H$ Y9 }) l9 V
printf("count is %d\n", buf.packet_cout);
0 H! Z3 A* [1 {8 I+ {2 I count_copy = buf.packet_cout;
. j; ]2 M+ o, d7 }' A& s6 C }$ Y# i3 C! i: J3 C
else
; Q9 K$ | Q* W/ F, V7 m { g* [6 C6 T) e0 l8 ?
printf("No effective message!");
5 i4 w# K7 V' e }
1 k4 q K8 X4 ?}
* X' r5 e5 k: O: @
+ R& a% f/ c; L& l# |5 W0 ]! S- m4 M4 s, r& B# {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 L9 u0 F% U( K使用下面代码,对内存使用了mmap函数后:' Y' a& H0 u0 t+ Q/ U& l/ Y6 {
#include <stdio.h>
Z* O. P2 T8 l2 k1 d#include <unistd.h>; _& s. p5 u! O8 e) D2 v
#include <sys/mman.h>8 l/ I1 E7 k2 o# z# e6 z+ s
#include <sys/types.h># S6 _5 X+ Z' @# P; ]. u
#include <fcntl.h> l! q' t5 c( Z& m) q, }
3 \: C& x2 c2 ] }#define SHAER_RAM_BASE_ADDR (0x80000000)9 A2 c' Q4 g) A: n% \4 q6 R; H
#define SHAER_RAM_SIZE (0x20000)
9 n5 u. x* W+ ^3 W* b
' k* u7 ~2 ]+ O+ Y# b" ltypedef struct6 ]( {! H# r# Z! N* w- |
{ ?! E/ \" O) X/ r
unsigned int a;; z2 c T$ [* u% ^, n& N
unsigned int b;7 r; x4 M4 C* d a9 }
unsigned int packet_cout;: y& c3 K) q0 j% F% {+ ]2 M* J z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" K- k& I7 X5 f! C
& w: Z" D c4 T, Cvoid read_MSG_buffer(int *baseaddr);
, k; T! P& x# ]# iunsigned int count_copy = 0;
% T" l& V4 g+ o Q2 Z0 P3 B$ F
5 h- {4 t6 g# h2 V d, Q: rint main()) [) h- o' u/ J( _- s1 G. Z$ q
{
: t6 ^1 Q$ O/ k3 a int fd;
0 @5 s# V: H/ x# C% U int *mem = NULL;% d/ a v, i( z4 z
% F8 d. N2 H1 R6 k4 d( M, s. |* k
if((fd = open("/dev/mem", O_RDWR)) <0)
6 N" n# b' o- R {. L' g2 v4 w1 o, L: ]
perror("open error");
/ o( M" R2 A0 h8 q. @5 O9 ? r return -1;0 \' I$ w- y. a; T8 a
}4 k9 c. ~9 y1 M: j
! K: M! P2 n/ E mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- S) g4 @5 v: p9 S$ k8 ^: E- m" w
while(1)7 D* [( n. _" S X
{
, R: M9 p: F7 w! M' N1 k read_MSG_buffer(mem);
8 ^1 _' ^4 T) m6 I4 G& n! s } + @2 B& i" x/ ^. ~9 \, d
}) m; v# U0 c& a; t/ G
' e5 B3 ~1 U) t$ K0 L/ F; e) I9 A5 _
void read_MSG_buffer(int *baseaddr)! ]+ u- W' l4 ], Y5 `( s1 _4 N) [
{
* P8 T/ R6 C) S4 {" m pRX_MSG_PROTOCOL pshreRAM = NULL;
1 G, o! N; s; }: y0 ^
: \; Q+ ^1 S% I( C+ W& @, a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ o. |3 a7 K( J' B" y& M% ?! H' m2 n+ @7 b7 n/ T' B
if(pshreRAM->packet_cout != count_copy)
# L( l" \ G7 N5 c: h {/ D3 l+ I/ r' I" }# g6 H: k
printf("a is %d\n", pshreRAM->a);
% C; A2 d5 Z! X, \1 n printf("b is %d\n", pshreRAM->b);
8 j+ v, `1 H& W r/ U" w printf("count is %d\n", pshreRAM->packet_cout);3 @- L% r" p. l' [* }
count_copy = pshreRAM->packet_cout; v2 Y0 |7 ?0 ?- o( B/ l
}
7 _# ]2 t( ?8 n3 b( z6 W else
9 K6 d; J3 E6 ^9 } {2 e8 g# V4 b; ?
printf("No effective message!\n");7 ~% ] d* s* X, o
}
) I* j6 h- Z3 R9 B) R' M6 Y! b}
/ S2 `/ Y; c* Q% ^# d! X2 @" c, H/ j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: r$ ]4 D! t8 c+ Y9 A
! H' z3 v! C ?% h/ C7 G
6 x, ]$ c( v( ~6 z) H6 E5 x9 X/ W' R- b. C; m9 g! t! o
% J/ h( g; e( m* g |
|