|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 M& D+ U/ G! f" j: h5 R* ^% `
5 N8 A. I. ]$ O- s* B2 q7 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) K+ u: } V' c, p* a
#include <unistd.h>/ R8 y# @6 J- h% |
#include <sys/mman.h>
Y" I/ c& Y) p: @; _$ U- j/ r3 N#include <sys/types.h>
1 {3 f+ J& }* \, c3 [6 X2 S#include <fcntl.h>2 d: h; @; m' ]$ z
: o' Q# p& P, x' l#define SHAER_RAM_BASE_ADDR (0x80000000) - f' z% W q3 ?/ N
& @5 y5 \/ _6 L% }! w4 n5 Z0 H
typedef struct
0 v5 V6 C6 g U$ P }$ \{
: T/ l' q" Y: a unsigned int a;7 ~& X- p4 d6 I, ~. ?+ m0 |& O
unsigned int b;# h# Q) V$ Z) G: B7 b
unsigned int packet_cout;
/ W4 h \2 N3 W; ^5 m+ f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 E0 ^. ?- n0 N% \, ?' b
, q' e8 p5 V5 D S% _* M3 _4 I9 O; ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# X9 j9 I: d. f8 I
unsigned int count_copy = 0;
# G u3 Q+ J; i0 I5 U! p4 x! A4 ^1 a
+ o" J, y" K/ X4 A' h6 Kint main()- e. z( u4 b* q) t3 M
{
O) m+ I6 D6 m* A9 l3 y pRX_MSG_PROTOCOL pshreRAM = NULL;
9 u Z/ o$ U, }4 P$ i% D2 B' G" M pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: N1 Z( J& x( e8 m; |, H9 r
% k, Y) i* y4 B/ q% V; c" U while(1)5 f( e/ y/ r1 \7 b2 f
{& b5 {$ O/ l* n. d+ }
read_MSG_buffer(pshreRAM);' T; M: b" c1 A7 a: }7 n
}
: Z& O$ N2 q! i* f}$ e6 y( f( v1 T& [3 F1 L
7 Z% T- I6 ?( Y4 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- k% J s( z5 G5 p. D{
. o* N; p+ }+ |, _; H6 N( _ RX_MSG_PROTOCOL buf;
+ B) ~$ M3 d# O8 y# V0 R
$ Y1 Q1 ~" Q6 t8 o; }; |6 O5 j buf.a = pshreRAM->a;+ |4 z/ f3 a; T) W
buf.b = pshreRAM->b;
, h; c; d; Y* E; O7 r2 p8 q buf.packet_cout = pshreRAM->packet_cout;
3 V/ R2 e$ H; M+ m ) E/ |" }8 ~4 j" J- i
if(buf.packet_cout != count_copy)
1 H0 k6 W7 J( ?( x; @' q {9 N k3 t$ t4 l% a9 a5 b
printf("a is %d\n", buf.a);
" {% n6 f) ?' c2 u3 h printf("b is %d\n", buf.b);7 J6 Q: ], _2 G4 u: [
printf("count is %d\n", buf.packet_cout);1 H: I9 X% t& J' Y
count_copy = buf.packet_cout;) o& O1 K5 C% M! r) }4 h
}' m7 z& F# [/ A ]; l! W
else
, j5 \/ ?% t6 @( ~" c$ M: m1 U! M {' p# K2 J6 u" \5 D
printf("No effective message!");
) B1 v3 Y" L" `+ s, w! g, l3 v }9 j0 R& J7 Z ^/ q5 }5 O9 x
}
7 S; [& m2 S" D! w2 V9 D7 h! O$ e( B6 Y6 ]" V1 D, ^4 k' P
0 v6 ^6 n) m7 a9 B( K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 D4 p& `5 k& X3 _1 ?3 e
使用下面代码,对内存使用了mmap函数后:9 o* I) s0 L0 K! d# q, ~
#include <stdio.h>+ j% X$ C Y8 R( J: P9 g% Z
#include <unistd.h>
( Z% P) e9 w& E2 }3 ~) Y! ~' L#include <sys/mman.h>
9 z4 d( Y* b8 l+ j& Y% Y9 T#include <sys/types.h>
1 w: S! ?# W' V! T4 {" G#include <fcntl.h># q0 h9 @7 C2 I( y
' b# `+ u5 D# n. g$ l
#define SHAER_RAM_BASE_ADDR (0x80000000)& T9 v. A( I% E1 a" u+ E2 X0 [
#define SHAER_RAM_SIZE (0x20000)
* R# V+ @' k& L# p# X
; E3 X+ l" w! b9 _typedef struct
9 d6 j4 U+ Q8 a9 W- C* Y{
4 c3 m. c5 t; X$ y5 l5 E; ~+ F unsigned int a;+ P5 a1 U: ]/ D1 [/ h" u
unsigned int b;" U$ q7 h! O7 ^; `8 B
unsigned int packet_cout;& E7 j/ C. y. x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 \" r, [6 k( J/ X6 r
( M7 B+ ^$ Q. L+ p
void read_MSG_buffer(int *baseaddr);
$ ?2 X# ^* o8 P) s; v) ^8 H Q9 @ T( Cunsigned int count_copy = 0;
3 K# _/ Z" Z9 ?) h- E7 A# D" k0 e0 X9 p+ D
int main()
; O5 J) c* k& M, y5 ]{9 t& W4 L# K; G: v) G
int fd;3 d1 {. R8 Z4 M0 u# y5 w
int *mem = NULL;
' v6 Q0 m: X2 p6 A
5 S7 ]( A5 l% i if((fd = open("/dev/mem", O_RDWR)) <0)& _7 ]% J4 y6 n
{/ r- H' U" ^; H* U
perror("open error");
! ?4 z j9 G2 x2 c: J. E return -1;0 h: L8 }3 g8 y' {
}
9 J4 e9 L& D/ A , s4 i& i9 p2 |/ U; l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ n8 t' J: n2 R3 y5 r
' h# D1 ^6 z) I; y# b
while(1)
7 k" E- c% ?; q6 R {! T/ u0 s0 v, s$ d
read_MSG_buffer(mem);% ]7 M" U: ^) t Y; d2 p
} $ a+ y% u: Q8 f2 i+ [, W
}# C0 p/ a* g+ G2 U- v
8 e' D) E; w$ ]; P+ A1 _void read_MSG_buffer(int *baseaddr)
$ F3 \! ]1 l1 b6 A/ X+ C{
: x8 Y" b3 z; q- m pRX_MSG_PROTOCOL pshreRAM = NULL;
5 z$ j" Q/ l9 o0 x4 q" o5 x6 T( y; w) r& l& Q" ]$ ~1 ]5 J) P- i1 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: c$ O1 a% t/ k' @! R0 F) y% |
3 o: _4 j/ F3 e if(pshreRAM->packet_cout != count_copy)
9 G8 m' H, |* L9 `/ L5 }; C {
$ M$ }& f. f" q' E% Q* d: |8 r7 M; d printf("a is %d\n", pshreRAM->a); h7 W) f, X) r$ e: V
printf("b is %d\n", pshreRAM->b);; G) @( p( m: T, S( @! L: b
printf("count is %d\n", pshreRAM->packet_cout);
: a+ o; u$ }/ G2 T' ?6 r count_copy = pshreRAM->packet_cout;) z- Z8 [+ K+ D& Y- e6 ~
}
+ q3 f8 a, ?3 O2 v, Z else* C5 M+ R; O- q& B* ^- H& `+ z# r
{/ P* K& q" k4 l
printf("No effective message!\n");
4 y. o b- }- N/ k& p }" W, j6 R' Z, c1 I9 K0 ?1 e# A0 H
}
5 p& }% ]0 a; R% y3 C2 s
1 e ^$ }2 G; L+ `, d# [4 b0 m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 Q* }% R9 r: u* W9 W
, w* B2 Q' q0 F; |1 v9 b5 n
: c8 R9 T l4 }3 A- \: [, z8 g) U" A( q# J, F9 r2 k
$ k3 o9 m' _+ t8 G y$ ^: }0 c) d: [
|
|