|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . l! Z/ _# i7 g7 o; e3 ^1 i, o) Z
: v: P/ ]8 W `/ B# |4 o* x BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 l3 i2 l7 A0 Z0 ?# Y; g" ]#include <unistd.h>
2 K0 P* C0 @* Y& Z: l- k#include <sys/mman.h>
5 z0 r3 {& b8 o2 k" [- c5 Z#include <sys/types.h>
; L( f# w6 k2 ?7 C h#include <fcntl.h>
% X" q# G5 j" i' H# c0 x/ ^; ]- k+ @! u$ d" V; m" @
#define SHAER_RAM_BASE_ADDR (0x80000000) ! A. i$ S; B+ E* F
3 a5 J8 E+ a& {9 w% @
typedef struct
3 I5 S% f- A1 X7 a; v{
5 Y8 H/ U0 Y' n9 Q* V$ D/ k; o9 L unsigned int a;0 B/ E- F+ r; g
unsigned int b;
6 L4 ]; z! Q! U0 D* { unsigned int packet_cout;; r& r8 K/ o* a4 M' p* T0 ]- i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 w) r- Q+ N# {5 m, x
2 Q/ ^( ^' A* T# D9 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" N" Z1 b! G) d; m' M. m
unsigned int count_copy = 0;
V) P3 U, e3 X4 w9 W3 h; A9 \
. y3 u8 v3 S' E% t B6 K: i1 ?% w: D# H1 Z, O b$ L) G
int main() O- E- p; E5 B/ o
{* H7 y s( x& }1 f/ m/ L
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 D. v. S; A4 r6 g6 @! X; S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 o$ M! G. a' a. A) E9 D' P# M
& n, |# [2 C' g8 \* ? while(1)
8 ^* y$ J6 K1 t: p {
( \& ~ S* t% C& R/ v- u read_MSG_buffer(pshreRAM);
3 E1 T/ S! q% x8 K" V }
4 l: x: _* f* P& N4 u}1 R+ i8 q% {5 K
, G# `- ^3 q; I2 M: P4 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
D& W3 W' q! v2 l4 a# p{
' C2 V1 o- x; `: s3 _/ L+ l. P) ? RX_MSG_PROTOCOL buf;
& @0 y! d/ y ]9 Y( K; ^+ F
! {0 \; l9 o5 e5 [2 V& g) N buf.a = pshreRAM->a;4 a6 I8 i8 _$ l
buf.b = pshreRAM->b;
: |3 t; p0 c) i3 l6 D buf.packet_cout = pshreRAM->packet_cout;
+ q7 q& a$ @0 r! X5 g: B% [/ Z. S; B - K7 e( v9 i& x, U1 F7 @
if(buf.packet_cout != count_copy)
4 d8 ]* `* C* i* s- T {
0 c: F0 K& `6 Y1 }: i printf("a is %d\n", buf.a);
/ {# @+ m5 `- g% k printf("b is %d\n", buf.b);* C$ o4 ?0 }. V% L+ L0 I
printf("count is %d\n", buf.packet_cout);
6 W$ Z {- |# `0 c2 g count_copy = buf.packet_cout;: o) J1 j8 ~/ i0 W Z/ ?
}; P1 q9 c |# O8 G8 F
else
$ p7 ]+ I: l S* w6 A. P# ` {
: _7 N) L9 m+ W: M printf("No effective message!");
9 q% o) h' s8 x) X0 O9 n- d: z5 q }4 d( }) @7 Z6 \& H6 \! i$ p3 W! `
}3 w& x* ~- s$ D( W! W" Y5 k
' r2 v: u/ o' c, u$ y; \5 ?
4 L! S9 [8 f8 l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 r5 z ^6 g1 s9 \0 [使用下面代码,对内存使用了mmap函数后:
c/ \6 n1 ?6 `% L8 U) _% u/ M: d#include <stdio.h>5 h+ E* u" ` C. o
#include <unistd.h>
/ U; s; m/ x- S$ t% O#include <sys/mman.h>' I5 M; {" y; C6 ]" k* C9 M
#include <sys/types.h>
) s9 p) ?) x% t6 o# I#include <fcntl.h>0 m+ ]& F8 M, l0 ?# d- M
' J. P& R& L, d) p* `& f
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ ~; @; S& b: q- K#define SHAER_RAM_SIZE (0x20000)
7 l5 R, R r/ x% }" j# P) z- F1 M& t2 |' M7 Z3 c D' [
typedef struct$ X S6 ~* n, E; W; Y
{
% v4 s0 t6 F0 H0 N' |% i; H unsigned int a;
+ L2 x* b5 f5 I unsigned int b;
: A$ ^0 Q6 V q, l( Q* o unsigned int packet_cout;0 k; ?4 `8 C6 @$ I, }0 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& H' W" Y1 }. f, Q4 j* Q
, F5 \4 W) ^' y5 ^3 G2 ?5 Pvoid read_MSG_buffer(int *baseaddr);
% C4 L* _/ N, _# D" r$ Yunsigned int count_copy = 0;8 p1 A: N2 ^; [+ T: T
6 S9 I+ X! t& p8 L
int main()
8 ~* y+ @& h' M+ M0 {{
. \3 L; S' G4 h9 U+ R int fd;; O" E8 v5 l: L+ ~1 y/ q8 h
int *mem = NULL;9 _! H5 c0 L: U9 O; {/ h2 [
* ^6 a" @# D8 o) @& { f- w
if((fd = open("/dev/mem", O_RDWR)) <0)0 N, X. W+ i) I( [; _! D1 u
{) Q4 {. f% f8 Q8 T/ o
perror("open error");, c& P: t& m- \+ h9 t/ g2 W' f
return -1;
x: F- C% ^- l, t3 y6 L }8 v: s% h- y( K; D$ _# F ?6 u
9 r8 d. s7 z# ~" o mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- ^2 r J! l" c! k0 F& d8 J F# y
/ f9 j3 r; _3 z. N3 S while(1)# [, M& [- o3 F. x2 J( M
{
2 S, w9 C- B! s/ {7 }* W read_MSG_buffer(mem);2 o- s# m# w6 K9 ^9 J8 [5 D* m
} 6 S& s% l' m% u+ f
}# r5 e$ x& d0 g. u1 }2 u
1 ?# B3 W" L+ w
void read_MSG_buffer(int *baseaddr) |/ j& O; B- b9 Y5 [. O
{
5 l7 ~% M* C$ V8 D8 p& | pRX_MSG_PROTOCOL pshreRAM = NULL;
/ e( B( _' u: M" p+ W5 L. G) o8 h3 ~; q+ U% B1 @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 w$ q. \" |/ z6 }
3 W. Q- }" Z7 J4 d; S if(pshreRAM->packet_cout != count_copy)# B. I b. u/ V/ o
{% ]% E. U3 t% L) W% L$ h" f0 t! }
printf("a is %d\n", pshreRAM->a);0 s2 f( e( d! K
printf("b is %d\n", pshreRAM->b);- o5 s! p" q `1 T& a. p2 ]
printf("count is %d\n", pshreRAM->packet_cout);
5 C, u4 x( c8 r* |* R7 h count_copy = pshreRAM->packet_cout;
: [+ K5 n& x. l }
" g4 @. U I3 ?5 p4 C0 C9 L# \/ h else* P& Z, I8 b V" q5 e1 B; s
{
* u j& a/ ] K6 H4 | printf("No effective message!\n");8 l+ ?4 j! T) H3 I! ~ Q3 n: e/ A
}
7 Q+ V7 ^1 B$ Y0 p, ?}! B* B& @4 w% H! c% H; v, T
- e( s1 F: O, ?# u4 \- \" _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 t4 Q1 x& V& t! w$ v
) r0 f! `. h0 N8 E, N) l
f- K. B* I+ q& P3 a. P" L9 [2 V- Z/ m
5 M$ W' t8 S q4 e/ Q3 m3 z" Z, W% G |
|