|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' j2 l c; ?" t2 z
5 b/ Y! w; t7 }: K2 }% H9 @. aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 R7 G, W( _' _* j r& D8 ^#include <unistd.h>
9 x4 o* X- v* {+ @8 B+ c#include <sys/mman.h>
* ]/ R7 |) G% o$ q' U( ? l#include <sys/types.h>
5 ?2 `1 n) i' }! W! D" C#include <fcntl.h>
2 Z8 r4 i, V( j( H$ q5 o8 i
& C1 g3 J7 W) Q1 [( A! w2 n#define SHAER_RAM_BASE_ADDR (0x80000000) 3 ^/ o+ n3 f9 f
- d# X6 M( W- v# {. T g
typedef struct
' w; @0 B& b' W$ {1 M$ U2 m* i{
. A8 }, g# f# q% g. ?, t unsigned int a;
4 y8 Y; X" C" f; K4 {' k6 ~4 H% g unsigned int b;
8 S* o- Q0 D) O* |% _" N* q unsigned int packet_cout;/ b, R/ c. f1 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% i% a' v0 F2 d' ]: `, D0 Z- x4 ?3 x5 H4 s3 P+ B) K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; U4 V9 m7 m7 p8 Y x- N
unsigned int count_copy = 0;4 K0 \6 K# x6 ]8 p
/ p8 `/ d7 C. n: D: c0 u
- B9 y9 t6 r5 x3 Z3 @int main()
( @: w9 D6 I" h$ u) Q{
( _- T x6 }* w O6 ] pRX_MSG_PROTOCOL pshreRAM = NULL;! ]" f! N# I# V) q/ E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, e8 `; c7 q2 I8 W% [$ t! m2 ]4 [6 N0 {8 t0 ]. H
while(1) G }6 N# l% c! _/ M
{
9 z o5 r5 b# V9 N" b. I read_MSG_buffer(pshreRAM);
" N% V$ K+ X. I' }' x; a' M }
: D$ Z- j- F! K: k}
' D! C/ j1 f) N" l( ?% T9 Y; T% \/ g- F
" Y0 W/ \- t- u1 A$ p5 ]: B. `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' u! s J2 R$ {2 Y
{
1 {( f3 p" e! _* _ s1 _ RX_MSG_PROTOCOL buf;, X% e! q1 s- K# F. Y5 |* \9 K
+ e' Q3 j0 u7 M+ f& \ buf.a = pshreRAM->a;0 p7 f2 w3 H' n
buf.b = pshreRAM->b;
" Y) `2 P" g7 b9 r X buf.packet_cout = pshreRAM->packet_cout;5 o h" o; s+ ~. I
7 L+ F& V% m* q! o+ d: N" T
if(buf.packet_cout != count_copy): O/ G4 U; n5 [0 @1 I
{& a8 d. X. l6 b' u8 c
printf("a is %d\n", buf.a);
. n! ~0 I( L2 R6 p7 h: o' y printf("b is %d\n", buf.b);$ G8 v" f- ~9 }
printf("count is %d\n", buf.packet_cout);
# k1 ~/ M8 g* V: t0 | count_copy = buf.packet_cout; V) n- m2 H# e9 z
}* i+ L5 M( c" U4 j3 G$ B8 Q
else
& ]% F9 V- q. K0 D1 H6 X; c {
0 m/ m% ^7 \# A9 a- I6 [ printf("No effective message!");
1 O0 z# j' f+ V0 J2 K }/ [8 D1 m! q( i/ X( f3 L1 R. G
}
$ V5 L2 _3 z& `- `$ Q, t1 g2 r+ r" _0 m$ N1 }: {8 m, o! ^
& w q$ _8 N7 E0 w/ @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' ^( i+ \* [2 P% R: Q8 y使用下面代码,对内存使用了mmap函数后:
+ c& J$ I* W6 F: ~0 l: E, ?#include <stdio.h>
: g6 q; P% d9 j2 f9 l3 C8 u#include <unistd.h>
) `7 O2 M9 e6 I; v1 V#include <sys/mman.h>
N+ f, A2 j! R. U#include <sys/types.h>
8 y! s" R# [9 L! r) u$ r# D#include <fcntl.h>
; H$ ]& d, h+ y9 j3 F+ {
% d1 P9 O9 h: Y! t; v#define SHAER_RAM_BASE_ADDR (0x80000000)
0 l( G' N% F Y# w) F) R#define SHAER_RAM_SIZE (0x20000)
- `9 j8 n4 w5 L- B$ b# G: ]" F3 X% q
typedef struct& i; S! o* l6 ?0 J3 R- O
{
Q {3 Z- z) K( R( _1 G9 K unsigned int a;
) Y, P9 d3 C: k unsigned int b;- K) M8 j6 E& m
unsigned int packet_cout;
9 q/ }6 A1 _# j+ r! D$ |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ Q: E* m/ x& Q, E$ L5 W
* V- p. l) f* jvoid read_MSG_buffer(int *baseaddr);
/ I( E3 I$ m5 G: V4 Kunsigned int count_copy = 0;0 O2 D" v) y; L; H; B9 w) U) G
. v" w l$ v. `8 ^* F9 Xint main()
1 }- o. m1 i$ ] w7 {{
0 G, ^0 W+ q. _" Q0 k: c* y int fd;# c9 E# T; I1 Z7 G/ Z+ i
int *mem = NULL;
, m) `) o: V6 M! ?
. X+ [2 g0 s) W7 N6 Z8 R if((fd = open("/dev/mem", O_RDWR)) <0)
( X, v( |; w4 i8 G" v7 g {
1 Q8 T0 V% V0 [, h7 S( `4 x perror("open error");/ z% ~. X1 t. s6 _
return -1;
4 y8 t6 p) U3 }) D5 A3 _ K+ A }: G0 K- b# {' F T9 w
3 d: ^0 U& k* i3 _5 l8 {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 \ \1 Q" F9 u3 l! d- A" p+ C2 o
" s9 Q, `4 Y4 E6 @; V7 d& a% Y8 b
while(1)3 U8 J, l& G. ?/ z
{
- ~% ~! {, L+ B' t read_MSG_buffer(mem);3 L" l- o. \3 F+ G
}
; G% O$ ~+ \3 N/ N2 @% q$ `}
2 z- _. y: x% j6 B2 \ L! i' h9 S# ]' J% S0 E+ P2 u
void read_MSG_buffer(int *baseaddr)
$ }. T) i; R) N6 k. u{
x, S/ E, h" z$ d pRX_MSG_PROTOCOL pshreRAM = NULL;
% O: N! G" c% m$ k) t5 j! N- q" ^- g: y/ S5 X y2 l4 m6 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( S2 b" O* N' {/ w) x0 R0 F, w% ?, q6 t& Y8 V1 q( U. H; m7 r
if(pshreRAM->packet_cout != count_copy)+ p( h4 l. Z5 T, D. a4 {7 n
{7 |$ p/ }1 ^2 R4 G' u9 k0 ?5 D; {
printf("a is %d\n", pshreRAM->a);
# N0 \. Z+ s" n' Y" p6 N0 o printf("b is %d\n", pshreRAM->b);# @3 G) d7 p: C. O# L* Z
printf("count is %d\n", pshreRAM->packet_cout);9 I& v3 O" W# R- ~
count_copy = pshreRAM->packet_cout;/ E b) f- K v" f( v4 i( O. L8 ~* p0 c
}
" v9 N" @8 G4 u% ^4 l3 C, b else" X/ J- c- T0 Y0 a6 n
{# v& f/ C6 M! v: Y* l
printf("No effective message!\n");
! M& W7 D3 c! e2 c# K }
! V9 I& M9 \6 k$ s) X/ ~}5 G9 ?$ J' X$ `, e' X9 x: x
F3 f' p5 s$ K. K4 @) T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 O$ L+ u1 c1 _1 k9 W0 @. \' @
& @0 v4 V9 n) Z4 ~' ]8 n* _7 z0 m4 U7 I( h# {
- F# _$ l" q" P" S0 C
5 W1 P8 M" B3 J1 @ |
|