|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 W; @+ s9 M* u j) }, D8 _% u2 j; y# E6 }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 t, j( x/ J) f$ C4 C
#include <unistd.h>
, Z, O3 z- S) f" Y% B1 M! ]2 d#include <sys/mman.h>3 i) d' ?' o( j: [
#include <sys/types.h>$ i- a# L* I, ~! }. v8 i
#include <fcntl.h>
+ K1 w: X7 _& t1 S I1 w
& V' k: [. b2 f# V& ^#define SHAER_RAM_BASE_ADDR (0x80000000)
* E% ?- g' F3 v3 C. f
/ L& @8 J* I/ [; i) Y: ztypedef struct
3 w+ n; {7 R- E/ Q0 p{
4 @& I+ S0 ^! x* N, b9 M unsigned int a;3 Z$ N; T. D2 r. O
unsigned int b;
6 J& U& u2 P3 R unsigned int packet_cout;
6 _. x$ U M) h( d) _" b+ G1 D/ V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) s2 h S4 e. ~, @
+ X1 a& G" T% Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; @; K% ?& }& F* _- K# M* X, [unsigned int count_copy = 0;% ~" f- }& g5 J0 v, a) O
t$ }& F* V. R8 b+ k) X! d6 O# j
* c3 r2 V' c8 F" R# l- L4 N
int main()
+ ]! h" n. m P{, s6 |. r+ E. V( u4 u' M
pRX_MSG_PROTOCOL pshreRAM = NULL;% y8 J9 I% m# h6 s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 |& h9 e/ F& r/ ^! y) I9 B* [1 x- B! s W5 q. k5 E
while(1)
6 P L; |( B$ h) u, h7 |: u4 M5 f {
% p: c# y3 @& r( N: P read_MSG_buffer(pshreRAM);
" K7 c# a- S9 l } 7 R: Z! w7 a- w* l
}) X4 w0 q& M8 r" P9 j7 N- ^' E0 [
! @2 t3 e7 p$ Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 b- @. b2 O6 L0 O
{
$ }# P3 @! t$ V RX_MSG_PROTOCOL buf;3 Z9 O3 e s. e9 W1 l& t
M4 K% Y( v/ ~
buf.a = pshreRAM->a;
9 o W% S* D, t H- r; H buf.b = pshreRAM->b;
$ X1 {- k K+ }* ?. N buf.packet_cout = pshreRAM->packet_cout;* d8 }0 ?& W# J# [. y0 z) ]
- Q* D% `" S; _7 z# B' x7 |. j1 ^ if(buf.packet_cout != count_copy)0 X O+ t8 G* E3 K8 F
{1 |5 i2 h5 f) N0 e/ w( G1 {
printf("a is %d\n", buf.a);
9 `$ X r0 J- U' l. G3 U* m/ S printf("b is %d\n", buf.b);
# Z0 c( |4 @' g2 P5 Z# b printf("count is %d\n", buf.packet_cout);" c! u; C* @; G$ P! X, p& s
count_copy = buf.packet_cout;5 N" H+ {6 I6 H5 d- g$ v& f* ]* m
}
* c1 b, g8 y' M u else' O4 n1 f, ~& L! ~1 x; H& C& z# e
{# u2 N/ L2 w: x& n4 H
printf("No effective message!");$ k7 Z9 J) u: }3 d
}1 R! B: Q6 f2 u# e( _
}
/ }: l0 t& |3 S; U" I O% S1 P8 C4 b p Z9 d" n
+ c. F( b& q* O) e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 h5 x- Z* u) B使用下面代码,对内存使用了mmap函数后:
3 Q* b+ |6 U3 L8 z5 E#include <stdio.h>" B4 X+ I$ r9 u4 C: X1 D2 _9 I7 L
#include <unistd.h>) ~9 c# B! {: O0 V
#include <sys/mman.h>
) C7 `8 @, j. Z* [. o4 M, B: V+ M5 K#include <sys/types.h>* P0 F# Z* h' p
#include <fcntl.h>& J6 ~% n- j3 G+ a9 F( [
+ Z, U. n$ j7 J. F, t#define SHAER_RAM_BASE_ADDR (0x80000000)2 O7 Y; o* i) ~
#define SHAER_RAM_SIZE (0x20000)
' C8 r; d" B1 [# S. X# Y; d9 l: {) y
: |& V% Q* L( v8 A$ Etypedef struct
/ W) Y4 w+ G, M4 X1 g8 R) B{
2 ^# X; c* A G$ J" z( B8 t# p; J0 K unsigned int a;5 w' S {; } @5 g
unsigned int b;
! V; _5 K$ x4 }) C T% j$ m unsigned int packet_cout;- C! W% i4 Q% v6 t% s# D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# V; d# t1 q9 W; _0 F
1 |, P$ g+ }7 D! k8 P+ n
void read_MSG_buffer(int *baseaddr);
) o0 ]: z' h! L$ ^unsigned int count_copy = 0;
6 G/ C2 J& ?. L6 m% G5 J' {/ Y# `0 U/ h# W$ H6 u) g
int main()
4 Z) I8 S: r4 \$ P% i% X+ _{
1 q( N: F6 T, g, E: ?2 r# k8 Q int fd;
2 b7 P) O( i( {3 ?% h2 p$ I int *mem = NULL;2 d: R P" B4 H
. G; e* X) u: P n! Z
if((fd = open("/dev/mem", O_RDWR)) <0)% V2 d6 u' J* ~6 h
{& l. g" ~. H9 N4 `) {) \. @
perror("open error");
. d* B1 e0 q! ]1 _' a# e2 E return -1;: q& ] d' P. e( A9 N4 m; ~+ c. f
}
+ [& Q& [+ A) F 2 H3 u* A$ e6 a1 x1 E+ ~4 Y0 k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 L3 S9 l0 G8 t- ^8 a, z) T7 ^& J0 {7 G0 i; p% z
while(1)! ^% U; Y# J2 i; l+ x. P0 B2 e
{
+ G1 g3 ?( |: f! n) \4 ~+ J read_MSG_buffer(mem);
; s' u- g0 {1 [2 A' c }
( C; }. D( C, ]0 U7 F2 `}5 K# q' M' U0 k. s3 F6 \; g: j
( X; u0 M* a/ f9 j2 \1 f; q
void read_MSG_buffer(int *baseaddr)0 X$ `) N7 Y6 ~) E
{- w4 P0 _: c7 E* X+ L* c
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 p6 R$ s7 {; F9 @
* Z! x" Y$ Y d6 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 H" p3 x+ D$ ]. e) x$ U
2 W C( M. O! R1 u. S# }' s7 I. b
if(pshreRAM->packet_cout != count_copy)3 t" x3 _$ }, s6 |! m- }
{
3 t4 u6 D! d4 @+ g/ r printf("a is %d\n", pshreRAM->a);
4 O6 M: V( E3 D* p- _1 x2 g printf("b is %d\n", pshreRAM->b);& }: M3 m1 ~' N" n7 F& h' }
printf("count is %d\n", pshreRAM->packet_cout);; z/ h- F8 Y; g) Q
count_copy = pshreRAM->packet_cout;
: {4 k' w1 A8 h+ s* n& b3 { }3 k- Z: u$ J+ b* x3 V H& B
else
( B+ p& U" ^/ v! N6 h; ~9 \' l2 z {: _# M+ Y6 b8 w4 j! T5 b5 O: N( k
printf("No effective message!\n");( y3 y+ i. ]7 k
}
" e. C; F7 l; A) i, c4 ^}) F, d5 n0 w, _1 l7 y! ]
# t& ]% S, ~4 K/ f0 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& W2 e. T' J, v2 _4 ^2 \9 b+ j& x, z) a# D5 H# e5 Z+ r
" j, ^$ f6 l6 ?! \7 u) t
( L7 O2 u+ ^( V# Q9 G w7 [% l9 A# s7 V. S3 A; X$ R
|
|