|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% F9 b( `; T% T `0 m+ d6 A
4 Y, P% U8 ]0 x/ m/ }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 @; d0 H; R2 x1 L2 k#include <unistd.h>. P) M+ _( [/ R: L7 S0 C
#include <sys/mman.h>: C/ V0 Y) K9 b: B/ G$ R$ K
#include <sys/types.h>5 _+ r8 k1 J0 a# G
#include <fcntl.h>
1 _" Z1 x% x5 ~2 h+ ^
A0 G. @5 ^) d2 w0 ]1 I; X#define SHAER_RAM_BASE_ADDR (0x80000000) 2 s9 q# F( X3 F1 G$ K
- E8 O6 g1 l* F* x/ ~! r7 ytypedef struct7 J4 m0 N a" S+ K& \
{) E+ @" E- _9 |0 d3 ~6 i4 X: e9 x, V
unsigned int a;% i' o3 y3 X7 }
unsigned int b;. t8 W2 `! g: ~1 B% @6 ^! W
unsigned int packet_cout;7 m$ G5 [1 a2 E$ B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" n$ ?- W2 `' r; o y+ T; }9 b+ z9 q& ~) j0 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# B- J: l! x ]' ?" l9 V0 Y# [
unsigned int count_copy = 0;
$ q: y/ w4 r' t4 j
: S% v" G. j, K2 ]8 P% r" z
, G* t$ h) W" P/ V. ? K( Cint main()( f% \% r) C' N! Z
{: N Q3 r1 p6 g7 B. t
pRX_MSG_PROTOCOL pshreRAM = NULL;9 G+ U# w I3 v; I* b N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: A* a' ~' {; f3 _' Y" ^
9 c% \$ N' ^' ]* X% Y. o4 z while(1)
( ^' R7 ]- I, G- u* D {
$ F. _+ ?% T0 G& t* }+ `5 w* b read_MSG_buffer(pshreRAM);
& ^) U: D. C4 b) ]8 a; g, o2 t3 q }
$ d \/ D7 i2 h! ]! U$ O2 C# o}
]+ P" E& X: P% r7 X$ L( P) v) g# e
, ?8 C! R0 V# X# Y2 a/ C/ Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" s5 y5 x6 Q9 U$ \ V: ]
{5 p; w0 D* U$ k' e3 q2 [8 S
RX_MSG_PROTOCOL buf;
/ ^& t1 D8 @, N1 d6 a8 Q $ F- l0 C9 t/ f9 t, A) A) e. w
buf.a = pshreRAM->a;
8 p# F6 u1 _ O* u7 P7 ~, K2 r- r buf.b = pshreRAM->b;$ T: ~ y& s: i1 R7 W
buf.packet_cout = pshreRAM->packet_cout; `+ f; @+ c0 }; e7 O$ t9 v' _
; n- }% U9 m" U$ [" S& |9 y if(buf.packet_cout != count_copy)
. O% q$ @# j/ {" n0 K0 }, n {
2 |" V# r$ b; j' ]7 j/ R printf("a is %d\n", buf.a);
* O7 _8 C6 V( ^3 V+ F' z# ^ printf("b is %d\n", buf.b);# @0 {1 P" |6 c# G; X M& `
printf("count is %d\n", buf.packet_cout);
* C' x7 ~- m8 T3 ~ count_copy = buf.packet_cout;, N. j: l; G L0 Z" q
}6 i) d8 v2 j' T, x4 C
else) `" I7 T2 Y' D. C6 t
{2 V0 K2 w; H( p: i- ?$ K9 _1 p H
printf("No effective message!");
3 u7 b- N: ]" p3 ^% L4 w }! j3 P7 M4 U: K' l8 H
}& U$ A' n3 T) F/ b' v( Q
' }0 H! F$ f! o0 P8 J
( Z; g3 r8 l% a' D! M) }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 f/ b# `) C) v3 ]$ C/ m使用下面代码,对内存使用了mmap函数后:' h3 e+ M8 E) U
#include <stdio.h>
! M+ L0 S1 W) V8 T, r* E) b#include <unistd.h>
2 A7 c5 u# ^7 x! |% Z#include <sys/mman.h>
$ [0 ]8 k+ ~* f! |+ U' d# t% d#include <sys/types.h>
. n7 S1 j# ^- F# }) T#include <fcntl.h>. v3 X$ H% D0 Z0 C8 A
7 C" S8 _+ h* D {7 ]; G: N
#define SHAER_RAM_BASE_ADDR (0x80000000)3 Q1 q, ]- Q9 J4 w" `; Y
#define SHAER_RAM_SIZE (0x20000) 6 [; g1 }+ k" h( `0 I$ S
- T/ T- ^# C8 Q
typedef struct
- b$ r8 S/ K# e+ i* c0 _0 O* ~! z{
! K3 ^5 N8 [8 I4 Z unsigned int a;/ [( h& d- L1 {2 ?. i# w3 S1 L3 y8 |
unsigned int b;
) o* W6 e a9 l% @/ U/ b( c unsigned int packet_cout;
A+ i% P& |+ h( p; x7 [+ V& O3 w0 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; f' R" E. I6 m j/ g
$ J$ \3 ]/ g7 M8 T
void read_MSG_buffer(int *baseaddr);0 K+ A; K' p& `
unsigned int count_copy = 0;
* g h) J a7 H/ Y: T- Q! K
( u" v: D0 l1 E' V, l. V6 wint main()
" }# ^6 X# _0 u{; R+ `8 ]9 B- x" W5 S& a
int fd;
& v* @$ |) x9 D4 [ V int *mem = NULL;6 }! N- Q8 y. K0 o7 d* g# ^
: E/ i8 d0 f- J7 o y if((fd = open("/dev/mem", O_RDWR)) <0)
- A) w$ ?% u( @% f; O {
7 x( a+ j9 U& H- u' \: ~( J perror("open error");
4 K/ j$ H9 { r return -1;7 W, f7 y2 y* j3 {* v& x; y( C1 r
}
2 f- u* J- T5 n7 x# X* o 6 q. p" d* ~5 y3 V& v! u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ [7 D# S. o* N- R- O$ [) K9 L2 f9 _7 Z# K# I, ]
while(1)
7 c$ K0 C- J8 |- z2 b/ r {& ~2 t, U9 P: N5 e
read_MSG_buffer(mem);
/ ]4 M7 a& u) B2 J# K2 Q1 G }
6 R8 D2 O$ B% [}; z; f5 _1 `( l
h' o( w. h$ }; m" W( t' j) \void read_MSG_buffer(int *baseaddr); _) N. ~! n4 i2 i
{
- @# f! A- {1 r6 s% `+ [0 W/ l# \ pRX_MSG_PROTOCOL pshreRAM = NULL;! \4 t) l( _4 y0 \+ x
/ F5 @* U" p$ p& [, e! N0 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 W/ u2 }) c. {' A! u
" L; i! w( j' p$ l5 y" @
if(pshreRAM->packet_cout != count_copy)
' f% g: w' T s. N { T9 g" [- q* K! J6 l; r. l
printf("a is %d\n", pshreRAM->a);
; I. a) g- J) [, u- b% M1 ^) M printf("b is %d\n", pshreRAM->b);# p" h9 Q( u! F- c+ I
printf("count is %d\n", pshreRAM->packet_cout);& z% M; y: k0 g6 O# M& x% P
count_copy = pshreRAM->packet_cout;
4 X- r0 @; K3 S0 U2 _4 w: j7 ~ }5 `, S& b7 r1 F; j+ n ?7 E3 h
else* M4 g2 \2 s8 n( L
{: K0 ~8 F3 f o
printf("No effective message!\n");+ H: A* f% W* d$ _
}" F4 C3 w8 L+ X( o( p7 [. v
}
! X7 {' ?" t/ G6 p A0 T+ ?/ C" B5 [6 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? S6 K9 y; d9 s ~, F2 w
2 n C: u& p7 Q d+ N# G" P9 g' P3 L, r' @. g, p
1 I9 \7 y% B6 ]) F3 d
* n5 F; l8 P! I; K/ y8 x9 r; _ |
|