|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 O( f% z- q, ]8 i4 k i5 j6 w# J, ~
: @4 Z' Y: m, B* ?! f3 H; COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, d2 _6 U! b% T) }
#include <unistd.h>
: J# r/ n1 J8 p) q8 s* s#include <sys/mman.h>
- Z/ s1 ~. Y2 P#include <sys/types.h>
9 ~3 H2 b2 o# |1 B#include <fcntl.h>
5 q7 K( a2 a* D2 D3 T8 ?* `1 Z5 P2 Z) r& v0 K s
#define SHAER_RAM_BASE_ADDR (0x80000000) / Z0 m/ J: Z: G! ?* R0 n
4 X, n# U' K: \; Y- stypedef struct3 f. j% v1 {' K6 L
{
& m( v0 g- v1 a9 E2 o' }+ B unsigned int a;5 C& T" |: @ w5 O8 L- ~; r! V
unsigned int b;7 Y0 P0 u2 G# s" U; H$ t
unsigned int packet_cout;
( m4 F( M9 r6 ^9 e+ t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 ?' i( u% }+ O8 `3 R
2 `$ Y: c1 U2 W$ v' t1 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* k% ^( i1 \3 L& _; {5 i
unsigned int count_copy = 0;# Z" O! r$ m+ {: z
, @' p# `' i! Q; y( q; J- _3 }/ n
; G# b- B6 ~' Xint main()
; H: ~8 i! Z1 { A{
# H3 b' o% \, T5 H9 J) ` pRX_MSG_PROTOCOL pshreRAM = NULL;! T0 W1 J% ]8 h3 A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% F# D3 _/ I( Q) ~; {1 ~
$ j, a$ {4 r* {: {* P while(1)/ s: ^# @: o! o: d8 a& P
{8 a q4 z5 a4 F
read_MSG_buffer(pshreRAM);/ Y! w6 ?: {' ^8 P, h7 B7 H7 D
}
% G/ c8 ^4 o! X: @/ P* c) P}# a9 T- P9 m% \! B4 H
( G( Y% C) V# Z9 C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% @1 }1 s% g4 l0 l* Y$ }7 H
{3 ?. ^& \' C- A# r
RX_MSG_PROTOCOL buf;
" q+ V1 g* s! a$ v4 s 3 g: I- e8 n8 G. n- x) |1 e
buf.a = pshreRAM->a;$ F9 m! j) }& E/ |. L
buf.b = pshreRAM->b;
\; w7 Z) p0 G5 X) y buf.packet_cout = pshreRAM->packet_cout;* z6 d1 y" J8 a. T' ^
% q# T- \: n: v* s# |! |. V
if(buf.packet_cout != count_copy)
. {" `/ L1 ]9 F {
% Y! R' Y$ G; ~! X! I2 _, j printf("a is %d\n", buf.a);
1 J2 l2 e! x6 k( M2 | printf("b is %d\n", buf.b);3 { j7 Q- e8 l
printf("count is %d\n", buf.packet_cout);
' Q/ _; D: }+ y% H. g count_copy = buf.packet_cout;
$ O# x" u3 M6 e3 i6 V/ k }8 [0 P5 p$ C% n& `! ~, Z
else
; H5 G/ u0 f7 L3 C& j. m6 s {1 ^. S$ i/ h0 Q$ C1 w7 {# |
printf("No effective message!");1 Z/ w7 i1 Z5 _6 g3 D" K
}
% V; v2 x1 f( W}
) H1 L3 D* o+ Y6 {
* J* _4 }% n. b" D$ S& L4 F0 i3 E) A: m( r) w/ W4 |: m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 R' c! o) S" Z2 ?+ N. [, Y6 y9 y, R使用下面代码,对内存使用了mmap函数后: l! ^, c+ s. }9 [" E
#include <stdio.h>
' P! y7 e: K. U5 X#include <unistd.h>: n4 k: ~4 j" [ K i
#include <sys/mman.h>/ p1 V4 Q M$ h n( i, E
#include <sys/types.h>
) D4 q. {9 s. c/ O#include <fcntl.h>( d7 u/ n. @' _ t1 G+ t
, g" H5 i7 O9 E1 d#define SHAER_RAM_BASE_ADDR (0x80000000)
+ M1 ?9 V: g: M* h4 Q#define SHAER_RAM_SIZE (0x20000) 9 X u6 y& p. n* e# I
" A% L/ x) R. u( i1 ?; i2 l( v$ ltypedef struct4 y5 \3 l5 s' B9 P5 i3 y/ S
{% @4 Q- q G- f7 c3 ^- p
unsigned int a;
9 R! i1 G# A5 ?# G3 r. T4 B unsigned int b;+ v+ z: d) {( R, Z- b" P
unsigned int packet_cout;
; U' T- {/ v% Z0 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& J) T7 Y9 N6 @5 @; Q6 D# U+ `- S ]1 I( l+ g' u; b
void read_MSG_buffer(int *baseaddr);' ~6 ~6 t7 o& v0 s' F; i
unsigned int count_copy = 0;; `2 H! Q1 i% c9 d8 s4 q
. \" ]+ y5 v' F5 c$ @2 J
int main()
q( C- g% I) W% \/ F: m5 m. A9 g{
7 u/ J0 k) {! n+ ^4 S4 K0 q5 Y* @ int fd;
( k2 p0 B& j: ^, F int *mem = NULL;' w$ u1 q* L, f
+ F. U2 u. U5 H- I' ]1 _' m
if((fd = open("/dev/mem", O_RDWR)) <0)
9 ?4 w+ o1 S+ ?5 ?: p I {
( n$ k9 L+ a0 W# @% C perror("open error");
; K2 X& i$ }2 y return -1;9 R8 d0 `* S2 p$ ^
}
* w3 h0 i+ a6 J/ F0 D+ n' x; o
! G" Y7 c5 |3 m8 H0 e mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% x& {" w5 z p; y7 L! [8 P7 Z Z
. u) i5 L4 b7 N0 @2 b. s; h while(1)$ Q! A% x! i; C8 N- v# q0 c6 [/ @
{4 J# v& E, m5 l7 V. S: D: k2 B
read_MSG_buffer(mem);
. \7 K, O. @% ~& V }
' g, G8 S/ C0 ?. l}
8 t |/ K o9 F1 i6 ^2 P
. k# Z1 s8 |9 o" D4 F8 zvoid read_MSG_buffer(int *baseaddr)
) @, m, V8 a0 t- M$ B' t) z) i- e{
# n5 n% y4 r/ N& s/ h; L pRX_MSG_PROTOCOL pshreRAM = NULL;
4 i) N4 u4 }, ]( _5 \7 M
$ {' I$ m% i5 }: A; C* o+ k pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! n* [7 T2 H$ a- j. Q4 {9 c- X* c
8 N0 U/ g1 w) f; N+ v- j0 A
if(pshreRAM->packet_cout != count_copy): w# [6 X& w1 F( N
{: n; s# D: J. H. E2 S J8 S+ x/ @4 B
printf("a is %d\n", pshreRAM->a);
/ `# z; \; b, Q7 r: m" g. M4 L printf("b is %d\n", pshreRAM->b);9 L: m7 [( F# w9 ?
printf("count is %d\n", pshreRAM->packet_cout);& t7 ^. y0 b+ |: S; Q. R
count_copy = pshreRAM->packet_cout;; b, r7 G* m9 G' \6 v" j( p' H* b- o
}! t8 q ?+ Q: R# d) G* V7 ~
else
; i7 ?/ L/ Q! @/ H/ n% q6 @* _0 w {, @% Q4 d4 S' \ V$ M: R( G2 P |
printf("No effective message!\n");2 r9 Y4 I' G; s! a; [! Q
}
7 n( v. q$ c2 r! ?+ t1 V8 S+ o}
/ S( {2 Q% d6 \4 r0 U/ X) t* s2 U/ X+ t9 d8 X0 F+ c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 d7 _$ P- [! S6 m& H$ J
# K% k$ e3 y [0 B/ v/ r s# o/ F8 _" q1 s9 o
. @+ w+ O l0 t0 h
$ f. q! E; D0 U( Y0 {+ _ ] |
|