|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s* U3 {7 q- N/ w3 Q! Q' L% d5 r1 N5 K7 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 x8 k$ g% x, A
#include <unistd.h>
2 F& B. i& W* q1 W2 h" {#include <sys/mman.h>
0 H/ I+ p, H2 G, r#include <sys/types.h>$ {. O4 b, o' s# ~( _
#include <fcntl.h>
& _" k0 @ o# |$ Z7 U/ ^$ q O }/ } y
#define SHAER_RAM_BASE_ADDR (0x80000000) . u9 _& x- S: u. T2 s" n$ v( D
2 H4 i/ k( [ G* n/ v) C# i
typedef struct/ z( Z+ O5 q5 Y5 u, A
{- D, l6 l9 w: e' a, L
unsigned int a;$ O; `( Q/ j `4 J+ a: H8 P
unsigned int b;
5 q0 O' W7 P6 p5 [9 W: m. o' V unsigned int packet_cout;# J+ i4 H7 x( w- ~/ E" M: s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 E! ^$ s3 j# t. {# C
1 Y& J* V3 K/ [( W9 e+ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 `, f: \! t+ W- Q, iunsigned int count_copy = 0;
3 P3 B2 A( o% e; V
& T% C" A2 R# y1 P0 o* c: M
$ s$ ]& E3 v0 U* Uint main()
# l2 n* @1 Y0 u8 Q! v, B, e& x{
$ P8 c* l3 L% [+ D# d" M# B1 ]9 ] pRX_MSG_PROTOCOL pshreRAM = NULL;
, W4 u* [. W8 I pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! [! i3 ` H. L- P) N( t* L8 a: m. n# u4 ~; S8 Y
while(1)
; ]0 H* t8 Z" H3 H) } {
1 Y6 f* R3 u+ r4 y. T. i7 D- g* H read_MSG_buffer(pshreRAM);- I3 \0 B! I% c
}
. p( }* ]5 c8 C: {, Z5 z$ P4 k0 J}- g$ g! t; H( Z# _; @
/ c& z0 @1 Q" s* s& Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 L5 T* W: H- V8 r8 ]2 @% d{
" D; l3 E) c' f! a1 Q u! o RX_MSG_PROTOCOL buf;4 o0 _/ G8 ?4 v/ y) @2 i) Z: V
2 r- f6 T. R" D1 A buf.a = pshreRAM->a;
: y* V% t' k Y4 [- Y" M buf.b = pshreRAM->b;
5 Y2 z/ i, I! a' p buf.packet_cout = pshreRAM->packet_cout;
# n' Y7 q2 |% S- l/ y9 Y 0 v9 N$ a2 Z/ X' H+ f8 C5 z
if(buf.packet_cout != count_copy)
9 g+ H, r8 B8 @( T5 m7 H* g9 k; K {7 H; a3 M B* [& K
printf("a is %d\n", buf.a);
, G' U$ V6 |8 h& q printf("b is %d\n", buf.b);; d7 X! ], r( b$ E7 b9 ]
printf("count is %d\n", buf.packet_cout);
0 l0 Z/ O& l/ I+ d count_copy = buf.packet_cout;
2 ]& @* B4 O/ O. w }
~1 L& C/ a" ^4 x else
/ b, G2 Z0 [# { {
; P# [- k' z( X9 b, ^ printf("No effective message!");
$ k- x" q( B- F8 ^" ?% H5 t4 ?* ~ }1 c, U# `5 _: A1 C1 x
}
: b4 K! `/ J6 }! F2 L* E3 p5 C9 k% _8 M1 b; o
' H7 o$ q) c1 j$ ?, R# U {但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 H: k; ~$ ]- x0 P$ u使用下面代码,对内存使用了mmap函数后:
- O% G0 o6 h" N& V( r#include <stdio.h>
7 F- K j! Q4 n* Y3 N( W#include <unistd.h>
0 v1 \# Z* ^! \, p; F. ?#include <sys/mman.h>
- @5 F; H, `1 {# P& V# v, q0 P#include <sys/types.h>
5 r6 ~1 s$ K' f1 F# f. a#include <fcntl.h>4 A% t) E8 J8 r1 a, l7 ^. ^
0 r& _8 w0 J% _& T( Q' e, m
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 e: \* _1 l9 G5 h2 v3 t#define SHAER_RAM_SIZE (0x20000) ! X3 r0 C+ U: I$ k' f
# }% F. t& o. O. b8 F- otypedef struct
* A- k6 Z" ]) w8 v2 ~7 w0 x. S2 r{
( G" }" Z- Y. f6 K' ~0 x unsigned int a;
, F$ q ~0 w; r unsigned int b;
2 U% ^' p. W+ @; z unsigned int packet_cout;" }& m# S4 v3 e& y4 x7 O+ s/ m! M: Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* p: W4 Q$ I" ^) M' d7 s2 [
3 ?/ p! r& v) pvoid read_MSG_buffer(int *baseaddr);. n6 S* W( g4 p0 @# K0 M7 h% D
unsigned int count_copy = 0;
) |/ ?, q0 y+ C5 E( j B1 u
" q1 O5 B+ h2 e* v8 S. x, Dint main()
) s& N) `4 C: d2 b- h! Y, @, _{
' R6 K0 @! G/ I+ B# ` int fd;0 x" k# l) J; g
int *mem = NULL;0 x) q! \& w- D- G
6 _. {+ c4 X- f9 X
if((fd = open("/dev/mem", O_RDWR)) <0)
) ]* v, f0 v: Q$ B3 P# V" \ {
3 T8 y" r& f6 m$ Y" G: Z' h- p perror("open error");$ T" k% g& h0 o6 g; i
return -1;
) K4 J* a! |" f+ ^ }% K' z) D; t) i; U3 w
+ f/ N, I, a/ m1 w1 S/ [& e mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 Z+ r4 W6 }% X( s- q+ o( Y/ k0 c# D$ l0 O8 z8 u Z/ N) z1 X
while(1)
7 ?( R* q7 w6 h {' Q x% `( t2 o6 {
read_MSG_buffer(mem);0 K* q. c, G8 x. R5 E
}
' r7 e* J, [' a6 ^; k}0 Q# r' B( U; }- r5 L
* h |+ x: ^/ c( [6 L; ]( q ^void read_MSG_buffer(int *baseaddr)
; }, b8 W$ @$ l N! b+ i; Y" }{8 m0 t- d" T$ A! T7 K& q5 Q! g* J+ S
pRX_MSG_PROTOCOL pshreRAM = NULL;6 K0 N5 `* }4 v# l2 p
9 w( u5 x8 ~& k# ~' N" w0 H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! B0 Z6 r3 x9 v8 E- g
5 }/ w; M5 k+ n; B4 w5 |* t! A3 j if(pshreRAM->packet_cout != count_copy)
( ?0 P. ~. Q9 L4 a) L' X y {
+ [/ l1 n; ~/ P" \6 ?' X printf("a is %d\n", pshreRAM->a);3 B5 b; d: }7 g+ k, `3 y
printf("b is %d\n", pshreRAM->b);
: X: y, ^; ?2 B$ l printf("count is %d\n", pshreRAM->packet_cout);
8 R- [2 V2 J3 Z3 i# r; d7 z" p count_copy = pshreRAM->packet_cout;
6 I* g' M0 A; X& e }
# z' j, U$ Z+ W$ [ else
7 V5 O1 q) E: ]( G* w: J {
- p- {3 H* w4 `) H$ x printf("No effective message!\n");
7 x1 u9 M9 A' d- z }
1 \1 L3 c2 ]- B' \}& |8 E) W- g! l) _) ]2 c2 F
3 Z8 e8 f: A; u, B没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" r( O9 `" w2 ]* f
9 S' }8 [3 k s9 F) i
3 a% P* h: V. X3 a; x9 }" k6 M" r0 w) J" Y$ B+ r) T* ]+ c
/ M5 x C! o2 t0 m# e1 \% [
|
|