|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( L& s: G2 ? r/ J; E
* c' Z7 {1 v2 V- R( ]+ w3 lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. n* L" i- A1 Y% R! g5 |& L
#include <unistd.h>
6 v8 ^* E) N4 r4 T" b$ G& D6 L U#include <sys/mman.h>
) D7 i8 f/ e# b8 H. N: b#include <sys/types.h>
1 P; i+ o# g4 s#include <fcntl.h>
( t# C9 g; {6 A7 A2 \1 {& ?
* z v2 D, p: ?, }3 v+ b1 g#define SHAER_RAM_BASE_ADDR (0x80000000) # T1 Z. n* S) r! h
2 g" h+ i) P* T- M1 e
typedef struct
9 r( I! d/ {3 l6 w4 p2 S{
* ?8 O, ]' U/ @. P, T unsigned int a;
5 e g/ P+ X: I2 R unsigned int b;) |- u7 z0 n0 C
unsigned int packet_cout;3 p6 ]7 m4 {0 I& l8 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 J8 ?( t" r, ^* s
( i5 c* i) J: b- m7 a! j# r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 I; y- Z& e& F3 B6 x: Cunsigned int count_copy = 0;
6 |" o4 E1 k; ]6 s# z$ S3 i3 b- u! Q5 C3 K
- h! j$ b7 G; J7 G9 n0 Uint main()
6 d) }8 b7 o! O0 h% j{3 p8 I$ s( O( J( y C
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 D) u @5 ^' j. s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* O5 B7 O/ L0 {. Q" F! c
" V- G3 j7 i6 t% ?: o while(1)0 }0 n+ _6 d2 x+ l0 v- L
{* Y0 j! H: o8 W! M q' X
read_MSG_buffer(pshreRAM);5 Z# \" \5 Z" Q' V! B
} $ [" T0 P2 k% K' F5 H
}9 ]. R) ?' i8 Z% B$ k* w
7 O# B4 C& }" W& rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% W& D' R; s+ H9 k
{
6 N0 ]) {5 k ]+ Q$ c6 y, V- X/ } RX_MSG_PROTOCOL buf;( U1 b$ T! @! F& a
7 M* Z, e$ L: r( H4 y
buf.a = pshreRAM->a;
5 y: ~' @6 N, R# k7 S2 b buf.b = pshreRAM->b;
$ Y/ B' E `; H buf.packet_cout = pshreRAM->packet_cout; }7 s& r& O$ U' J& q, Z1 f1 c
+ l0 F2 q, y8 `3 m9 W( b' b1 b" u
if(buf.packet_cout != count_copy)
9 Y3 c H( I5 B6 ]9 ^ {
0 b5 @6 V9 J5 @" S+ V# R. k printf("a is %d\n", buf.a);% a& @$ x. d2 p p: w
printf("b is %d\n", buf.b);, R- R+ R5 v7 U+ H' J9 n" [
printf("count is %d\n", buf.packet_cout);! [: a& f9 K' F: a) Y$ d
count_copy = buf.packet_cout;# |( e: C7 }7 |" N2 T0 @
}* D0 G K4 I! d4 e( M% i4 i
else! }+ |- M3 \. s5 l$ u! T: x
{
3 p3 k6 _6 A% o$ d+ v printf("No effective message!");
$ T( a8 `/ d6 s; O }
- e j; v. X+ r) K, M* x}
6 Y8 u+ @9 E5 V9 ?* |+ f# P9 Q0 H
. `; k2 @# F, s( V+ `# d8 N/ M/ f4 K& h9 f1 U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( [( T3 |# ?% @: J6 z( F4 W/ _使用下面代码,对内存使用了mmap函数后:! u6 J; t) ]1 S* V# X! N, w" y/ |
#include <stdio.h>; ^5 e2 u3 t& {# s7 K. }/ `' s
#include <unistd.h>6 P2 L$ F, e3 B0 M2 f' T
#include <sys/mman.h>; U' o- b2 l* e% l
#include <sys/types.h>
4 s4 }4 C+ l6 z2 k- v2 r#include <fcntl.h>, @- x% w) N4 E$ R' M$ \2 C* L3 E% D1 G
7 k# @3 _0 c9 H" w) u4 K
#define SHAER_RAM_BASE_ADDR (0x80000000)$ x9 R0 T" p: \% a( M
#define SHAER_RAM_SIZE (0x20000) 1 h G# _0 u4 Y6 R5 i
* r# y r! N1 I8 Z8 t. M) t
typedef struct' a8 T" |" Z) f! w& u5 H: z
{8 M& d6 ?, {- b. m" n9 h
unsigned int a;
% B9 m# i- ~- a: s' m* w% f unsigned int b; R( j' |# u& ~) Z ]
unsigned int packet_cout;! T& }) A/ T" w+ j* t( c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" [1 T9 E& k' z7 v( o \. p
2 q/ B, m ]) S: d& O( j8 w
void read_MSG_buffer(int *baseaddr);
6 ^) k- w! X" i; j {unsigned int count_copy = 0;
7 j: ?1 c7 I! u8 z. |% L0 ^. t6 Z% O' X1 B% a! Z9 T
int main()
5 B1 N6 }- W$ v5 s" n8 m{8 Y7 C, w: ?8 t e8 w& y" [2 B
int fd;
$ c( u7 P1 ` J8 ^$ f1 q int *mem = NULL;
' i! w+ m* T; ^& n4 T
5 L7 F @/ u# O$ e if((fd = open("/dev/mem", O_RDWR)) <0) I9 M% c+ f) b, G: _" U8 Q7 J3 {& n
{6 {/ M3 \4 M$ ` Q0 h
perror("open error");
6 I# s: I o( X* V return -1;
1 I& F. X! l6 Z$ B4 T" Q } i- }: u3 N/ X4 A
; H' B) F. L7 n' j6 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; v2 R0 A# t) ? P& n4 Q% l
9 g6 L0 d7 z. d! F0 n2 j7 Z
while(1)! g8 @: g% ]; D4 w- ?4 a' S
{5 ~! c& q3 R) v1 L2 ]& ]/ P
read_MSG_buffer(mem);5 Z7 M" @& e y* O, z- l' E, B
}
: o) I: X9 z2 l2 C2 M8 p}
* c0 O/ D- H: j, k2 N) M3 E
* l) m4 s" ?6 Y* j6 Z* n5 ovoid read_MSG_buffer(int *baseaddr)
3 f$ L* g( |; U, {8 `/ h5 F{
1 J7 u2 e6 D5 _4 [ pRX_MSG_PROTOCOL pshreRAM = NULL;. o. Z) D3 x% Z8 E% R2 `4 R
5 d7 O* j% t4 P7 T pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ ?. A$ z3 V6 X/ s3 T# b3 W4 |5 h
! @- Y X: @* ]% n7 ]! m if(pshreRAM->packet_cout != count_copy)
6 W- n& U* b) ? {+ R5 |; U |# N T
printf("a is %d\n", pshreRAM->a);
9 N- H7 k- M3 ` printf("b is %d\n", pshreRAM->b);! R$ _( [8 }2 {+ Z* |
printf("count is %d\n", pshreRAM->packet_cout);6 x9 a; z1 A+ w, k- Z* {* n, H) }
count_copy = pshreRAM->packet_cout;" n4 ^% s( J# ~) Q$ ^
}
* i& Q! u0 F3 F* Q+ B: V3 l: E else. {; u) J- ^7 c3 m" }& G
{
2 [5 ?1 F9 r! Z+ F& t, L8 D printf("No effective message!\n");7 @3 T6 e8 z: V3 n. `
}
2 V5 X) L2 G* u! { I, F8 l}
2 {! R4 o' x8 K* n. X P+ l1 v3 e& S U0 {' D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. m) I6 s& C( B
" g6 [- ?; c9 \- K |0 H) ]& S' ~+ q* F! e
|& L2 {- F) l8 ]# n- [! V6 ^7 c& H8 R z1 q' H
|
|