|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 t4 N9 ~& z& w R! _
+ O9 }. o4 o' W' h. h0 E6 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 c- ]8 T6 {( R% D9 p
#include <unistd.h>
, Y/ F4 i" L5 D+ R ?0 W#include <sys/mman.h>5 {! ~7 T/ m) S6 n4 j
#include <sys/types.h>
- H/ N, g5 P/ f' Z9 J% w#include <fcntl.h>: W9 i; X' U% _$ U6 Z4 p: E
( h- ]5 \' c/ p; \8 V
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 V5 Y- }% K8 O+ u: \- E) K
. ~" J' z& `& E9 g" J+ B1 \8 Dtypedef struct
! y; r% U) @* J. Q{
9 l+ ?- F6 N T [2 r5 [6 k unsigned int a;
: O) c1 J9 n: I1 P8 ^; n% _ unsigned int b;
! ^: l) w2 Z; h5 { unsigned int packet_cout;" U/ V5 _, f- X7 |# ]/ i( W; [* ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 E( M2 q* F) l1 S/ {: M* v# l( ? g
4 x9 i& z9 `4 C7 G$ I2 A. A; U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); t$ |3 K4 @ f+ \4 I, s
unsigned int count_copy = 0;2 E' b7 P% w; } K# X
& R% [5 c# Q( m5 C" r( r: v, V- b ^$ Y- f$ M
int main()
# ]/ {. b" _ T! t{* i* u, |5 C. e. g4 m. {: R7 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;, V* i( F4 e! \3 U( T3 a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ {4 F5 C, B& u9 v9 P% z
6 r. P1 b! t, }, K. c; r- z while(1)* W+ _4 c8 i7 @! k; W7 P' L
{
4 A0 x$ ?" ^0 a: _) } read_MSG_buffer(pshreRAM);
' p( O9 l! F1 T0 y2 Y$ b* t } $ c* y# {4 b7 G/ l) Y# u7 D& @' O
}& L2 m7 d# |% e- ?5 c
9 G7 J5 r, U( j' k* x7 s+ v! ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r" k5 w6 h# _8 A2 F
{
" K# M, u& |1 V# ^& r' M) v$ [ RX_MSG_PROTOCOL buf;3 q5 L1 D- f" y8 L+ B
/ \& E% { B5 }% E+ V5 s buf.a = pshreRAM->a;
; S0 v- Y0 O- j9 p8 Q |/ T3 E9 k/ o buf.b = pshreRAM->b;4 a0 q6 a2 R3 _8 u* M
buf.packet_cout = pshreRAM->packet_cout;7 d6 A8 x% y! \; c; G7 |
% ?; V( }. c+ K6 y8 m( p' x; I
if(buf.packet_cout != count_copy)
5 g5 J$ e. m; s" p {
9 A* E& L6 l5 i1 c printf("a is %d\n", buf.a);0 {8 j9 d0 E* f. G$ n- k
printf("b is %d\n", buf.b);
( W* S s- G( L# ^- w$ H5 E: s, [& a) e printf("count is %d\n", buf.packet_cout);
6 x; n. F* O. d6 T9 R8 [7 p! I2 b count_copy = buf.packet_cout;. n- {1 L4 Y$ r$ }2 K
}5 S& g" {" N5 p4 b
else
3 y [4 T Y5 t {/ W L! r& E& C$ ]6 y* _
printf("No effective message!");
4 B- w" ]( U5 H3 _; ~ }
; `: _( b' S7 F7 n+ D}1 K5 Z1 g1 _- `6 Z2 m, q( E
2 N+ {. b% M2 H& h2 b/ o
8 v1 y7 B- I+ K% H但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) t) i8 X0 }3 A8 U P8 G使用下面代码,对内存使用了mmap函数后:
6 d5 }/ o( G* }( c#include <stdio.h>
+ m, r9 K% }1 z5 P# f/ i3 g7 {, }" z#include <unistd.h>
% _- O5 E0 Y2 E$ ~#include <sys/mman.h>
1 B5 J0 c2 s! W1 z4 M/ Y: m#include <sys/types.h>( x% ~" Z) ? `# j
#include <fcntl.h>4 r' x0 i( M( |. V/ _% f' q+ k* K
5 u: d+ a [$ O. e) t8 D' m. s! }#define SHAER_RAM_BASE_ADDR (0x80000000)* G% T: \; t8 c9 [ D
#define SHAER_RAM_SIZE (0x20000) / T1 ]# h' Z, L a+ U6 K) q
: I. @3 [0 h8 x% g
typedef struct
' j- s2 s$ F2 X9 U. l{% M+ g& M5 _' n3 W
unsigned int a;. p5 X+ S% k" h
unsigned int b;, }6 m8 T! s7 Q0 B8 @7 i% l! d4 f
unsigned int packet_cout;
' O- E |" s; A0 b. E/ q+ V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& D2 Y* F3 Z2 r# U
( h2 O" R, j" n5 c, }6 ?
void read_MSG_buffer(int *baseaddr);
8 k/ E+ B$ c0 o% j+ o/ P" f9 T, p7 S) Eunsigned int count_copy = 0;
- i N- V& l2 P2 o- C8 s+ ?/ g0 [* h) H Z3 U- ^& d q2 k
int main()' a2 c7 Z, W+ {& U0 M& t
{
1 y0 l( j9 A' m int fd;
$ y& s+ M7 m8 f2 ~, [- P int *mem = NULL;& y6 d) R$ _. t1 e7 w. n
8 W+ }# @/ q7 Y; e0 W; P# `# l
if((fd = open("/dev/mem", O_RDWR)) <0)1 @9 ~! r" t8 T6 |
{6 }# G! m1 G3 ]8 h: M2 O
perror("open error");
9 V5 C- y& O6 Z' v return -1;
! a# F, [& G" r9 ?* b' y0 N5 M8 u }9 E8 C% q0 R: Y% T6 Y
4 c0 |3 \( @. F0 N, o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- }+ { @1 l' Q1 k' C3 y) t
0 z4 z" q) h9 X, R9 K while(1): E4 k! n) d; i: u
{+ j4 S, m& \" t' O* {7 r) f$ x1 c
read_MSG_buffer(mem);6 a+ t S+ z6 T6 M' c8 @
} " }; |1 V! \* ?2 Z
}
# h) G0 z( ?$ A
3 _9 z: y" h! h; L$ d+ Y) t2 |8 }# tvoid read_MSG_buffer(int *baseaddr)% {" T* X4 Y, @/ ?. ~& W
{( Z1 t* N' }% N/ [ g$ w; r
pRX_MSG_PROTOCOL pshreRAM = NULL;+ u! N$ H2 ] ~/ _7 E' I' Y% C
5 }- A/ Q7 P( T/ F2 k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: Z4 J( n7 S4 c$ L" f N9 n
2 r# A L) S* H+ j# t2 \ if(pshreRAM->packet_cout != count_copy)
/ D& d; E( n" P {
+ m* B6 ^1 U0 B3 P. }! z printf("a is %d\n", pshreRAM->a);6 P; A8 F$ o( s3 \# `
printf("b is %d\n", pshreRAM->b);
! g. N( `4 q( s4 w$ q; X printf("count is %d\n", pshreRAM->packet_cout);5 `8 \# U. _! l7 O; _: w3 A9 A
count_copy = pshreRAM->packet_cout;2 C( j/ K' v+ X% V
}
( T! [% b6 b' m8 m* s/ ?0 M6 H5 q3 k else
5 K! z2 s% l5 D8 |# Q7 ^ {
' T: V5 a7 i# k5 F3 p8 l printf("No effective message!\n");, E/ W6 e4 i& e6 ?% ^
}
" U; p7 s+ A2 T7 P; A5 T2 J2 f4 M}9 y5 o" D4 `4 H. c) `. E
" w/ Q0 s9 f7 `8 d0 ^2 t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 G% C" [! a* f$ M
' m" K0 g) R, j& z8 \* b1 p
# k! J0 f5 _4 K- {3 L; @& j/ H3 I6 m7 R1 ^2 `1 ~- Y
/ g. T0 S- L$ }% S/ _; z |
|