|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
A3 j/ \+ F6 Q) e8 Y8 J1 Q3 P# A( S" q2 d. c% c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! o* K M- x' |! ~2 }4 |" B#include <unistd.h>
( |; v* u. S. p2 x9 n#include <sys/mman.h>, f: z. D0 m- e e9 `6 d$ A
#include <sys/types.h>- c& Q0 X# b5 N* J& G
#include <fcntl.h>
8 I& {8 Z% J4 V
7 e& k# F- |$ R, ~# X" B G4 c) i2 ^#define SHAER_RAM_BASE_ADDR (0x80000000)
5 m0 Z0 {, s2 F) b/ k! g- D& K2 K1 g) S, v- O' I
typedef struct
2 B- u7 }3 d6 c i b/ q- n{) m% \6 m1 R1 N0 K
unsigned int a;
) j6 E/ p. A5 N2 i& u/ e unsigned int b;
4 h( C& M; V) j$ w unsigned int packet_cout;2 `; M9 f7 L4 t7 r; P8 a% d6 `8 G5 N2 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 m0 I0 v; j: y/ o, F- L- x+ r9 d5 k3 Q; \# t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% g u5 L4 c/ Q+ c4 a
unsigned int count_copy = 0;
5 A5 g R5 F: b& x1 X0 K& y; A0 ~* R2 B+ R$ S% w( u! ]
$ J+ F9 ~7 i4 X' [; W1 eint main()2 ^$ H1 v# z3 t" z4 Z
{2 h) @) _& }, a& o
pRX_MSG_PROTOCOL pshreRAM = NULL;, d% c0 e8 ~- @- c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 W. V2 E( f/ w- q+ P: ?
8 c( F" P' a1 e. v- a: K" r while(1)6 N8 ]% N$ {: p* n
{
1 n( [6 m$ f* I3 W1 J read_MSG_buffer(pshreRAM);
6 b U2 p7 Z( e- S8 e& {$ z/ C } : Q5 g/ _: v2 X5 x
}
* v) i7 `" T2 [
, [! \+ @; b0 ]) ~: j0 N& a3 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
c8 s, C6 G6 ]4 a% y- U: _{* g! ]. W% t. A; ?. `9 H+ e' T
RX_MSG_PROTOCOL buf;
9 @3 ?' Y$ F9 b4 u
5 v( k+ P( ^1 J1 _/ U0 |; i: ~ buf.a = pshreRAM->a;; E6 ]- l7 D6 ^( c* o6 l2 K
buf.b = pshreRAM->b;. w4 ?) x( \# z. f) C W) N3 x
buf.packet_cout = pshreRAM->packet_cout;
5 y; {0 _, n* J k# v
( K% Q. k; F( S' K& s3 y if(buf.packet_cout != count_copy)& N" z) |: z8 H8 t6 M
{
! N8 {: ]# {$ F* p printf("a is %d\n", buf.a);. B2 U+ C: i" B! X/ m$ x
printf("b is %d\n", buf.b);( A. z, g$ g4 }
printf("count is %d\n", buf.packet_cout);9 _+ Q( E* r b: c
count_copy = buf.packet_cout;
, A4 i4 v2 t; D; W2 s _ }, g' @0 ?, E, z
else8 v1 N. W1 _2 {' p
{# U/ ^# O% P" s L2 i* r( t( X, h
printf("No effective message!");
% I9 N! j7 |. W- { }, n' v; G; r9 H- P% P( a
}) Z# G, c0 L7 z+ A
1 Q. B5 `8 t9 G! c3 n9 E
6 {* _ R ]) `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 J% M4 P9 y' H% a' ^
使用下面代码,对内存使用了mmap函数后:
% L8 n( |6 Z# a#include <stdio.h>4 b! m m. a% B' Y' [6 Z# g. ^
#include <unistd.h>
8 I# k& r' p3 Q/ f0 x8 _' x6 A1 j4 H#include <sys/mman.h>
5 e& j7 J) F5 x7 S4 j6 e- Y#include <sys/types.h>! z) X2 _* n" O9 V: \ y
#include <fcntl.h>1 K! @: H3 A9 F7 l
0 d4 N1 R+ c- Z#define SHAER_RAM_BASE_ADDR (0x80000000)
$ j& P) K4 h) B l2 K J$ v#define SHAER_RAM_SIZE (0x20000)
! z7 d, f: K e3 E1 B# A9 L8 K; j
typedef struct
) w* @$ d5 m& s* u; v9 o9 r{
/ A; W. V. J6 E f9 x unsigned int a;
; Z4 K, c. p+ _/ ]# g$ s. W unsigned int b;
. E6 o" U2 Q: ]$ k! S" K- X4 K unsigned int packet_cout;
4 d4 W# k9 C; [' t# v; Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 J; y% q4 Q6 K
. Y5 _6 E6 _1 l1 O( wvoid read_MSG_buffer(int *baseaddr);
- \9 Z; W$ M- _) T9 Qunsigned int count_copy = 0;, B, c O1 p/ f8 V! F O' ~$ ~
- i; b, m) `9 _8 C) xint main(); h5 f0 ~9 d4 n1 D. _6 t: g
{& g4 O+ [$ h0 V0 |: H; a
int fd;
+ n! D9 U, i: | }+ x& \ int *mem = NULL;
+ u/ \5 Q# x2 G
1 Y' R+ `1 H; F. Q* I, a3 g if((fd = open("/dev/mem", O_RDWR)) <0), \% j$ U' Q+ c% e7 q
{
( Y4 J' J3 j8 e4 \) M) x' P* Y perror("open error");
0 b$ s+ {/ t- ^ return -1;
9 t2 @5 z- {; J0 z, ^: j- n }
/ k) j% z- |' [* b
) j& K! a. o5 ?+ y& C* b mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ f r7 J* T. X+ t! Y+ y. L9 E5 k, w, X, }$ E
while(1)* C! F* B; o/ e2 G
{
- [5 I: ~5 K" T2 r. m6 k read_MSG_buffer(mem);. q8 u0 Q" Q) n
} 0 _* ~$ e; Q5 X. Q! \3 a
}, z4 @% f: m/ R- ^
# I/ G1 @# M* |3 ~! f/ {void read_MSG_buffer(int *baseaddr)1 N/ j$ e& ^* U* T3 {8 A; M
{
6 A+ o6 x, t* ~0 P2 X" E$ N pRX_MSG_PROTOCOL pshreRAM = NULL;
/ u5 [ {' H l: \+ Z
7 Q: ^% Q3 [. K( x% `! W pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, C3 X, W9 `5 a/ s9 V
( H L# E; E0 @ if(pshreRAM->packet_cout != count_copy)
* R, A4 t7 x* K/ \ {
3 y0 u c% r9 P- A9 W printf("a is %d\n", pshreRAM->a);
7 F g1 ^- D) h+ k. o printf("b is %d\n", pshreRAM->b);6 X$ v. d5 i3 {% Q4 {
printf("count is %d\n", pshreRAM->packet_cout);1 F* |7 {8 s) \+ b$ R: O9 o1 s
count_copy = pshreRAM->packet_cout;' s+ D- [7 Y/ ]& n) d5 Y* g; z' V
}- z; W* E. ]9 F% T: |0 v s5 v
else* N3 V+ s" v2 K0 v' Z5 I& v, j; l
{- c) }, {9 G2 k+ V
printf("No effective message!\n"); f3 Z8 D3 f4 F+ r& G
}
8 B+ R' m' T: V. W N}
) m9 a* O7 s- |2 H3 l0 P- o/ Y9 s2 g" N) g. i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- `* Z' d4 G# B
+ ^2 ]* U' O% H- l1 U- K5 |3 [+ G9 n1 s; E# F. k
" W* ^" {; {+ _+ V J1 k8 q; l) D
+ c$ j+ N1 [. ^+ R |
|