|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 q3 N' Z( x! r4 G0 J7 ^
4 N5 i; c1 m4 h, L: ^4 D5 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 P% \' H; v; Z, d% U#include <unistd.h>+ z: k7 O. w$ k$ L4 U) K# t; ~
#include <sys/mman.h>
; U. E& p0 ], K0 I/ @#include <sys/types.h>( C5 }7 R4 _( V/ k% P# g! U
#include <fcntl.h>
4 Z8 L0 e3 m$ S) u+ C& D3 S/ X
6 {& n# D0 S! f9 M#define SHAER_RAM_BASE_ADDR (0x80000000)
4 }6 p7 z& V: V7 K1 [; [) \! H. {9 [* w+ w) h
typedef struct
$ w" H4 |" ~. |1 S{% t3 j2 A+ y7 ^* A. b& C
unsigned int a;
d7 ^! s, l# i" H$ i unsigned int b;
6 v5 n/ p9 z% p7 ` unsigned int packet_cout;
" G7 J7 x( v9 T# M. z$ K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 q/ T! Z! }2 i" Q9 \8 E6 N$ K
1 @; R1 W8 u" _& L: {0 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 @. p. N9 y5 g+ x! [1 U$ n2 u& ^unsigned int count_copy = 0;
4 _& B' r n4 a/ J6 S" g; B5 o
( Y5 [8 s+ m+ E6 P: S) z8 C% |5 w
int main(): n1 v8 L$ n* @1 q' ~2 F9 f+ b
{% L" m( J0 e7 h$ c, w' Q2 |
pRX_MSG_PROTOCOL pshreRAM = NULL;# ] u3 W+ A5 a! a5 B m9 t) U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% j' \$ H/ c3 I) z
( x3 L" w6 H2 r% ?/ _ while(1)
5 `4 m. P/ k' \4 G! B {/ ^5 h. ~' a8 |2 @- D" O
read_MSG_buffer(pshreRAM);, o* m1 p$ G% b" `' E' F
} 3 l4 [. h( A/ f* }- o' Q0 g. d) s
}
H% |" W% t# `8 \' Y* o g6 `7 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' ~+ O% ?! k: n3 h5 C7 v4 D% z( }{
% l. q2 b9 f/ U' U: [ RX_MSG_PROTOCOL buf;: I4 Y$ s6 F6 V3 r: R% _4 d" D( S0 {
* y5 P* o3 A4 ^ buf.a = pshreRAM->a;$ D) X- {/ I( u0 l9 L
buf.b = pshreRAM->b;3 T) q: }) J x# c) Z
buf.packet_cout = pshreRAM->packet_cout;1 B% _; E3 m. l: |1 m
* ~, u; d% Z' t/ @4 T8 X. y
if(buf.packet_cout != count_copy)( }/ r, P1 Q5 j. s$ D& Y* i
{
1 P ?4 \( C/ {3 z printf("a is %d\n", buf.a);
! v# k! ]/ X: p+ p printf("b is %d\n", buf.b);
p: C7 B0 @0 @9 f+ X* v9 |" r printf("count is %d\n", buf.packet_cout);
1 W# e7 M1 p6 l6 v1 X7 z6 z! C4 t count_copy = buf.packet_cout;
6 i4 [ K1 ]1 C0 u D } {7 |, `4 h% I. r: L( E) d' Y4 G
else
6 t# J4 T. N- f, z" j {
# ]. N) O1 I6 V0 c6 i+ M6 ]% c printf("No effective message!");
! @+ g N* C% b& ? }
& K& F7 s2 f& j}
, h8 \) \8 f. l6 I
! u6 t8 K. C& ^& u. f5 \2 ?8 y( A y! M+ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 d. q4 ?3 Z! D( g& Y" e使用下面代码,对内存使用了mmap函数后:
: t6 f4 O; ^7 m" H* y' Y- a#include <stdio.h>
. o8 e/ ?5 J! `, r2 w#include <unistd.h>
+ @4 k. e6 _- H7 O) j6 N#include <sys/mman.h>
7 n/ Y: j& O4 R! I* x#include <sys/types.h>
% t5 ]6 G" U. k; L$ e4 ]7 o' m#include <fcntl.h>
# b3 p; s4 S, G0 [0 x% C
- H; I8 \* p* z% X' V#define SHAER_RAM_BASE_ADDR (0x80000000)
0 Q+ j T$ q M. ~5 n. z#define SHAER_RAM_SIZE (0x20000) " ~* z. Q; | ^8 Y( g M6 j3 G
& v# J" }( N' L8 G& g+ }0 D. i
typedef struct$ ]2 m8 Z- j: S
{ C/ u+ ~2 L; V+ c- C
unsigned int a;
. S: J/ Y9 q) b0 E/ u4 j unsigned int b;" \, R. H% E- [, X
unsigned int packet_cout;% {2 ^& {" {; e! `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 L" h# F( l# D7 p5 D5 N0 N6 V/ O+ |! _, n% B! n: Z
void read_MSG_buffer(int *baseaddr);+ j2 ~* C* K0 o) g/ x+ @ \
unsigned int count_copy = 0;
1 s) @- U. O) M4 o% `5 V3 \; p5 e' s8 x: b; w
int main()3 \; D$ |! u- s( q1 ^
{
( o8 V3 H" N: G# y, Y int fd;
7 g! S4 c! I2 g& Z; z+ L" ]$ p* K int *mem = NULL;1 |0 U0 j( p2 z( ]& s
; a" W* x) E' S9 k if((fd = open("/dev/mem", O_RDWR)) <0)
" C* B3 s) }2 b' D$ Q+ [! ]3 O {! g ~! H' X3 f
perror("open error");
' _2 L9 w: C" f0 E return -1;: b4 I, u8 e7 R) f' l0 f; Z1 E$ N' U
}
. Z, _- p9 Z- t% l 8 r' ? F, S5 X, E9 i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 Z- U; o8 M0 T8 l) |" z1 k1 e& I* B# `9 z
while(1)
8 e$ e$ l- Q0 I' o/ E8 W/ G' |% F {
, i4 c. [$ y, S0 G6 |# v. } I4 C read_MSG_buffer(mem);
# \( s, P% K7 e } % P4 `8 l6 ?. W% i" _
}0 L8 s6 D3 L9 A$ w5 X: _
5 K2 I- s2 C2 F# S1 p, avoid read_MSG_buffer(int *baseaddr)6 t# o8 W9 [/ I6 a; O
{1 Z/ \# @" X; n" s& l% b2 d0 U5 n! `
pRX_MSG_PROTOCOL pshreRAM = NULL;% `8 V8 {( o$ t8 y: W
) Z3 r! M6 z+ h2 b$ X$ p5 K0 O pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
l+ ]0 O) s7 b
0 v4 W* h8 w$ t) |9 w4 _ if(pshreRAM->packet_cout != count_copy)
6 f" u5 w% B: m0 g7 ]! [ {# f9 b7 V8 h' h# [5 R7 ?3 @% ]
printf("a is %d\n", pshreRAM->a);
6 g+ p- I4 i: y6 _ printf("b is %d\n", pshreRAM->b);- I1 H8 B& {# K
printf("count is %d\n", pshreRAM->packet_cout);% i- R# H6 p3 {
count_copy = pshreRAM->packet_cout;
4 _0 e/ z% a: N+ m9 f }
/ R, t* ~3 ^: i6 a* T0 }! |9 ? else. C. @1 u0 ~, T8 k4 r; v3 r
{7 L/ r4 v3 B: K( h' D3 r
printf("No effective message!\n");
0 r4 n/ [8 E/ X6 F }, ~7 ~8 C5 p8 s6 s" g0 m
} ~& R) M" D' k4 r' d3 F
1 \& U W" f" _8 s* q( m' e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 w" C! l0 z7 s: M5 h
+ Q# Z1 c Y% D( F
( V( n5 z" a/ V) `! i; b: C$ }: o$ U" E5 B8 Q) A
1 b& M, Z/ g1 ]5 q
|
|