|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % X5 o1 s8 k( P! z# T& M. h
1 w3 G, V- d& TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 ^: l, V9 D7 p#include <unistd.h>: g+ x& H) S8 Q# s
#include <sys/mman.h>
% R$ A4 ]1 M u c3 q$ s& o#include <sys/types.h>
. l3 D1 T! N: |3 L#include <fcntl.h>
% F E7 g7 k4 S$ g* L" \9 c0 D( ?7 n3 Y$ n
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 c( I) y) O% m+ W: Y$ W! R) ` f
* {4 L# e+ _" T/ Ytypedef struct
/ U6 @/ |6 y& R+ A8 a5 g{0 a! |9 a$ ~2 S4 X
unsigned int a;7 N! o# R2 z' |: H3 N A
unsigned int b;
4 P7 ^& }7 S" a" x# S( |6 \ unsigned int packet_cout;
8 A$ ~" ~2 u8 y9 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% |% E. o0 d4 [7 @ t% _2 H
/ q9 R8 H* C9 d0 }* N: ^4 ~; c( fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' e# ?! o e/ @: \, R
unsigned int count_copy = 0;8 _" I6 Z4 B5 _) }) s8 G3 U
7 ^. P( I8 C9 q) |5 B6 p" S8 F1 e3 @3 Q
int main()) `6 u1 j" H2 {% ]$ \! ^/ E/ {+ l
{" u5 @1 X& H- |. L. j; ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 O/ L- Z! t4 a. C% z5 G pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! [- H" d7 i: O& R& {9 w" r" j# c2 \1 k: M9 {) N' \
while(1)
) S0 L$ t* r( R# V! z {
4 L. v3 i6 i* n3 m: x/ W$ X3 Q read_MSG_buffer(pshreRAM);: ^8 Q0 k. Y# \" D) d1 G4 P
}
6 y& l( s- P! e; c9 ^, M}
( o3 r6 u/ O- S* |( j* B; ^8 A: z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" n8 ~( c% k- R% k' k4 [( `- K a& o
{$ r3 w$ {' b* ~& N/ k+ c( \
RX_MSG_PROTOCOL buf;
5 j2 c) x( z( t# e
. n3 V, G' x9 s( }) g" b6 k buf.a = pshreRAM->a;9 ]( Q" e+ |, m) L% t: B
buf.b = pshreRAM->b;
) Y! b+ n& D3 l2 \ buf.packet_cout = pshreRAM->packet_cout;6 `# \* U0 C$ P p9 X) j: C! s
# Q6 l! h3 L" B3 @
if(buf.packet_cout != count_copy)+ x( L* o( q5 _7 c
{
% V9 D! ?1 q" V, M: M2 t+ J printf("a is %d\n", buf.a);
7 I' I0 m3 @ n) `# m: x printf("b is %d\n", buf.b);4 |& g7 [2 W3 A$ u
printf("count is %d\n", buf.packet_cout);
8 P3 ]# W: ?: L/ J2 w8 x1 Y/ P5 T: k count_copy = buf.packet_cout;
5 r* T) h4 I; L% ` G }
, h/ q# j$ a7 ~6 F( r else
9 d( Y9 z3 [, ~ {3 ?+ k. c( |0 w5 R
printf("No effective message!");
+ }( O# b. T$ T- x8 ` }
. ?# G! ?9 R! I( [3 Y; o+ S}
# v/ c; h: I! v* E6 P6 m( H: W. c# k5 g& B
4 x) N% u; t4 Z* ?- j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. {& a8 a& D8 F$ \4 @0 q' ~( N6 v
使用下面代码,对内存使用了mmap函数后:
" _. ]" z+ Y# @% T$ D v; s! d#include <stdio.h>; L3 L6 [) S/ W. u( v
#include <unistd.h>8 P- H% X! L7 b- z' e/ N! M
#include <sys/mman.h>
; o/ n" y, x* {8 q& g3 P7 O#include <sys/types.h>
" J1 S, S; @/ F. P! F6 }- J' j& M3 f# z#include <fcntl.h>
/ Y6 ~; t( d! }! N; ~1 N
) c9 l4 J" y% }& P0 e O#define SHAER_RAM_BASE_ADDR (0x80000000)( |5 V9 j' `) G/ L
#define SHAER_RAM_SIZE (0x20000) % F( q) t% Z1 | b
0 U5 V3 F1 D7 R# ^+ _typedef struct
% j2 D. j7 w- S, q{
) ~1 \3 \- \: `0 w/ L! b unsigned int a;
/ s0 H# n c& [ unsigned int b;3 W0 c- e% w4 k# ?
unsigned int packet_cout;/ E9 j: T- {" V* o0 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G# h0 r7 t, q/ s3 p% I" J8 q* l+ [9 b: Q$ `0 F; Q* l
void read_MSG_buffer(int *baseaddr);$ |" y$ v J1 q; a! b3 C
unsigned int count_copy = 0;
, _; X' i s4 ~9 \; ?* B
2 I3 G# \( U' ?0 W, dint main()& j2 E: Q+ B" u, p+ q
{
; [: s5 U `, o& Z9 R int fd;
# }* v+ v9 o2 | int *mem = NULL;
- ?9 E. n/ M& @, \( l" _( s& i/ i5 W* i/ L- J0 T0 _
if((fd = open("/dev/mem", O_RDWR)) <0)
}( c) n( D$ v' d0 d- J {
3 Y7 k0 r" M( c$ A4 q perror("open error");
* k2 N- N; E0 u, E) t return -1;1 b( c" b6 D7 I; N" V. X$ V! [
}) x" a& b5 x) e6 f+ l" p
% ^! c3 T/ d# ^3 F1 T mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. ]* Y2 o+ ~. e9 _$ T
! e5 N9 b8 {; { }* J9 I; C3 ~ while(1)$ @# |) H( M! B/ X( v# v: K
{& q, u7 v9 {: M: c% }
read_MSG_buffer(mem);
5 {# B* {7 ] r) F/ s6 I; @& M }
/ I. D- Y# e; C1 u( a}
( i/ r% J" Y- ^
( C( u" c( |! k: v, X: E8 Mvoid read_MSG_buffer(int *baseaddr)5 w/ |: M% [9 X; y
{9 B) D6 V1 d0 m2 B% m) u l5 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
( u1 c. C7 V) y9 S$ K
; K, N9 b7 N+ A* ]3 T" m) K8 e pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 i( a( X! t) Z4 D
/ V: e( _0 i, P& E/ s+ d5 s if(pshreRAM->packet_cout != count_copy), n5 {; G3 T* w: U5 z" K9 g: o
{; F0 U$ ~: M- Q- K% J- o6 }6 l4 u
printf("a is %d\n", pshreRAM->a);; s- x: O+ @0 y; P6 X& W8 i& |
printf("b is %d\n", pshreRAM->b);8 L* o6 ]; Y' c7 R! x3 I }7 U
printf("count is %d\n", pshreRAM->packet_cout);
: L$ y* x/ i% p w count_copy = pshreRAM->packet_cout;7 }; @4 y5 b. u( F
}
, z7 c7 b4 k7 P else. L% ^+ S/ f! g; T W5 T& O. y
{0 t4 Z5 C, Z; ^5 A
printf("No effective message!\n");
$ V5 B: e& D2 E# ^/ F }
/ b& Y0 h4 t- S) J" _& D0 T}2 E: i W! \9 a6 ^ C5 J W
% A, K1 s0 V V5 J, j& A8 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 J8 H, j" R/ H* u
; Z7 y, W9 V6 M/ S5 z, n
$ g' J$ G# K. u% m- `" i& b
1 R( Q4 c- M% K8 {: b. S
, y% D- @, D2 w" H( _ |
|