|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 @7 @" n3 I6 ~& @" J
2 a7 ^! ?; P$ POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 h1 _2 j a$ d8 U; h5 W#include <unistd.h>. Z* Q3 G5 I7 @
#include <sys/mman.h>, Z! i* E' o2 L4 |2 Z/ N& C
#include <sys/types.h>
9 Q( i# V8 _7 [! L/ L: [/ G; M#include <fcntl.h>- e; d$ L0 u. W& [0 d4 U `! [
+ w$ S. B6 @4 S, C3 Q#define SHAER_RAM_BASE_ADDR (0x80000000)
$ B+ f+ v: A8 ?3 r$ T6 o! z
9 r6 L7 Q/ `; V+ ntypedef struct; E8 ?) A2 L% O. C+ S5 f, t7 I6 f
{
8 I3 d9 E7 p: y unsigned int a;
9 k/ J7 m9 o- k7 C unsigned int b;
# G6 W, c( K2 [( u unsigned int packet_cout;
+ _: }5 V* ^: ?7 ~: J0 H" }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" I; _4 S/ b, @& _( t( ~
! d! ?! T: o/ u. z8 I' R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 g$ D& p# R3 S( I* A8 c
unsigned int count_copy = 0;" E/ M7 [8 J& Z# b) ^- j3 V8 N
; r7 v/ k* h% _6 Y# d
% q! S" S) U, l# p$ ?
int main()
% G. N' z1 S" S( t{$ {/ W( N) W7 R7 H
pRX_MSG_PROTOCOL pshreRAM = NULL;1 e7 Q& r6 q: S, O. F0 y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 ]9 W: x( {1 U& o( Q
| C% Y3 {! k2 j4 x0 P
while(1)% }; u1 V8 K5 E! Q+ ]( v
{
5 I: \, Q' }9 D) w1 ^9 q read_MSG_buffer(pshreRAM);- c$ h* o9 u, m9 R g
}
. F* M' N0 ]6 Q: I7 n P# E}
7 Q4 j; v4 M3 ]& M( M4 t2 V* T1 w4 i" d# i' |' R' O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 e j! p& G6 T$ h- t- [2 S{
' s6 v( Z' J1 u# Z2 Q2 B. w( z RX_MSG_PROTOCOL buf;' ]6 T$ }, s9 D2 p; z
$ F" w" |2 z0 V( {- c- Q8 o
buf.a = pshreRAM->a; J' g6 |1 O: X& b6 M% @8 c8 D6 ]
buf.b = pshreRAM->b;, y' L! s- B# {7 f: ]$ G
buf.packet_cout = pshreRAM->packet_cout;" R& r7 K3 J1 M) q$ s' [ R
' Y+ x/ ^. s T- @ if(buf.packet_cout != count_copy)
5 f$ ]8 ] w0 L# ~+ z5 e- `: ` {
6 A5 U8 x* t$ W: H8 ^1 w& { printf("a is %d\n", buf.a);
% q; m8 m; K6 \0 c: M! p printf("b is %d\n", buf.b);
! R! k$ M4 P/ x Y0 a printf("count is %d\n", buf.packet_cout);
+ X! O6 z& K/ t, U) [1 B3 r/ O6 P4 T count_copy = buf.packet_cout;% [' ]( V# r4 b. H
}
/ y# d- O |- X% p else0 ~6 f. N& O7 r+ K3 x$ Y0 t
{( J8 R& @& P8 j
printf("No effective message!");' J$ W# D0 O( G( ?
}) [( g$ P: l# ]$ x
}, G$ {3 J# ?1 T p# E+ n
9 {) t$ D! C' O+ |
0 b( w* i B: v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, D1 L, t+ a1 a/ R2 Q使用下面代码,对内存使用了mmap函数后:
4 \( E% w/ D& R4 e* [3 a/ x#include <stdio.h>" r( E" ]4 k9 T9 \9 N
#include <unistd.h>; a$ a: \, z9 X) R
#include <sys/mman.h>: C4 s2 [( o# P1 y% M) M
#include <sys/types.h>4 X/ y% S5 Z/ L+ G& j0 `# f7 \$ W
#include <fcntl.h> v( b5 H! C+ k
3 n- R1 O) |; k# x" g#define SHAER_RAM_BASE_ADDR (0x80000000)# e" b/ x0 F4 a* G( {8 j3 e+ r* ^
#define SHAER_RAM_SIZE (0x20000)
$ A( g8 m8 s+ V) f) H- r& q! x" V" s
typedef struct7 D( \$ I2 `7 j
{
( M" q* I, |* n# S; Q& m unsigned int a;( Z" f. P S, t e: ?. f
unsigned int b;
& B- U* r8 r3 | unsigned int packet_cout;
- \% k3 I! A3 U% r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! U3 s6 |' }) U7 `7 A, s$ t" o" l
* J" [7 w9 l3 D4 e! \7 }- x6 [void read_MSG_buffer(int *baseaddr);
6 h# ~( z6 D8 u$ w( [9 {unsigned int count_copy = 0;% D9 H* C* E5 P
" J$ F3 n1 ~ W
int main()
8 y/ Q5 b. r6 q- e5 R- y, _. h1 \{
8 x1 p" u9 _" u$ c* |0 ] int fd;% w: \" U# s4 z% g* w
int *mem = NULL;' I$ \% f! v3 }! O: }8 I7 w
7 e6 I; B4 D1 }/ @+ i; M, r if((fd = open("/dev/mem", O_RDWR)) <0)# L9 l5 @( s3 a" u
{ ]7 o$ M4 I& n
perror("open error");
3 b3 \5 `5 Z: E( s6 q4 j p% Y return -1;8 p. n+ h/ @4 A1 u
}
. `% X3 p+ s( ` / c6 o8 t* L5 Z) p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
R! C3 r( v! g# k
9 V( o2 n+ ^1 y while(1) c0 ~1 K. v6 T! ~* @1 c
{
! y2 U6 v/ q/ {. p2 s read_MSG_buffer(mem);% `& o- q- |: T, d3 Y2 [# O# m5 {& v
}
# \9 G3 O8 j! c9 ~3 U4 q}. x( c! g' R; p3 W g9 @
& l4 ~: d D9 a
void read_MSG_buffer(int *baseaddr)
9 ?/ [+ ?' i; z8 B2 O7 x{ F2 T, K0 Q! O2 V8 b
pRX_MSG_PROTOCOL pshreRAM = NULL;* j, B9 g- g; H/ G
( l. h- @& y! E9 V) ^* n% Q1 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 @. Z: d2 o6 i( r# r6 U" O* _! t% R
if(pshreRAM->packet_cout != count_copy)
4 [' V; }9 K3 o! l: s3 Q! @ {
( I6 o6 q y2 n, ]% s printf("a is %d\n", pshreRAM->a);
% Z2 h; H. m4 C, j* ]. G printf("b is %d\n", pshreRAM->b);
0 N0 E) l* i2 T) L- U! F printf("count is %d\n", pshreRAM->packet_cout);7 \6 F/ G3 a0 s$ n% ]. D1 n
count_copy = pshreRAM->packet_cout;9 I# y: H& n4 S8 R1 ^* W2 z
}
. ?" D) W+ o- p1 i0 I else
4 U! h% l9 \+ |8 g- t: q; A {
& _8 C! c; a" o7 c printf("No effective message!\n");1 L% E; P7 E0 Y, e9 A! r
}. W6 Q7 \9 l" B, O
}
! W- `% U8 e6 G! i5 ~5 T" i6 H _1 |3 F) y: ~$ }( e. a0 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' i: k; h8 n# b" @
1 Y' N7 Z- E0 e4 ~, w) Z5 M' l" `3 B* { R7 ` E! E8 ~
e& h, Y! n& i- d- l. F5 g
" e+ S7 _& a# G4 P |
|