|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 F. K/ I4 J8 R f1 d @" S' |! U5 Q3 u( L. g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 ]8 y" Q$ |& |: y" h#include <unistd.h>& V. n" P" ~. L$ l! `2 q
#include <sys/mman.h>
; h6 Y& M2 m3 l8 z2 ~#include <sys/types.h>
' @3 I. \) [0 p b. i; K#include <fcntl.h>
1 ^) F, p/ R2 M3 |6 t3 H4 W1 q. ~0 X
D6 k, A6 G" D; w5 e8 o* K( S) A; A#define SHAER_RAM_BASE_ADDR (0x80000000)
9 B- x0 e3 j+ e, N3 `
$ L6 k) m+ M$ f/ H+ F4 Qtypedef struct
) E7 _' L7 w# |{5 |* l7 p/ v* N3 ?
unsigned int a;
# Y7 I M) N, Y; G4 M* ^. i unsigned int b;# a6 G- B h# f+ N9 g1 i: {1 a6 t8 F) Z
unsigned int packet_cout;& ?, c' }0 W/ g; X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) V/ J4 A. @% a6 w) C" Q4 o
; g; R: J9 v7 y. yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: N8 L3 O4 w) w4 t+ i V1 Funsigned int count_copy = 0;6 b/ X1 j+ T) ^2 T$ Z: w
/ `- {5 k& ~4 ]- T/ _ n2 _( H, R0 g1 b4 a$ P5 W( d
int main()
# n( S$ P# j9 @# A{9 f. ^: {, s3 _' f6 c# P
pRX_MSG_PROTOCOL pshreRAM = NULL;+ X6 g4 }2 G' t2 K* a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* x& s# U k4 z `( x( B2 Y5 a8 o
' E1 H, K/ g- F( P( z* z while(1). F8 D2 C. x6 u% R) y
{0 e) F5 `7 P8 G7 t
read_MSG_buffer(pshreRAM);4 W! u$ D% W' L+ t+ ]
} & F4 _0 N1 \3 m: E/ ]
}& p! X4 r" [* K0 B' K
% ]3 r1 @: t8 Q# `4 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' d* a" \8 M# z7 C( V# F: A{5 e `) W2 q( B9 B
RX_MSG_PROTOCOL buf;
: o# F* s& Q( C" v 2 Q0 Q8 k. v" E- `0 V1 i& Z
buf.a = pshreRAM->a;
% o* b: S% I1 l+ }7 K& \" i* s buf.b = pshreRAM->b;- ]4 A: O5 P; R/ {) s1 S3 Q
buf.packet_cout = pshreRAM->packet_cout;" \" ?/ D2 }" |. q$ \, F2 B
( Q" o6 b6 ?) |* {3 y- @: X
if(buf.packet_cout != count_copy)' ^: A1 s+ V# M. k+ w3 a) b
{
' l! s! F) x3 m+ y' g( k* d printf("a is %d\n", buf.a);
3 W! p6 B7 M) |7 o f$ r8 c5 O printf("b is %d\n", buf.b);
+ s( Q. r( E/ L8 e printf("count is %d\n", buf.packet_cout);: R' P3 o4 ~) r Q7 E/ O
count_copy = buf.packet_cout;) a A$ f0 j5 w
}
7 b$ m8 v( j+ w9 g else
" ?9 l/ j' G7 w. X& y {" l7 R h {# S& P: `/ \0 N
printf("No effective message!");
1 g+ j+ W+ F9 S( O1 A }
4 b* ~$ `5 K4 k% x$ n/ S}
: b2 k% s% `0 R" u1 J. g( z4 j
$ i$ C6 V: F W4 |
5 c6 k% q: v* R2 m. U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ C- A, }* U P0 A
使用下面代码,对内存使用了mmap函数后:7 J7 O, u3 m) ~3 x! _2 A/ ]$ F
#include <stdio.h>
" ~; t: [. K, b, C% ? e; L* E#include <unistd.h>
: Y" x5 b, g- z6 F" {- C! L* r#include <sys/mman.h>
2 L9 V2 G& g& X7 D3 @" H5 [#include <sys/types.h>/ V7 E* }5 f5 S9 N+ V2 J
#include <fcntl.h>
& M6 z) v0 p* ]- P: p: ~, k0 U! J! a# j1 C
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ R4 o) F8 ^( Z. i% d#define SHAER_RAM_SIZE (0x20000)
8 l/ I; ?* Q+ m6 d1 q# t: ]' K( l: D) \1 Z+ }
typedef struct
" n; Q( @* Z# \% f{
: u; o: r6 j( [) X' ], P9 s0 ~ f* A unsigned int a;/ R7 b8 U6 Q3 x1 v3 e" ~. b; t% s
unsigned int b;
. B5 U. X6 t5 E- }1 t5 o% W( W8 Y, m unsigned int packet_cout;! T2 |/ j Y/ Y b* R3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 `2 j' J6 L+ Q% _5 |
r$ e d5 J, M4 l% a7 ]6 N
void read_MSG_buffer(int *baseaddr);. p; e" n+ A. T! ~5 S9 t& Q
unsigned int count_copy = 0;8 P; f. Z* Z9 Y/ r
, Y5 F4 y) F: }% X' J- X- K iint main()! d, |( B* L5 |& y# a2 h* Z
{, N3 ?. Y- A2 k6 Q0 _ s7 U
int fd;* ?5 H& Z5 a" J. ?+ f. w( c
int *mem = NULL;
6 u8 ^8 j: h3 d0 \* S
' Y9 Y4 ~! `" w5 j; E0 R/ Z$ y: N if((fd = open("/dev/mem", O_RDWR)) <0)" R$ G0 X7 R: M* Z. I( }( i
{( l0 H3 E; s$ [
perror("open error");
3 x% x1 ]! y9 Y( F3 n# a; L; ^ return -1;" G9 x9 u: \6 q4 J$ @2 p9 r7 K3 U
}
% o0 x% B8 d) C7 v2 ]/ f) U
z0 V3 M2 C5 O! x7 I& P$ n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# ?6 V/ K$ R5 Q3 ?6 H0 o; j
* }) E/ C- L* g- v4 G2 j1 X
while(1)
+ Z" g, [7 r$ A" `: h {
, }0 K# N* C1 y! ] read_MSG_buffer(mem);
! R- E3 n! e" V9 D } 9 a8 X7 N! m/ e4 f; @( R
}
9 ^' S P/ _4 Q4 P( @! V; z9 T
# `, S' Z) \; C# y3 C8 c w: Lvoid read_MSG_buffer(int *baseaddr) ^5 s: B g; X8 T% v( {
{
0 Z: E3 c) I" n- G pRX_MSG_PROTOCOL pshreRAM = NULL;' L# v5 x3 o; A, F4 q
" R9 w* ?# _3 q1 A/ x" y7 T/ s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 F; Z) @! f, ^. P7 f
. ?- S7 B6 Z( b2 q0 F* U
if(pshreRAM->packet_cout != count_copy)9 u$ C( W! z) W5 i' Z
{
$ r5 A M- D( z* `+ q: N; A printf("a is %d\n", pshreRAM->a);
2 {. x! V' P* ~8 c: `2 }- g printf("b is %d\n", pshreRAM->b);
2 N% f: b" \: i9 B, O; K printf("count is %d\n", pshreRAM->packet_cout);
( g; L7 W6 r2 r1 o, v count_copy = pshreRAM->packet_cout;
4 F% k9 V4 ?1 N0 B5 Y- r+ S% w) ~5 c8 M }
/ ]* m* V3 W- {& X( y else
5 q, ^2 z& t" p# a: p! Q. w1 T {& l9 b6 Z8 g# L
printf("No effective message!\n"); ^$ u, ~: [$ I* Q/ P' \- [4 o
}
2 i8 p0 R2 S& ?9 E+ m4 n}
) u; V v) M; w {7 }6 H! V) y1 O7 e, ~8 O# G& u8 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 o0 `4 i; N: V% ~
8 R! G- J# d; n# H" ^5 |$ I# j3 Y
5 w* m3 B' X: O4 X
7 I1 D. S& J& {1 ~ B) t V6 n
7 G4 i4 j% J. S, I, Y. D* v7 ? |
|