|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. G. L" k. |2 n6 q2 c% h( v) G9 V" n8 r/ ]5 z6 D: u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, J* Z; P. {( [! ]3 {' T# Z! ^) r" M#include <unistd.h>
7 a3 D: U4 K, \#include <sys/mman.h>6 T W; Q6 v2 p' c$ V: [, ^) A) f
#include <sys/types.h>
1 ]+ Q0 p" \$ b#include <fcntl.h>
, B$ Z6 ~4 K" q u4 Y" R& f" x
' r4 Y: j' i& ?8 b3 }7 F) f k) K% X: ^#define SHAER_RAM_BASE_ADDR (0x80000000)
3 o' l, ^4 v- D# \
g0 y6 }) X6 t' k/ Utypedef struct
* P0 F$ J& J( I2 X. u+ ]{
8 f: m8 ?# t: i) k( v& k% P) y unsigned int a;
. L" ]' P) k5 I unsigned int b;; n) S! o: g2 v! C' x
unsigned int packet_cout;' E. ~3 D7 z* N1 H. ^! B# d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 h2 H* G# P1 L+ T: }. I6 E
% z& C' `2 o7 c. m# _: p# bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 g% P" s: s G; h" p6 eunsigned int count_copy = 0;
, r3 Z) w% o/ I" L% K. Y4 X! B( x& _: b2 B4 k" d1 i
8 A9 a; K8 ^5 c2 R8 E( I5 L& O5 }2 Q
int main()
1 ^; g5 X ~8 J; a# r{5 V6 ^! B) |- L
pRX_MSG_PROTOCOL pshreRAM = NULL;
% `) E: x1 J8 i7 p5 a+ W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 S8 K2 V& P' \; \# g+ E9 t3 s
8 ^* u( i' o1 [5 N$ _3 O: s while(1)3 G6 H: V: [) L" X; ]$ o2 f" B3 w
{
2 n& Q6 ~1 Y; `9 e6 f6 I3 M read_MSG_buffer(pshreRAM);
" P3 J) T! _5 V7 V# d }
# M6 o4 J A0 w8 @5 u Q}; e+ ^7 m9 ]1 k1 M/ n2 M: ^
5 E' \0 _! j7 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 A) a# P) F+ m{* r& F. C l; S, L/ g
RX_MSG_PROTOCOL buf;
; f0 }+ i$ g) m& O6 \ ; l' A9 A; n! S& |
buf.a = pshreRAM->a;2 _% E( t: q' v. X) Z, ?
buf.b = pshreRAM->b;
2 n4 R/ Y; y: B& w& G; X! f buf.packet_cout = pshreRAM->packet_cout;9 I4 S3 J% q) O5 q) R
0 t+ W: F# b8 _, ? if(buf.packet_cout != count_copy)
$ G8 y# p3 @& k+ V6 Y) w {
Y2 @5 T* P" Y" y( y printf("a is %d\n", buf.a);
" w4 R: Q6 }: ?0 X9 ~) J0 A printf("b is %d\n", buf.b);
" y% ^' _: ?0 M printf("count is %d\n", buf.packet_cout);
! ]* P+ q3 B! E6 _ count_copy = buf.packet_cout;# }1 j1 \. \- Q+ u$ F; n$ E) G
}
0 _* R* O5 }5 [ else1 S8 j$ P$ D8 v7 e* l7 e; @
{
: T0 r( ~! P" g printf("No effective message!");
0 G: ?, O0 R- A1 j3 w2 s+ E8 i }" S9 n B' j* u/ i
}) d7 T* |& D) ^" x& N1 s$ m1 V. A
( I6 t6 q: }) o- t
8 F* ?6 {, h8 ^, ^+ p: A9 v |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 Q# x/ z' b" X4 n) \ h9 i( b使用下面代码,对内存使用了mmap函数后:
+ z9 ?$ n# D# k% |" j) v! A7 x3 ?% O+ L#include <stdio.h>. K8 |! @8 I& ?0 H
#include <unistd.h>6 E3 c2 F5 M3 \9 a5 ~( H- A. U
#include <sys/mman.h>( `5 C; J' z; P# E& m' g( J
#include <sys/types.h>
% ]# q" r4 {% f# X9 R. s$ O#include <fcntl.h>
3 C0 h/ v3 \9 a1 [9 H5 p7 t
" [2 k: W0 O: Y% T: C3 |#define SHAER_RAM_BASE_ADDR (0x80000000)' M' J6 Z1 ]' J* P& c: K
#define SHAER_RAM_SIZE (0x20000)
3 l8 d) E. F" N o* k/ o. V# P
; K5 a5 M, B9 }* |8 T, Ktypedef struct4 \: }( f7 W9 d2 m* {: t! ?' g
{& o9 G+ W! M6 P( F: Y
unsigned int a;
* P( Z7 k- G; H/ i0 r, ~7 w- G unsigned int b;
/ s" r; U* ?! b. }' V: z w# N unsigned int packet_cout;
4 t% {' ]& C, O5 \8 r$ m% A6 i: a6 u6 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' _, ^8 s5 W! M7 e% H' M/ d/ H; m& i" X+ i8 C" o" e0 E4 a; t( R
void read_MSG_buffer(int *baseaddr);
7 D; r- k+ j( V% X2 F# f- Sunsigned int count_copy = 0;
; t1 y4 S3 V7 r: O# y F) Q8 ^) E8 g$ H/ n
int main()5 A, V: J3 F7 h
{
$ P6 I# c ?' C9 ~( }, Z7 L int fd;, Y4 ^4 q. r3 s$ u$ L. Z' n7 I
int *mem = NULL; U2 X1 Q9 }+ r( H
. ~9 f. D0 Q# [" q( X$ v2 |/ Y
if((fd = open("/dev/mem", O_RDWR)) <0)7 y I" p4 d$ `) z; t
{
1 L/ C9 b5 @: |9 V4 e+ Q" _ perror("open error");$ @$ X2 K1 \5 E/ W: X& o5 J: z, K
return -1;; o# K$ L2 q/ O; ]8 N1 H) [
}- |, Z/ E9 i6 L
/ q8 z) C [- J& l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 V3 r& x1 L- m' y4 p! M) n8 X+ w- I2 a3 p8 i4 W: a* K6 [
while(1)( g8 G7 Y- R+ }( F/ z
{+ s1 X: ?! I* ]: `
read_MSG_buffer(mem);
+ h7 h. v' x, l* E } " l/ T# P" w& I( W
}
7 ~ B. |& ~# ]' h' y$ i- u% F% O1 s2 z; H' q% o0 P
void read_MSG_buffer(int *baseaddr)7 U$ k* l9 M! \5 F
{
' l9 s- I) ~2 U b5 p5 Y pRX_MSG_PROTOCOL pshreRAM = NULL;! W! s/ x/ I- @& _
$ V4 F+ Z! a" H) T( h- V f! j+ \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* Y7 ^1 _1 n" M2 S0 r) M
) T5 d6 K4 k. @4 L1 w if(pshreRAM->packet_cout != count_copy)7 s4 Q1 ~+ A7 c: q0 P& B z$ ~
{
7 u! v9 ?3 R+ a% Z6 G! T printf("a is %d\n", pshreRAM->a);' Z- `+ \, `4 Z4 v( l
printf("b is %d\n", pshreRAM->b);
- X. _* _$ r4 A! e" s printf("count is %d\n", pshreRAM->packet_cout);. @0 c) c$ M5 X0 ~7 X2 W8 \) ^
count_copy = pshreRAM->packet_cout;4 E4 @5 F( w- f% V
}, m( `- F+ d" P! D- N4 [
else0 t8 [9 H' r0 t5 Z8 `
{
R% b, t( |) X* `6 a. M* e printf("No effective message!\n");
4 k" v l& @" Q' Y8 x }% k+ m% M9 O6 v9 s! u
}
) x: A4 m1 K# E( R- a2 [/ i$ N7 v+ X& w" ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 c4 \9 b# @$ ?
/ N: ?; z) a5 r$ i8 z" U$ ]. P1 t' |0 ]: @& W
% w6 _7 m) W1 n7 V4 x! U# f+ E) S+ O l& o* W9 g p/ l* i1 [1 y* ]% @
|
|