|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( t+ C1 h h0 B0 F$ ]1 @
4 W6 `0 s+ X) ^, K8 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ o- V$ D; N; M1 K* e#include <unistd.h>, I; D) {" P8 o/ ]8 W/ t
#include <sys/mman.h>
7 Z n& z/ L: K#include <sys/types.h>
# q3 H! Q* ?/ ?& z, u#include <fcntl.h>" e& @$ _3 S* M- V' i
3 o6 u- H/ a7 [$ |5 `#define SHAER_RAM_BASE_ADDR (0x80000000)
6 v6 _- F. |. f& Y* H% R+ [3 L8 r1 }! R; q# }
typedef struct: M% m4 T+ f' ^
{
* i- {8 s: M& q5 C* { unsigned int a;1 N& s5 M/ |$ @3 g
unsigned int b;& {0 g" x8 p( r/ _3 g4 \
unsigned int packet_cout;1 s' f! z' ~( G: e/ ?3 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! u6 f1 R1 W) K
A- t+ x# J0 Z" V. _1 Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 u: o$ e, o- ^% W+ t6 @5 g# a
unsigned int count_copy = 0;
+ H( R9 W* m7 W c7 {; P0 l6 _" B) r2 H6 r; g
5 Z8 x2 s% U- j u0 u+ E0 Mint main()4 @# x9 L7 W0 Q' Q+ L. S
{/ n' u `2 Z1 ^! o# N. `
pRX_MSG_PROTOCOL pshreRAM = NULL;5 q& e% X3 |& R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 x7 q0 c! L) `& o
) w5 e h, V9 S4 J
while(1)! m8 ?/ b8 H- W: N' C5 j
{$ b% b* @! \4 e2 |( E2 O
read_MSG_buffer(pshreRAM);2 V% P: T/ B4 x# k
}
- `7 E! g. c. b/ e4 T% Z}
% J% b9 k: y, t+ v1 z# |; u" R c7 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ h: Y" | D2 [
{
) p+ L) L" Z9 Z" r/ y3 v3 `7 }. d RX_MSG_PROTOCOL buf;
; m1 U( t7 u# B) p r4 n0 f" h0 x% ~
buf.a = pshreRAM->a;: x( R( X8 H) E5 l5 A. {
buf.b = pshreRAM->b;
1 k% A3 i1 M7 `6 v# R5 @ buf.packet_cout = pshreRAM->packet_cout;
. D% f9 n1 r8 U1 a$ t$ J$ T
7 z1 F8 _2 S2 C2 @ if(buf.packet_cout != count_copy)
" S6 o8 v3 S. A- S9 E$ m2 } {
% b- T4 \* t! A printf("a is %d\n", buf.a);6 G3 [; G% y! c' i7 N1 }
printf("b is %d\n", buf.b);
& O2 h6 W0 L: d U6 }4 s printf("count is %d\n", buf.packet_cout);& x3 p+ g: C* A0 H. P: G1 O P- N, w
count_copy = buf.packet_cout;
u1 P& N2 r: ~ }
0 d7 g3 ]8 W! ]& x: \: f else+ z1 g# S2 Z8 s K$ K
{! a- B! |- W# E( Q
printf("No effective message!");
9 z- P% S* h6 f3 G! f, ?- l2 V }
, z/ X u& [4 e! @$ v) x! ^}
3 L2 a5 U# N p1 b3 O {6 z
) Y) {# o& L a$ E
; l# N6 Y+ W, E* _6 f6 M, t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 P2 x1 f9 P0 A使用下面代码,对内存使用了mmap函数后:* F3 J d8 e4 K5 o. A2 A
#include <stdio.h>
2 l* `& F! z6 P9 [. _2 e#include <unistd.h>! J3 y8 m- n0 m" |1 M
#include <sys/mman.h>' x" X( w- w5 z0 M' V6 O" P
#include <sys/types.h>* v" i% j- F& w+ N: W
#include <fcntl.h>
- M8 ?! P, L! z& j2 d7 f. m$ N6 F( q0 u' r: f% x
#define SHAER_RAM_BASE_ADDR (0x80000000)3 _! V1 D$ a7 g3 f% v
#define SHAER_RAM_SIZE (0x20000) , _/ R# [! X' }6 t6 N7 r' ] P
; F8 R& n: B5 u2 }* t. gtypedef struct# q: c, E' E: E; V
{8 u) G+ `/ V& X+ f5 I1 D. E$ f
unsigned int a;
, E/ s; L4 e- ` unsigned int b;0 r; `- r) e) p5 P9 U/ ?. E' \' W
unsigned int packet_cout;
, i P f# X3 |3 M, c* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 c# ?7 _* M) { ]) q" t3 k
$ b* d2 x7 O2 n' |
void read_MSG_buffer(int *baseaddr);
1 p* y$ h3 t2 I, j' c' Wunsigned int count_copy = 0;
8 L5 f" L: t# ]4 K: z6 e- F1 G! O' o7 p3 k
int main()
; R7 e% b- {7 l{# u" J) m/ n6 I; x
int fd;+ \7 z0 C: K7 |
int *mem = NULL;
3 A6 N# [/ P$ S* A, l
& _& o1 t' V& u# y* o if((fd = open("/dev/mem", O_RDWR)) <0)8 c. F4 _! A* Y7 ]
{, ?) s2 z9 f) p5 D" \( j' C
perror("open error");
8 W. o& u- Q3 e) T) H* g7 b return -1;
+ ^* v% ?4 I7 {. ?/ @* p }/ L" S4 U$ y; l, B; b* @
2 |3 c; [' u/ v0 [8 Y/ K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; n6 w$ ~: J7 B5 `: M
! }7 } C# c% o. [" W
while(1)3 @# N% m/ M: b; Y. ]% F! `, Y
{8 L: l; g4 s& T! ~
read_MSG_buffer(mem);9 E9 n6 @# E1 |+ ]2 X
}
8 ?3 x8 A" L4 o2 {5 s}
, m- n0 l5 h+ {# Y
4 m; K: [/ ?; A |! E# G( O7 Ivoid read_MSG_buffer(int *baseaddr)$ O8 w0 m, j& \$ B$ V
{$ |: X g. ~2 u1 R0 [: z1 p
pRX_MSG_PROTOCOL pshreRAM = NULL;- m/ V2 \: \$ V; ?- |2 T! r5 b- b
. z9 t2 R/ w; S0 r* O6 _8 W; F pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. K \* w( o( \" K7 B) D3 B
. T+ i5 ]/ ?. o9 D if(pshreRAM->packet_cout != count_copy)
# B) K/ v3 U9 H, M% a: j$ O1 @ {: I. G( @+ J% @/ F# N7 G/ d, P
printf("a is %d\n", pshreRAM->a);
( X' C5 X5 M7 `% ]0 j2 @# T, c printf("b is %d\n", pshreRAM->b);
3 o3 N6 k: P) [9 _2 ~! s- { printf("count is %d\n", pshreRAM->packet_cout);/ z' ~# @5 h, U6 y5 |0 `
count_copy = pshreRAM->packet_cout;
8 |% `0 C `9 F }! K/ ~0 [ a" I# m5 H4 u
else
( Y4 c5 _0 I1 A1 [ { ~' l2 n. f% C ^% r8 Y
printf("No effective message!\n");; e. V# S4 U+ ?4 s+ H& ~: H
}
0 Y- a/ N" T; i4 v}: n, D7 u% x. E0 b9 O
7 ` N7 j: |# @% Y0 w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# s: H5 Z$ a+ q& u5 [/ X, v1 d
& ^5 K! _$ ~, n' s% a
: f- R* J) _) R* a* e
. {6 p1 ~; [# f% i& g( q* m5 Z& D* k% v/ e" ]
|
|