|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + Y! w. ]3 P* Z+ _" Y
* X) c0 c+ ]& n- i) A% j1 a) h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ ?7 u$ A' u/ A) _* w' E/ O, m#include <unistd.h># m; F/ y2 N+ R; G% ~
#include <sys/mman.h>
2 P% F" o- g8 \5 ?$ P. `8 d0 U- k: b#include <sys/types.h>
$ E) _3 u& b4 q/ _- |- b#include <fcntl.h>& F6 ~+ k+ {/ J( t0 Q4 n$ p
0 Q, t7 D% {3 F7 J#define SHAER_RAM_BASE_ADDR (0x80000000) 0 B" ~9 ^+ A' t/ C2 |' H
8 d6 O/ C$ P# l( }0 @1 mtypedef struct
# x4 l; }, B% @" [9 ^{
( a6 A9 Q6 A0 c unsigned int a;
, g6 A5 e' D& S& ^6 j unsigned int b;
5 C0 w, h# D* z& G! K: a unsigned int packet_cout;
9 ]! a: m( B9 A0 R6 Z+ x( J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 L, H6 ~( E( T0 ^8 a, v
0 n6 N, }7 v7 v- e% e/ T% x7 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. r1 j6 B% e$ y) ^+ M5 |
unsigned int count_copy = 0;
+ N1 R! Z5 ?1 y3 I( }! v6 b9 G. C' c+ M
( ?5 b; W& {& J7 [9 n1 j
int main()( P$ |9 I, b0 d" M: Q. X
{
: b2 j" Q, ~4 O9 e9 R# m: M+ b pRX_MSG_PROTOCOL pshreRAM = NULL;
+ N4 `0 ^, L! l7 u- H+ y* [ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 _' i9 z; P$ h1 y, [7 ]) x
0 D7 I/ O/ P8 t while(1)
, _. c+ N/ z3 L {0 b) A1 I; C( K1 X+ a `3 u5 T w
read_MSG_buffer(pshreRAM);: T/ q# g2 f" f: r
} 1 ?" U! q0 l9 a% H
}6 I N1 K' u+ t- W) T
, G8 f+ _+ ~, G, ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ r8 p0 }3 \) p0 j{# l$ v7 _& S9 ^6 G# |- N
RX_MSG_PROTOCOL buf;+ N% x) a+ O9 R
! `$ T/ `+ \, v. I. ? buf.a = pshreRAM->a;+ @- z3 Z# g5 d
buf.b = pshreRAM->b;6 i }5 K$ j3 Q" @- H- R4 W% r X/ O
buf.packet_cout = pshreRAM->packet_cout;
4 ^4 {: b+ J/ d! S
, ?' W4 k l' H+ n* G3 G if(buf.packet_cout != count_copy)
% q: S1 O4 l& E' ` T$ ~' d4 Q {
3 k! G8 r' G/ y8 j- }* @3 y printf("a is %d\n", buf.a);- c7 _ V, S8 |
printf("b is %d\n", buf.b);
5 C6 H5 B- H5 E0 l' r; p printf("count is %d\n", buf.packet_cout);4 k1 p& P4 H0 L: o5 \; }8 v
count_copy = buf.packet_cout;
6 |5 P. ~2 q9 @1 a. O' F8 |3 i }
1 ?/ }8 Z, k) J* B else1 W) J) o& D" Y* i n+ Q( c# v
{
* B2 q. n. A0 Y printf("No effective message!");7 I* |7 T4 p/ M+ M6 N$ ?
}
# t1 a- ?( E9 E+ ?' M3 b}% z/ l) A7 e- o- q& N4 t
- v2 {3 n& s& _& y( X, P
# d6 U" Q, [7 O m, s# ?$ Q0 s# }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
k1 e# L3 N g2 H1 D7 m$ ?使用下面代码,对内存使用了mmap函数后:
1 J" `# B7 N2 a* }) h. I0 Y#include <stdio.h>
. p! a4 ?! p+ H6 w; u) r; n#include <unistd.h>* Y4 c; A6 X: h( b9 o' {
#include <sys/mman.h>% c1 N7 @& D% p+ \
#include <sys/types.h>! |- C' ~$ p& \& f9 j% n% ~! r( E
#include <fcntl.h>
; s5 q7 D7 O0 E9 J
3 w- O' P) V+ C7 _#define SHAER_RAM_BASE_ADDR (0x80000000)
# H/ k: r% I6 f8 z. {7 i- n* }#define SHAER_RAM_SIZE (0x20000)
1 O9 e( N) ~) A$ f1 P! j2 k. h" _! P+ A1 |8 p" |# M1 Z
typedef struct e7 x$ y/ c: ^8 p* i
{
4 I$ t% p- `7 }7 H% M: d unsigned int a;
* M7 y& D2 m* [6 d& X# x$ H, L unsigned int b;
6 c3 y8 ^- p5 H9 L- j7 [' @ unsigned int packet_cout;5 o; |% ?! a$ @. \" J+ ~! @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) ^! ?; _3 {: k% ^% T$ J) F
3 A# X3 j/ _% m. g" Q
void read_MSG_buffer(int *baseaddr);
4 A3 W5 ]/ ^4 j4 r7 }unsigned int count_copy = 0;8 R7 b7 P+ N' S
8 S5 K2 s) d* a6 N0 y
int main(), W8 n' D! z0 J h
{# U" \! q$ l# T
int fd;
1 a& |+ x% i1 C/ a; ~/ u. q int *mem = NULL;
* k8 D. |. [6 O0 `3 w$ c9 e& c' c( R1 S; r& {; Y
if((fd = open("/dev/mem", O_RDWR)) <0)
: R( b% A0 `/ o& O {& x3 k0 Z9 j7 S; b4 P1 Z
perror("open error");
7 a& z2 q8 p/ |7 F, I( E: b2 V5 x return -1;
7 M. L. a. W* W% A! T; V }
8 T; ]/ @. c- g , L' ^3 v0 n3 k7 B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 F( g0 X2 ?* {/ {3 P& g( ^, ]. v- u$ L
while(1)" i" R3 s) l' S: P
{# f; u- c" V- ^. V
read_MSG_buffer(mem);
0 F3 W6 S4 c0 \3 G+ [+ l" y2 \7 \ }
/ l) X! d5 F- E( J) e3 i8 g}
0 T [2 U& N; r) }* }: A4 b" A. x0 [$ V L. x* n
void read_MSG_buffer(int *baseaddr)
% b5 J& F, j+ q; g9 ?/ y/ ^/ {{+ |# A9 |) H( V% s4 z
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 P: Y4 \6 v0 K# f1 x5 H. U
: \1 t6 k& y& d+ e } pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& ?4 x p. i9 S8 K/ }. w( ]7 e& ?3 q3 S
) j- ]# D, V3 E if(pshreRAM->packet_cout != count_copy)" n* l* K+ x( F6 T! J% i
{9 F$ ^# Q6 H4 H8 ]$ b& x
printf("a is %d\n", pshreRAM->a);! v8 c1 i. _3 v) ?, G! i# O
printf("b is %d\n", pshreRAM->b);
3 K8 y3 G9 r) X' F' _' X) D printf("count is %d\n", pshreRAM->packet_cout);2 n- @7 e7 y1 a K
count_copy = pshreRAM->packet_cout;
8 y- B2 v3 N: i" V. ?# ~$ e }
% ?4 b, F: t' I" e1 ~8 ]6 x else/ } T- C7 M: O7 G4 c5 B
{
- @8 S; ^& f( L5 x; d printf("No effective message!\n");5 A# X8 l3 V0 W+ g
}
. E7 L3 G& |: M8 {}" ?% B' L8 ?# {% W2 H
) Z' ?6 v; X0 S9 E a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 D+ h: [, f4 }( D, ?9 s" K5 J- g0 e3 [2 b+ Y+ G
7 ?, n; c( c K$ |; c+ W
6 g1 K( C( ~& e7 x" J/ a/ ?! H, K* D* R
|
|