|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' |3 G% D' n" v0 E% g$ q* `, a& n4 {+ v6 y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% F6 O9 m% M- J/ T
#include <unistd.h>
7 u% Q$ |5 E- b: y$ v#include <sys/mman.h>: p: \# b- q2 y" e2 r( A* n$ [
#include <sys/types.h>; j& R2 g6 V) z3 E, M' M
#include <fcntl.h>' N0 A! v) H( }# w9 c' i/ N
6 O E: m) A8 n* V
#define SHAER_RAM_BASE_ADDR (0x80000000) & P$ R) i C- B. Z+ L+ F8 `1 S6 J Y
p V5 |" l0 C% N3 j. ^) n) ~7 ^& q
typedef struct! A( p: W: B: h) D6 k: A
{( e( i' U/ t# b+ I2 Y
unsigned int a;2 V( C, v6 G% s* p
unsigned int b;
# U' h* S! r# j: e, m0 m6 E unsigned int packet_cout;
& W. N# z) E5 s" ?2 c# F0 ^3 g4 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. `: p7 y% w& i, {$ `5 w+ J0 f' j
0 U% o6 s) ^: l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 m2 C* l! b% M; q, o4 O: g
unsigned int count_copy = 0;0 ^% \5 D9 n% _4 A% x" r/ t1 ?1 S
# `5 ^% J7 J9 r& D1 v$ p) T5 T3 g0 u$ Q4 @# T. M
int main()( b2 G0 u0 @% i
{( K; U/ H" q0 Q1 [
pRX_MSG_PROTOCOL pshreRAM = NULL;; P: y4 T/ I6 Y$ g: Q! ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 a/ M6 a7 Q- `- h
/ u" i3 l. L. B8 `' @2 A# u- @
while(1): I. U; l4 p3 A t" I
{
" E0 p. e" C; I read_MSG_buffer(pshreRAM);- ]6 {8 n2 ?$ g/ j
}
7 Y* M) { N- X% m; ]}
2 F! b9 i& o2 G) p! f
4 u5 t. n, c' D8 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" ^+ _$ R1 K" i& o. W, w3 N& s
{
1 C* _/ S2 @. | RX_MSG_PROTOCOL buf;# `% f. S8 u7 n7 F+ C( s% P
7 |3 \- M- c8 Y( U4 a buf.a = pshreRAM->a;
, K: A! ?/ l1 ^+ s' j- a/ z buf.b = pshreRAM->b;# L7 `) u& R7 c$ [
buf.packet_cout = pshreRAM->packet_cout;
" y0 H6 V9 ], C- a: _4 Q
* x; d7 q5 G8 S9 n if(buf.packet_cout != count_copy)
% @+ @$ k/ [. V) f: u6 q$ q {
: Q* x0 u/ a( l0 [4 G4 J7 W printf("a is %d\n", buf.a);* b4 T3 v% \5 d# b# W
printf("b is %d\n", buf.b);0 S/ G; S9 `( ^
printf("count is %d\n", buf.packet_cout);
0 T f" j T. Q3 K. @3 h+ i count_copy = buf.packet_cout;
- {7 d! o& W3 A }2 e7 H- k& ^* k, N1 W1 }# A- W
else
* {, W2 r9 Z8 B0 E% d {& Y' T! S( k+ }' R
printf("No effective message!");* M, I" X0 u+ O
}9 t- x2 s C' D0 f1 | V$ s3 b
}
) Y5 ]. y$ ~, j) i8 ^+ _' K
' O" Q8 j4 ]7 U; ^# b
0 ^9 H0 c0 ~2 D( U/ L4 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, n0 n5 v. @# A& ^0 M' N+ |
使用下面代码,对内存使用了mmap函数后:3 F" Y# O: M9 v) L/ @- T
#include <stdio.h>
B: `' G0 ~; a0 e5 D3 T9 h#include <unistd.h>; u! V5 E1 K$ s6 h" ]& S
#include <sys/mman.h>
# K9 z. ^+ C! Q#include <sys/types.h>
0 o x; d$ P$ v5 j2 D7 M- p: p#include <fcntl.h>; r' I, Y, q. |: T% l
) _8 P" F% t( I9 D* X1 \
#define SHAER_RAM_BASE_ADDR (0x80000000)7 K; T/ P" n }+ R. j. w
#define SHAER_RAM_SIZE (0x20000) % E' _" l+ T& D% H
3 L) U4 |" J2 P* L* P
typedef struct
5 V q9 J0 ~1 d4 [1 b9 p. A{: t- A; A; H- r# x
unsigned int a;3 K/ Y1 ^' h+ @% J2 y. O
unsigned int b;* v: V2 v, K& u8 I# H8 H# K
unsigned int packet_cout;
M/ a b4 N# Y$ C/ G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) E' X/ d, j3 L! L+ z3 P; F+ @$ q
& P2 g$ B5 Z0 K/ Jvoid read_MSG_buffer(int *baseaddr);, H2 |9 ~$ D; `" ?% |+ C+ U; b
unsigned int count_copy = 0;
" X3 p6 ~9 x* H6 z
( {( ?7 d, T& m. eint main()
5 v9 m2 Z, g$ A5 \{
& T2 ^# f7 ~* i j8 N% V$ V int fd;0 h" {0 q- ?( a* @; } W0 ~/ q
int *mem = NULL;
1 L |& D7 u) \7 a& Y. m& H$ b9 t$ e# {. H8 O4 }
if((fd = open("/dev/mem", O_RDWR)) <0)1 x8 e# P V: X8 ~9 h
{: P0 I: z ?6 T! \$ ~/ \; S L
perror("open error");
2 ?) Y c; U3 L$ m2 Z8 M0 Z return -1;
: F. e3 w& }2 G4 x# P! c4 |/ j! T }- r1 X$ K) A# Q: ^9 q
9 j8 ~3 I# b* E' m& o0 R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 z2 p9 k8 F& f7 r$ N! b* f0 G; Y4 o! D; S7 h8 X
while(1)' v. C) }; @- c9 C, ]- k
{6 `' { y: a* n: e7 m% O. v
read_MSG_buffer(mem);
! ] u( _' V1 b& h; R5 X# L } " q \$ g, c7 t0 W" T0 j; M
}( d( @3 }/ V# b2 l* y: J
6 n0 M9 {3 E4 W& \void read_MSG_buffer(int *baseaddr)
* I8 `+ s- F) u( D{
9 P0 T" ?1 h. _: R% u. g+ v pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H& C! R' N" ~0 D( y/ a+ M& D3 n1 `# E2 f1 k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
e, _& \. S4 a7 W3 O
* E* T! @- M. j- B6 P% O if(pshreRAM->packet_cout != count_copy)9 p. _' E/ k6 V8 A# \) H6 g7 u
{) F6 ^8 t- x) A0 n' c4 i
printf("a is %d\n", pshreRAM->a);
8 [4 i3 o: y3 F! s! Z- t4 n9 R printf("b is %d\n", pshreRAM->b);
6 i |: ^3 A3 B; J" L; B: @, v printf("count is %d\n", pshreRAM->packet_cout);$ ~6 n+ o* p& m3 d+ K$ y: @4 S" _
count_copy = pshreRAM->packet_cout;
' `" W, ?4 y) F4 r }5 c. q! U1 @% S* V) Z4 A- y' ?
else
5 X0 o) v( p. M5 \% A {
; [! G. `6 i& x+ q# S; G3 @3 r printf("No effective message!\n");
$ n" F. ?3 R5 \/ p. p" ]$ |6 o7 U }
; q7 r# `- V7 J/ _/ \}
. G% u0 F5 b( d, H+ b& r/ n Y) g8 q2 t: L0 r z% H+ X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: w. J6 B1 N: V+ H9 [; [7 O
$ g9 e8 O2 A8 i7 t7 ]( k0 _$ o1 n& t$ W; ^# a
5 T8 I# ~8 z t
3 r+ k! b/ o* l) a! O2 e9 W |
|