|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& }2 o* W4 [6 U% c( N+ C( \2 @+ J: u% D. J/ c0 `6 v5 l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: _9 E+ Q" P$ Q/ b4 Z% W
#include <unistd.h>9 R/ I* D, H8 A$ O: d7 ~9 Y
#include <sys/mman.h>
% V, x' }4 ?3 K e#include <sys/types.h>
( ~6 J5 _* e* F F# o m#include <fcntl.h> N+ X7 u3 r+ m7 v0 l1 I
6 _* N4 a0 N/ z( S#define SHAER_RAM_BASE_ADDR (0x80000000) 4 x$ O) N3 Y$ B% Q8 @" ^9 d, ]& w: y
/ A0 B& y$ u; a! f3 btypedef struct& v F" p* q' q- W. H/ |
{
$ e# ^. c( W' x; h9 J+ Q5 L unsigned int a;4 Z6 h; C/ ^' ^) w/ r5 F
unsigned int b;1 Z: p* `* \0 S8 B- |
unsigned int packet_cout;4 ~. b. S! X/ f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p7 Q& J& M; R* l1 v+ n! L3 [7 ]1 k @( R, l; s3 A0 p L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 {# M, f- {( }3 n
unsigned int count_copy = 0;
) C) ]9 b) X- D0 m( n8 Z- w. f2 _5 y9 t3 x* Z: g+ v1 P" u( L4 ?/ T) P- o
$ P0 ?9 v/ F# X1 O6 }6 d0 U1 ^; n
int main()
9 t1 [1 e+ {3 J0 F{" T. x$ }- h1 t; y$ u( W3 N
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 B2 E) }; y& z1 g7 _" f' X: ?2 g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! ]% {. J# y- _
( A+ U$ ^2 v3 Z' D3 f; S' m S while(1)
2 ^1 M1 B) j9 N4 A {
# @" C6 g, {/ n/ S8 l/ [0 O read_MSG_buffer(pshreRAM);
3 F* j' ?/ U2 D7 r } $ E e" R( L0 S3 Z
}8 r5 ~5 [6 _ K9 D6 i! n! F
; w7 Q4 L" P& B- R. _8 e% ]3 L7 P1 K- P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% t7 p8 i2 v3 \) A+ o
{
+ _1 I4 N& O# L u RX_MSG_PROTOCOL buf;
- T- C/ `, ~" d7 B: y
4 w2 L( A5 I2 u2 J1 ]: ^' M( x buf.a = pshreRAM->a;, V+ V D; @& j2 }3 ~
buf.b = pshreRAM->b;1 s* P$ {3 |' m7 C B
buf.packet_cout = pshreRAM->packet_cout;5 _3 m' ]3 M8 [% P# @
! e/ W( S9 [: h( i, m! z if(buf.packet_cout != count_copy)
6 J, p" j; k; B3 t {
. _( G0 n. s3 N9 A printf("a is %d\n", buf.a);" @4 k0 p: ]) j* y
printf("b is %d\n", buf.b);; I" g/ X$ o5 i0 `0 U0 ~
printf("count is %d\n", buf.packet_cout);
" e+ ~: T% L3 M" x j count_copy = buf.packet_cout;" M6 I, m+ I) t
}
+ J7 i0 L; E6 e5 Z/ i$ C else. b/ D9 C$ {1 r7 B$ V- y3 e
{/ w& j) ?8 Q5 _0 }
printf("No effective message!");# o7 Y2 d" X9 T/ a: O4 j6 l& @
}
/ C% l8 R4 A, B. u8 b! n: c' V}3 p3 A# V: ~: S; x9 X7 K" n/ h: V
: U# ~; X1 E- ?" U9 M+ T; @
& I% r) b8 J# s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 Y! E& w7 \; k0 k, `使用下面代码,对内存使用了mmap函数后: G6 a3 e2 h- ^1 z% c
#include <stdio.h>& V7 T& s9 L: o) Z5 t8 C6 ^
#include <unistd.h>
8 |/ W3 z+ `) U7 G, E. R; t% O#include <sys/mman.h>
6 N2 L2 T9 `5 Z3 v R! |9 _#include <sys/types.h>) c7 T/ F2 I% z0 G
#include <fcntl.h>' X) H+ w8 [; \
! y# M; z. d( e% S#define SHAER_RAM_BASE_ADDR (0x80000000)
" t6 c5 J; P* `# M+ z#define SHAER_RAM_SIZE (0x20000) / F+ n9 _( T; _. Q" q0 y
+ k% w) \3 x1 W0 k( ?typedef struct
+ [, p7 P( r4 y6 y9 u# O{9 j; e6 X& X; ]* T6 @
unsigned int a;; f" c' L" Q! c4 t
unsigned int b;
4 b7 Z! X- U2 L) @ unsigned int packet_cout;- u' |& h9 I9 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& J+ Q" q, p, y+ N3 `" f3 i; q2 u/ y* |; ~' O( m! `* {# |4 b
void read_MSG_buffer(int *baseaddr);
+ F1 G7 V) ?0 i9 L" W8 Ounsigned int count_copy = 0;' n. X; d$ t+ X6 H6 h X- D
5 H6 g# ~+ y5 n) M3 qint main()
. l8 }3 _# n; @0 M{
/ n; D: ]9 c1 d- k( P$ S int fd;
" I. m, j/ l6 \5 u( A& I2 m( e& _7 e int *mem = NULL;
" Y7 g7 ? v* q, v3 r
# ?9 E, j C4 {5 b* R if((fd = open("/dev/mem", O_RDWR)) <0), v! h8 y* E+ \8 z/ Y X
{+ \- K4 E |5 c1 J" q$ [* _0 N) T
perror("open error");
$ q1 m/ }0 B) a8 b( B return -1;% P4 d% a7 ^7 k$ J+ T2 e
}
, m6 L o8 M/ ]) ?2 }
5 T, `' }% R) [) I0 _3 Y9 u" r mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' [* t. @# |$ G- I6 \; W4 ?& ~- v/ P! B# Q& _, v, t! u
while(1)1 K. j( {9 G, O% r, y) v, _. l/ U
{
( I7 @; N, B) i' C9 m read_MSG_buffer(mem);( X+ x( {+ q$ D: G4 w
} 4 ?% L5 S7 e1 Z, W5 ]# f( s) h
}
8 Y! D3 L; w" j. B5 N4 R9 J
4 f( {' c7 j4 Avoid read_MSG_buffer(int *baseaddr)
# y1 J- _" V& o& {! u{
/ J( J' V3 x) ^, ^% a7 U; V pRX_MSG_PROTOCOL pshreRAM = NULL;
% o7 _* O$ P6 m
& ?' l/ z2 Q1 r/ S2 H& B pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# R1 {$ {2 S2 J$ s, [2 z0 g. \
4 E8 Z0 U1 i7 N if(pshreRAM->packet_cout != count_copy)
3 l; v; i1 |$ q$ X ~; Q- Z {
9 z3 k. W- {1 O% u# F4 p printf("a is %d\n", pshreRAM->a);" U$ R7 N6 v# @8 g+ A# G
printf("b is %d\n", pshreRAM->b);9 w3 U: u% {; s4 z
printf("count is %d\n", pshreRAM->packet_cout);
. a- I3 E% I0 w8 T/ k count_copy = pshreRAM->packet_cout;& w" S! {4 y8 w! c' s' c6 {9 w
}9 b% l8 G, V+ {1 V( G
else$ \2 y. l' u2 H( x; ~) }
{( c. T4 H. R) Q) J2 u4 y) Z
printf("No effective message!\n");" e2 [2 y- s0 Z! H7 Z e: t8 g
}3 b( j v+ c* J7 y2 Z$ e- X
}
( u7 a& e5 D5 M+ @# k ~
+ N1 Z# Y( T+ o5 v; Z% |8 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* D% U; n8 L8 ]- Q4 u7 p8 Z- p5 n2 x0 f S, d- B6 J$ s# J4 w
2 \/ c0 A% `8 e6 E+ [" k
* B' i% `! c- ^, t5 ^8 i3 B6 Y
: n: L2 r0 U4 K
|
|