|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - J1 i) O/ `. z/ {* n
8 H% ^' v) }" T4 ~. W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ r/ \, G7 Y! b$ t
#include <unistd.h>
+ i4 p* R' }1 o3 Z1 s#include <sys/mman.h>& i% e1 a; A# ~, q
#include <sys/types.h>/ ?% N8 h+ K/ q `0 h' {
#include <fcntl.h>8 Q2 S0 B$ j$ |' f/ d |
8 L% m! i! a9 m( J7 \# \2 K- z#define SHAER_RAM_BASE_ADDR (0x80000000) . K$ z' a) R* t
" h9 g6 p/ ?' Z5 y9 f* G& h2 qtypedef struct/ |9 ~" |" w9 ~1 _! D
{/ w7 U, m4 r0 P1 c* N3 r
unsigned int a;
$ j* k B% e% y& K! i unsigned int b;
. _, J) j. C# T7 K% D unsigned int packet_cout;& a. ?& N- A6 W" ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: ~5 t2 }% Y/ {! D1 _; O9 [# f
! x; r% U9 s b$ ~- I8 X2 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 D3 t- J+ a2 V+ ^4 \ i
unsigned int count_copy = 0;
- ^5 _3 f& a, @& R) l" `9 ^# }
! w1 D0 `! B) `, X9 T+ T4 S9 ]3 F+ n0 Z# @1 B T
int main()
9 C2 Z. r2 Q7 E( t1 O{
5 q/ m& L% a3 x pRX_MSG_PROTOCOL pshreRAM = NULL;( s! Z: F# V1 U) [+ l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- v. w; T) J( r% x4 e# Y( E7 W% I4 D9 D/ S+ _$ E# J& m6 a
while(1)
( r) X1 o% q: p2 {" \ k4 g) D {
! W) X: M9 h* W0 S2 w' W6 q4 a read_MSG_buffer(pshreRAM);6 g4 x8 R% o( K6 q4 A$ ~
}
. {, O* ]$ a. ?}" Q9 H9 X }% ]5 Z9 i
. P `3 ?# ]. |' l3 H0 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); \ b7 x; d$ m& T1 g, q# [3 b5 m
{3 E+ S: a5 S$ G4 K$ d; k& m7 n
RX_MSG_PROTOCOL buf;
) g* b8 n/ a- M/ {& `6 h3 N3 S
: }! H, Q; c* c& s+ P buf.a = pshreRAM->a;, X6 R( J; |/ h% v$ \
buf.b = pshreRAM->b;: `: _) a, h( [/ v2 a( M
buf.packet_cout = pshreRAM->packet_cout;
) d8 O( w, p: D
6 F0 h1 a; l X5 B- b* J if(buf.packet_cout != count_copy)
8 I+ T7 K; H4 j* F+ g9 R6 l {
' Q4 u( M0 g3 a: m printf("a is %d\n", buf.a);
r7 _: O' G, i4 ~$ U/ A9 Q printf("b is %d\n", buf.b);
1 n3 O6 f; }5 K! n- Q- a printf("count is %d\n", buf.packet_cout);. j8 z; I' b4 a. g9 j
count_copy = buf.packet_cout;
; `2 Q* |5 K! J$ b6 P }$ f2 @% g( X' K
else
1 b2 S7 J1 N5 R) F+ o1 p- { {) `/ |8 j# R/ A- y# s1 i
printf("No effective message!");
Q O! ]& z+ _, F }
1 K4 F/ z; ]2 ^: X, C; T}
/ t2 t' E+ n' k; P, N
' [5 H, s. W* m1 ~) W V
$ A) }$ n! L3 }7 ~0 V9 ^: n' |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ~: g+ J8 t, x8 A使用下面代码,对内存使用了mmap函数后:
. N2 z3 q. A8 W% m, }4 d#include <stdio.h>
8 h/ R) f& O, e# C" p; ~7 X#include <unistd.h>
) j8 }7 R. o; D! s+ N6 O% |( u#include <sys/mman.h>
$ m3 o# E& c: u2 L#include <sys/types.h>2 C9 f0 u2 K* U3 s
#include <fcntl.h>- c: u6 {. ~* I# m' J
1 H' J, X* P( y#define SHAER_RAM_BASE_ADDR (0x80000000)
# u/ ]2 O: U+ `; Z, l#define SHAER_RAM_SIZE (0x20000)
7 V; e9 V5 Q9 e8 ~" {8 f! v) w3 R/ J8 g
typedef struct
3 U" P7 [" N/ v9 I( r5 y{6 \1 E6 x2 q: j8 g/ a' p$ |# L0 |
unsigned int a;* O. V4 @; N7 T- F$ j! p
unsigned int b;5 E% X0 O; M8 \ Z7 y3 G6 A' j' B
unsigned int packet_cout;
. r2 e" T5 `1 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( {& [1 o, j' G1 T/ M1 B! ^8 P* Y, I J/ f0 w4 x
void read_MSG_buffer(int *baseaddr);
( M; n6 ]4 g7 J- bunsigned int count_copy = 0;$ N3 {- S' I# Q( q. { t
$ k, V+ M. R# T, A# B# ?) G& vint main()( A! J& J! P+ i7 b; n
{3 g4 Y5 v' n9 S, u- C
int fd;5 a9 I8 \: K7 n0 {* J! F
int *mem = NULL;: Q5 e( u: _0 V& c
9 Z, K9 ]( L" B5 G
if((fd = open("/dev/mem", O_RDWR)) <0)
s4 f& r- U' S7 K+ @" Q {; k- A+ L& U% h" g9 ^; L7 k+ ?
perror("open error");! D F5 i' x4 s2 H% A: @
return -1;
9 `: T. @# Z4 N0 L! Q, q% S }
& z* u% l. w- F* z# s, p: } [" w' `( |! y' P7 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ ?5 m1 j0 F+ Y6 Y+ [1 U p5 h4 c8 b$ g& a* l/ Z( w; M2 \( a' J4 |
while(1). v/ H3 F. N% W$ [4 l6 A* ]" y3 z
{
9 R' I' {; `2 \1 Z, x! H read_MSG_buffer(mem);
) N4 L1 j9 T, S' W' r. S' { } : s, {- ~5 q) e1 e9 ]9 P! T* E
}# c( V: a$ t% c* D
/ O4 G7 Z" o: J( G% L( E F# K
void read_MSG_buffer(int *baseaddr)) ]0 t% Q x' ~' |" B% h6 ]
{
! T) c9 B7 V) \& F pRX_MSG_PROTOCOL pshreRAM = NULL;9 W( Z& k( R7 O A; [3 [! r+ M
: M% n5 Z, |$ c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# h( S. N, K- u4 h6 N9 {' O! W
1 M& S8 b8 n7 Z; B if(pshreRAM->packet_cout != count_copy)
1 b) g) _. S- j/ e8 d o! D" @ {/ z+ j5 w/ i* [) v* Y# A
printf("a is %d\n", pshreRAM->a);
3 B6 M1 ]5 D5 Q ~% X printf("b is %d\n", pshreRAM->b);
9 d2 o9 Z9 L" _9 c& F4 O9 T. ~' S printf("count is %d\n", pshreRAM->packet_cout);1 n0 x/ m+ d. @
count_copy = pshreRAM->packet_cout;
, E9 A4 u. k' t }
5 w2 R3 z" C$ b: I! Z! a+ x1 W else
2 t/ K& D r; s+ g1 q: q- L1 o/ y W {6 U: g$ p7 y) N2 g2 L. i6 ^
printf("No effective message!\n");
* D/ U+ S0 |! r }
8 C3 Z/ ]7 H- a5 d2 u* p}
7 ?9 n0 x3 R# k% W3 K6 e$ p+ v( f! c' j" e6 y' a6 `" N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 ?* u" I- G# U/ `, G z Z
0 k: s V* N3 t9 X& E. S4 q: s
9 B$ G! \7 m3 N+ @% p5 P% W8 ^, i9 V$ d' X9 T3 q/ j# p+ w
N) ~* ?' K0 H5 I; @
|
|