|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # ]3 M I" V0 F6 `$ p+ t5 H
! L( g m+ Z. A9 P: x _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ p/ x# I2 |% f+ s#include <unistd.h>
9 E2 B) ^+ q2 K+ j4 V- M#include <sys/mman.h>- b2 s% K7 |5 z$ K% ^% ~
#include <sys/types.h>/ U0 f; @% q5 A. k1 k! @4 N
#include <fcntl.h>' h( J6 D# ?$ D
4 N3 F: p7 T) ^- b% U) S#define SHAER_RAM_BASE_ADDR (0x80000000)
- g+ p6 N% [; Z+ v# E
0 S- k0 m5 z8 T2 j# dtypedef struct, C- G* u' y# H5 p/ _
{
3 k" W( N+ i6 L/ l* W2 ]% z" h% Z unsigned int a;
( W! B! o" s! E* t1 u& I unsigned int b;
) ^5 V% F( C" Y+ C unsigned int packet_cout;4 J5 i, |" o. ]; R% B4 y7 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 d; c+ P6 A3 L% I D! C$ w- m5 q6 }& m7 @2 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 G6 y" h, {# e7 e+ [+ l0 G
unsigned int count_copy = 0;
: h# ^" ? l, \/ P8 w" N3 e; l# V' e2 S, z9 ] t) X
* q/ y6 a$ x+ F, x! J5 ?1 _# D( s6 y
int main()! l1 }' f$ G) n- z3 C1 [
{
4 F2 X3 ~- B+ a% E; S( x pRX_MSG_PROTOCOL pshreRAM = NULL;
8 U7 t u: C3 l, V, F; ]$ H pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- m1 {# y1 v8 P" P- w. s* Y# T0 F) T6 \; d
while(1)
7 s" o; [( g" M9 w" F0 ] {
3 T' Q1 g" K4 ?8 e x7 l ` read_MSG_buffer(pshreRAM);/ Z& V: I. [0 X2 u' k
} - d% i. z2 H9 L
}
1 y" ~7 p8 }* l' z/ s; H' \
5 f! }/ R4 i, X% W- |( xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 @3 K9 R7 U9 u- R1 n$ m
{
2 I, M2 h- w+ z8 |+ i3 K1 N: V' K RX_MSG_PROTOCOL buf;. |' d* U. Q* I6 E5 Q
/ Z7 s7 z1 S; i8 @' f7 L
buf.a = pshreRAM->a; B; K+ n5 Q3 L1 @
buf.b = pshreRAM->b;
; ?. G) X. @- ^% y" B buf.packet_cout = pshreRAM->packet_cout;
2 H$ M1 }! J; ?+ p 8 [6 f! x& |6 ]. u$ L. M# k
if(buf.packet_cout != count_copy)9 [7 L1 K/ N2 d2 i' x. K
{$ {3 I- m$ ^5 `
printf("a is %d\n", buf.a);" H! T, D" ^6 e R& m
printf("b is %d\n", buf.b);) H: S/ v1 r, O. G1 M; U3 R
printf("count is %d\n", buf.packet_cout);
7 O8 Q2 T3 Q0 |* `. T count_copy = buf.packet_cout;
2 `+ l: o* a5 Z( [4 ~ }; G* w' w! i8 [" K v8 x
else
4 r* x n* ?; B7 n, c- f+ B4 G& d {
% | U/ R/ J! Y6 Z& o+ B printf("No effective message!");% T2 l! L+ j2 t& H
}3 R3 H T+ Q J# J# [' \
}& ^% E2 v. f- a9 G' ?
4 q/ v/ l& ]' H, [
) j) H, o# S- W W# R8 X' s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ L9 D2 E% m( u# |. \9 z
使用下面代码,对内存使用了mmap函数后:5 j) R2 J9 S& u! p) v- {
#include <stdio.h>1 R$ A3 r0 _5 {1 {5 p' K9 U8 s
#include <unistd.h>) h* e1 I5 }2 s) ?" e# O! d
#include <sys/mman.h>
% G3 W8 F) `! f1 {4 r0 w#include <sys/types.h>$ Q; d2 r0 j9 W2 a8 z
#include <fcntl.h>
. M- S3 A# ]( P& ^1 {* C* t& }0 B, x
#define SHAER_RAM_BASE_ADDR (0x80000000)3 f& W# {, F4 i8 k+ [/ _
#define SHAER_RAM_SIZE (0x20000)
* }% o# j7 r. R8 |3 \" q) i F4 q# p. M
typedef struct% J7 k& `( x7 E% @
{
* e! P8 N9 L% M unsigned int a;
! K! W" ?" p. ~. @% P7 l0 e! x unsigned int b;" ]( [$ m p0 w3 _7 _
unsigned int packet_cout;# k" ^2 A& {3 L+ j! X5 e6 m* v3 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ X" R9 l) D. s" C
6 i4 n ~# } a& I0 W4 e _* Rvoid read_MSG_buffer(int *baseaddr);
1 i1 D3 r; c/ [2 Dunsigned int count_copy = 0;
! T2 y# s6 w, G5 P
/ G2 S7 ? j& e2 l: D5 Rint main(); ]6 q! s5 I. C* Y. e- U+ m
{
8 [% V7 l+ x( l( d; l8 Z int fd;. O# a! E* _8 z6 m3 d3 z
int *mem = NULL;/ }8 @; j; j8 i) e! D1 e
/ y1 t3 ^/ [' f ~3 T
if((fd = open("/dev/mem", O_RDWR)) <0)5 x: A; N' c/ d& k8 E; }
{* w4 g3 b G d, n& q) K+ S
perror("open error");
% z0 [2 ]/ h2 p7 F! d return -1;$ r& V. a: Q9 \1 b8 ]
}3 k, y2 ~+ U- Z/ W- i4 t$ _1 F
_/ k- ^# G- r5 U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' b0 x4 s- n w; t
f( ^+ ~: Q/ u1 d4 P while(1)
9 p: v3 T( M3 T: [) E+ T {
( {/ N7 J' E* c, `' b+ q read_MSG_buffer(mem);
7 M: T+ i, ~$ z! v" j } / z! Z8 G7 x# Q3 _' {
}) w& E# \ h# J( F
0 R: K* m/ s2 U( E* ivoid read_MSG_buffer(int *baseaddr)
$ U( N2 l0 \6 z1 G% O. U% t* r9 A{: [+ e' O3 w3 H3 L }0 a
pRX_MSG_PROTOCOL pshreRAM = NULL;! ~. b. ^4 K5 |1 v% G: b( u6 x
+ |( q) \8 C- N6 G
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, ?2 n2 Q& B' G6 j
5 c x/ h3 \: N2 r! \) i
if(pshreRAM->packet_cout != count_copy)
9 ^+ T( c1 t2 \7 Z1 J {! y3 f8 ?; O1 l' S% }
printf("a is %d\n", pshreRAM->a);
2 Q: v( {+ X" B# b' n( I" Z$ s printf("b is %d\n", pshreRAM->b);
/ z$ l7 }4 b& \6 b' a% x. v printf("count is %d\n", pshreRAM->packet_cout);- c- c! }! \. u1 B3 N$ ?$ r
count_copy = pshreRAM->packet_cout;, n3 w5 S/ A! b/ Z3 n# t i# R" a
}* [: }9 T* r9 k5 f& F9 T
else3 L" g3 J0 }8 [: ]6 ^* ]1 X
{
& o- v1 C( B W9 b3 r; z% A printf("No effective message!\n");+ |; `4 h3 x* p
}
" r8 o$ H8 n9 f; l/ `' r) L' w}/ `" r; C G) o$ y8 P. W: q" {
& N: K% C' K& r8 U9 U `% p) |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. \/ k8 i5 `* C1 D3 a& j: m
, i% }$ ]+ j9 Y9 ?
: R& e: S1 @/ S& U' C. b2 |+ G# {
$ a V/ L' k* E* C5 W/ e
|
|