|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! a( u7 u1 h) b& m* C8 H4 s5 P% }" ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- v% P* T; m8 D8 Z: t
#include <unistd.h>
6 k: G+ g3 i$ ^( e P#include <sys/mman.h>
. b' `# n/ P$ n" L4 k" h#include <sys/types.h>! G# ]$ K' j9 U; K5 [6 C- p2 M
#include <fcntl.h>! }8 t0 H& }" ?/ @% z" ~
( p9 b( ?, q1 F/ {1 k8 f6 v
#define SHAER_RAM_BASE_ADDR (0x80000000) # G- x g7 D# [! `! b0 V! G3 j
& a* }( `" C7 z6 F6 G
typedef struct( C1 r( s) e, o' b: {* _
{
1 p& g0 k5 b" C/ D5 \$ l5 c unsigned int a;
3 O' `2 W( {9 w! a. f unsigned int b;
{8 L# N2 E8 E/ q! y0 d unsigned int packet_cout;
; ]# J, n7 f$ B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j I2 p. b% X/ i0 M# F& [0 n3 f5 v; p2 f/ S" J+ A0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) g' m: j3 h8 funsigned int count_copy = 0;3 D* M9 M+ l b8 ^2 j
" J" J8 O, V0 o2 `
8 G2 u c, m% ~( }8 p5 a1 j! F+ y8 J; kint main()
3 N9 P1 W6 v& X' ]0 g- ^, G9 q5 p{: l* q" ~, q: t: _9 V( H# m
pRX_MSG_PROTOCOL pshreRAM = NULL;3 t& ]( |: u$ p1 Y1 `
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* @& s" `4 |1 x- p
" f$ J" }8 d% D* }) {, I6 S( ?* U while(1)
& D7 B# S, v/ U {( q# S# y0 E; n1 U6 v" U
read_MSG_buffer(pshreRAM);! _' k. \* J8 y) C" q6 e( M
}
+ J1 i; ]# F( T}
& v4 E1 k% S5 ?9 k5 @& t- h" R* U' [+ L. z0 ?3 y: o! h9 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ d, v$ Y$ b7 Y- O7 B{6 m$ E! x, D' U
RX_MSG_PROTOCOL buf;5 J" k3 h! c+ V9 Q: { ]
) @% p) M4 {/ A2 N$ L2 b% S buf.a = pshreRAM->a;
: Y* M* d, s9 |3 Q+ v$ B+ E' J4 | buf.b = pshreRAM->b;/ Y# r5 g0 X' Y4 C2 e! j- W
buf.packet_cout = pshreRAM->packet_cout;* J/ A. C9 p% a4 ^! z. O+ ^/ C
# q! z+ Z# h* F( Q& A if(buf.packet_cout != count_copy)) Y3 F) ?- }: G6 o. @' ?3 |
{
- @0 Y) |$ ] r2 ~! E- R) x E3 W C printf("a is %d\n", buf.a);( J {) t- |& D1 p! U+ B7 o
printf("b is %d\n", buf.b);
6 s1 Q( h" x% u( O printf("count is %d\n", buf.packet_cout);
' G+ I2 E" e; u" v! ^( m count_copy = buf.packet_cout;
+ p9 p S G3 q5 g3 n }- B/ i* L$ D% D6 @
else
# J1 h1 R! K: i5 q6 |; T, ? {7 I3 b" i0 L3 ]8 }0 K
printf("No effective message!"); L# R+ n0 c8 A0 Q7 b% H. h
}4 n. G. u/ h+ r, n
}
4 u; P4 \! f" ]5 l1 a
, ~1 o$ @4 l" c# s: k$ U- Q- s( Z6 w9 M5 t. a7 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& O6 D7 r K6 U7 S& t! P
使用下面代码,对内存使用了mmap函数后:8 P5 I8 M- c4 N9 C }
#include <stdio.h>
$ e& d) E8 T+ d' X#include <unistd.h>
8 }" l2 n! f3 j- J X#include <sys/mman.h>
! a: X4 |; j$ }0 }" L: M& H#include <sys/types.h>
1 q( ^- G, P+ e. C1 W#include <fcntl.h> z' ?! l& L5 p0 n5 h9 O. @6 y
3 z' g& I$ U% [$ y) o) [6 I#define SHAER_RAM_BASE_ADDR (0x80000000) D( b- r4 W# u! ~; _
#define SHAER_RAM_SIZE (0x20000)
6 ^5 a/ F0 ?1 W3 Q: L @1 W1 I ~/ m9 q* @. K! f$ F( R. f: H
typedef struct
7 o4 U8 i3 X7 w* A4 b8 T{4 {- ~2 z" \" B* A+ U! O8 \
unsigned int a;! Y4 m- e. S$ M. h1 N
unsigned int b;
! W- ~: w! y" c5 g! ^5 N5 U unsigned int packet_cout;
3 R' D0 O4 h/ a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 w3 J% b9 i) E7 c; ^) q. t
, ^. U6 h. \6 t2 R! s3 A$ M
void read_MSG_buffer(int *baseaddr);
6 e5 h, _1 u" T3 cunsigned int count_copy = 0;
; H" s& C9 w+ [* M+ m' t J! j( i y3 V( E6 L8 `
int main()
% ]+ K w# N9 ]5 W, R: f, w{) X6 K) C( u+ F' p2 u; _
int fd;$ u# \, U, o: y& A2 n" o
int *mem = NULL;
& h( W: g9 y! } H1 X) i" M! d/ N( ?" Q X; ]
if((fd = open("/dev/mem", O_RDWR)) <0)
P8 w8 ?* N+ {4 y9 ?9 K6 z {0 x2 Q0 B7 ]! {1 y
perror("open error");
5 A- f1 C0 P0 h8 o& b1 [# e return -1;* }$ @* L" E) R$ g5 q
}; `" l- E* u2 g# q
+ H. Z3 N# S2 t) I8 } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 j. t* Z4 ~% V0 F+ _
1 {3 C- [" t% K3 O* v( x
while(1)
$ F2 e8 w w- C: _+ D {
3 k2 ~: m2 U i; x1 c# M read_MSG_buffer(mem);
7 G( \( U( @: U3 P( _- I: a }
: Z% ^5 X9 v o$ }2 }- P}
5 G/ X/ [% Y6 ~; B& N
. [! j/ t) j9 _ U; s2 D7 bvoid read_MSG_buffer(int *baseaddr)+ _1 U2 e" K1 A" J$ C
{
% L' d0 w( w' A* x( y! I pRX_MSG_PROTOCOL pshreRAM = NULL;
. s( X8 I+ ^' r) m4 t( J: Z; @4 i( U$ ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ V- C$ C6 X3 S6 R. t ^
4 F# j8 q/ G/ _3 l2 ^. K6 p/ y) M if(pshreRAM->packet_cout != count_copy)
8 W$ z% T- A8 q- y X* u4 [ {
& }. e: j% {; L: F/ H5 y printf("a is %d\n", pshreRAM->a);% h7 L, r' g% v- d- L5 B' Q
printf("b is %d\n", pshreRAM->b);0 n( W* z) j1 S0 G9 B, q1 K
printf("count is %d\n", pshreRAM->packet_cout);
' x' ~+ x+ H$ z count_copy = pshreRAM->packet_cout;
& r7 m: L5 M- t& ^ y2 z1 B }
/ x4 M7 V- Q$ k, V8 [+ ~ else
5 y- r6 d( }6 `0 W {
# `* d5 U1 J _- v printf("No effective message!\n");5 `4 ] t; {' n* \
}
1 x( P: F# @+ B& N# v/ {}2 ]: k5 |$ z1 J8 E0 p( S6 O2 @* }7 f
: O1 L, l. W1 H5 a/ J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: k& R0 ]4 ~, _ ^6 s8 v; _
1 }- t% b6 b. @* v' p* y( K0 F" O: E# X7 F; T: K3 M
2 I0 U2 {7 _ U/ @7 b/ k5 B7 j# p2 z) e
|
|