|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 q) a) z9 D n& J4 Q3 @2 F. W
: W4 C6 T, F) q8 V3 n4 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) g. R+ F3 q; p, D1 W+ c#include <unistd.h>. y9 z- C8 `4 ?# k' p- J
#include <sys/mman.h>8 u+ R, [6 H5 z
#include <sys/types.h>; G7 w9 e7 h8 Y. `9 X, y! p& t
#include <fcntl.h>! n7 S. P: w! h" k! D" y
1 J% C3 ~. x9 R' `
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 K0 y' Z/ z3 I7 D
" @- Q, i2 \3 d$ x& Rtypedef struct/ K6 x# q8 W' {5 I* q, S5 A" X& D
{
3 Z/ ^, u* m- C. h! R unsigned int a;; t9 K) {) W, w Q4 r2 f* L, ]! t
unsigned int b;/ Z( E7 m, r7 E8 l/ W4 s$ G$ B. r
unsigned int packet_cout;
& s" e( s, Q- ]% ?( W- C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 r% u3 s) i4 J8 w
% b; n- d7 M( l0 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 T! h' }7 t6 O# X$ Lunsigned int count_copy = 0;
$ x; i6 ?( [0 J' R, d1 r3 m; R A' O& \! ^: P2 ^
. s% @6 i3 v; W+ i# v) Y3 I8 `
int main()! m" g/ r- w% g9 `
{+ Z. P: h8 }. [- y
pRX_MSG_PROTOCOL pshreRAM = NULL;& o+ t" l, [3 o8 w% S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: e4 C( o5 c. }8 v2 N. ^
% U$ Q2 ?6 C, l2 W4 T9 H; | while(1)
4 X q# u# J8 Y {
$ \% @' p' G3 f/ r read_MSG_buffer(pshreRAM);
/ [' H A% ~' E }
% ~( }& ?/ W4 _" d1 X}" y+ g7 ~: r& @# ?2 f
p7 Z" X3 N; \1 g; Q2 C+ ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- S% q: K$ O+ I) E/ @/ \! g0 U
{( s. V& O( a( J# U1 K! W
RX_MSG_PROTOCOL buf;) ^3 F0 ?( M7 L7 O
; C8 B1 _: w' `# F1 @& d9 W
buf.a = pshreRAM->a;" _, u; ~' ^7 B! {
buf.b = pshreRAM->b;
* X6 f' _7 U3 A) J. d) k buf.packet_cout = pshreRAM->packet_cout;
1 ]( E2 v8 Y+ [; P ; F& k* ?6 I/ j# b1 A$ j# R* S
if(buf.packet_cout != count_copy)+ z7 R# M' I+ W8 q% H* ~& l6 w% v
{
7 ^3 l( H* p! O9 B' C0 | printf("a is %d\n", buf.a);3 p T- a) p' z$ c( }! @
printf("b is %d\n", buf.b);
) x1 I1 x: T8 x. R. u9 J5 ~* o printf("count is %d\n", buf.packet_cout);" D# t$ e6 U. w1 }
count_copy = buf.packet_cout;
! v. s7 C* x' z8 [$ V }7 f% F0 h: V8 ~ T3 w" b0 M
else
8 ]' f; Y, N. n2 e+ a: K8 Y {
0 \' e( g8 J: X+ h$ [& \ printf("No effective message!"); K1 O# q' @! I. e8 H" T
}
( ?8 q5 U& l5 i* S1 G}( S( }6 u& j% V
4 K3 l! p& z/ G8 t( e
) g- [8 } M; P+ t3 ]. Q( D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! }4 J& v7 G5 @8 @" C1 N% \使用下面代码,对内存使用了mmap函数后:
# j6 p& K* X0 R0 X1 k#include <stdio.h>( \! X' h/ B0 W% w1 w0 I
#include <unistd.h>
0 h# F \5 O" J: H#include <sys/mman.h>
( V1 d$ Q, m9 _/ {9 @4 ~" b D#include <sys/types.h>- ]5 E) D" B& u9 @+ Q
#include <fcntl.h>
. K0 j; B7 e3 ?5 t' D* u8 G6 r; c
" X7 N; N( p6 d( P, w5 U#define SHAER_RAM_BASE_ADDR (0x80000000)
+ m9 i2 w$ i0 M3 z5 A) n#define SHAER_RAM_SIZE (0x20000)
& \8 e( Q) b/ f# i0 N/ l% p7 W) k0 x* r; e* Q- a9 T
typedef struct
9 ^0 F7 L- A5 A$ {$ M1 w{6 k I1 C# j0 m4 s3 k
unsigned int a;
9 b# t6 ^6 |7 W) w1 ]6 A! s \1 u unsigned int b;! P' I7 @+ o" H
unsigned int packet_cout;& U7 W2 |- {0 h6 u0 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 x: ]2 T9 L; n; ?7 @7 R4 b4 W7 M
void read_MSG_buffer(int *baseaddr);5 \( W; L" I( H5 f/ g3 G3 v
unsigned int count_copy = 0;
5 p$ s7 v$ G( y, U$ c; W! e; t' R( a5 \* V9 i# Z, e9 L) S5 {# K) l
int main()+ \, j6 a( r' S2 N7 C
{ `" t/ _$ p% c1 x% J
int fd;2 e8 Y& i8 v; R6 x
int *mem = NULL;
% x% Q% f7 v/ e" \" A& n0 F6 q/ X) C' I& M1 x' M k% i, {
if((fd = open("/dev/mem", O_RDWR)) <0)
1 B8 G D" Q' f8 W% h0 ]- O4 e0 j! c {! @. M# ]. \; ^
perror("open error");
5 M* _5 k2 W! M1 B8 d' e return -1;" H# ?( ~/ X* g/ }
}
6 K0 H7 Q. H4 A# K7 i. X& D$ O
5 v Q' ?% B) u% c5 P% ], h- l mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 a/ e+ o$ ?, L9 w b+ x* u* G m% ]0 R5 d: Y+ M$ a
while(1)" k9 J( A2 t; W( q" S7 `
{
2 T: J( Y' K) J# {% I' R read_MSG_buffer(mem);
3 D( V1 b' I5 a4 ` u& y" D' ] } $ ^4 l2 o5 t% P
}
( F m, y$ I; j/ G* H3 I; z1 e+ Q% V5 q9 y% t/ P3 _
void read_MSG_buffer(int *baseaddr)) g: ~" L. h' l' Z" [- |, c
{
) h m5 F4 |5 \1 q6 w; Z* S9 [ pRX_MSG_PROTOCOL pshreRAM = NULL;! f! f* V6 Y2 p* W
5 k! k& j% {/ m( {: B; j) k9 t; Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! q# U# f! G" G2 ]3 k
: B1 {- _$ |( ^
if(pshreRAM->packet_cout != count_copy)
H2 f/ i y3 { {
) {5 ?/ o' v5 \2 v% t printf("a is %d\n", pshreRAM->a);4 z$ L ]8 k7 w% C# e5 a2 `
printf("b is %d\n", pshreRAM->b);
- N; S8 M) w, ~ printf("count is %d\n", pshreRAM->packet_cout);
2 T: g& f4 w3 n6 `$ m* q6 f/ Z6 Y count_copy = pshreRAM->packet_cout;
4 |6 }0 t- @! S4 u2 n' k }; c- v; x$ T6 O) X9 Q0 J
else
1 L7 \8 A( [5 I( H) W1 s6 u {: }; F3 P, U( }+ n. j
printf("No effective message!\n");
( |. d) Q5 D; o' G }' D' f7 ?2 V0 I/ A
}
) `: o) a o* O) c8 w5 X! g; U( \, x7 O3 x6 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% N2 _; B4 W# B. @9 C
3 R" t; M- ]* l( c3 t! P; b' B
( U) w V5 N' C, A! H8 r8 [, A7 \5 B
7 o5 S: c7 ?; N
0 d, ?. @3 S5 d |
|