|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 I& L @$ ^# r3 H: F+ R& T, r2 \) \
& K$ U9 [- e4 ~1 @/ j* oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 t) |, F1 z& s% c& |- `
#include <unistd.h>7 m( S+ N7 l& f9 j+ r
#include <sys/mman.h>
5 W1 T3 G# C; D/ U8 C) d5 f7 Z#include <sys/types.h>
1 V* b- w9 [& x$ W! e7 s! t$ M# z#include <fcntl.h>
5 C7 b5 n" N7 m3 H t! {( \2 [( u m$ h8 j2 i! b2 a- ?
#define SHAER_RAM_BASE_ADDR (0x80000000) `: K! y, U' t) ~9 x0 }7 Q d
' L2 e. v! q( E. K" a. i& {+ Xtypedef struct
) k% O, l- u9 N: `& k- E- v5 g( h{ K! p& x& s, D
unsigned int a;
% f4 T5 {* @7 D unsigned int b;
* {% T- v; m/ W- P unsigned int packet_cout;
! A% Z, C8 R& z: J" z" y2 R8 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 W7 d8 z* G6 |9 ]" M+ _6 d
) T3 M7 n9 T( t8 _" d4 `% hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' N W# ^0 {# i& n" c/ Bunsigned int count_copy = 0;
: q9 d$ |9 j( Q; O, ]/ B2 |4 q) H3 k8 L! h* Q# l! I) b
. q. Y' |9 G w( ]0 Bint main()
) t* U8 U' k$ @8 \{ u& Y# P# @/ M7 }+ d2 U
pRX_MSG_PROTOCOL pshreRAM = NULL;8 R3 g, \8 D6 ?5 e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* x, I5 l$ m1 w% K) N
1 b- x& G% n& ^) z- }* c/ S2 X while(1), X3 w" B" _9 E- }* _! C5 k! t
{
; W* |/ x3 |/ ]0 X$ k read_MSG_buffer(pshreRAM);3 f8 [! d5 A# p1 k( s
} 5 Y( h" @5 f/ M8 A) p2 X% x
}* M }$ w+ W: F
5 O% |8 \0 Y0 [& yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( m, V. W3 p7 J u8 ?- Y{- [' c: ?) k7 o: M) r! F
RX_MSG_PROTOCOL buf;2 T* Q& ?6 v/ c) R$ X, C. H
+ n1 y- Y9 c6 u; p" H buf.a = pshreRAM->a;
& Z. {" L4 l4 n6 u8 F* ~ buf.b = pshreRAM->b;# j( C; \+ K2 v" a8 U3 C C
buf.packet_cout = pshreRAM->packet_cout;
8 z* l1 d9 ?+ V0 } * a. n/ Z4 N. ~
if(buf.packet_cout != count_copy)( t, ^% u1 D' p9 B! \
{
7 Z- _7 @% T8 Y* } printf("a is %d\n", buf.a);
5 W/ _/ U/ V4 \) ^ u- T+ O printf("b is %d\n", buf.b);
6 J( L) ?! J$ _& c printf("count is %d\n", buf.packet_cout);* v7 p+ N0 M& l& t* [: e) L
count_copy = buf.packet_cout;6 V5 t9 d+ R2 k9 q; F2 g( P& Y
}
% T% R8 j8 O9 @. w else/ B5 d) E$ K5 n7 ~
{
) r7 z$ @! X- M( Z* F& | printf("No effective message!");! Z, u k7 Z" i9 K" b
}1 r+ Y) z5 W6 j# _: b& U
}
$ j$ b1 ]& K( {' O
5 C& E% b" Q) u* H
1 Q' C. B! L% g1 b5 Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 h4 H8 n2 [) i* R4 _2 N5 N
使用下面代码,对内存使用了mmap函数后:
) X4 U. k1 k* L( S* r- p! ~#include <stdio.h>4 c& }% t& c* k8 F. R
#include <unistd.h>- i) V2 k, h% R. G/ i/ ?) q7 M+ U
#include <sys/mman.h>) J" e0 a8 s2 Z& m ?- i, d" }
#include <sys/types.h>& z+ i' v2 G/ ^. }- Z' A
#include <fcntl.h>/ ~+ J9 _8 }' b; i& }; ?# W. v3 M
) D' J' l& P2 \#define SHAER_RAM_BASE_ADDR (0x80000000)
' T1 _! k" Q* b8 }# t) h#define SHAER_RAM_SIZE (0x20000)
8 j( ]7 F$ W: N [2 o2 t
' S: F7 l( f/ v1 Ztypedef struct9 r# X6 P/ [3 F; M: N+ { o
{% T- O; B- B4 M4 M1 v% z4 ]
unsigned int a;/ L6 {, j. w+ q' X' Z8 k8 ^
unsigned int b;
* B6 E& m* D5 _9 J/ v1 U3 ~' a7 H unsigned int packet_cout;
6 {9 \0 o! m1 r5 h8 c ~- U- v3 e2 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! X7 @0 t( U4 _1 o( d) T# j% v- X4 ~# |+ n
void read_MSG_buffer(int *baseaddr);* u& W9 l4 |. h4 m
unsigned int count_copy = 0;
. D c- g5 u: `% D+ `
5 R! l0 s3 O+ ]; aint main()
" M4 G3 x# H% r+ D! ]/ L* N: D [{( Q9 \ y1 l' X. O+ D
int fd;9 {9 s3 p5 {9 n _5 \0 D
int *mem = NULL;5 C) Z' H8 A5 I e, N. P
5 ?2 c6 q" T' E" G+ N
if((fd = open("/dev/mem", O_RDWR)) <0)& }- p1 t2 ]& r7 g0 ^
{: `& E) S6 _; d6 P2 T- k; m8 B# a
perror("open error");
/ l* k5 b' B% x% d return -1;) A# i9 ?' M# M; Z. ?
}1 n1 _" N/ s' ?; R1 W Z
; ^; k' U" g0 |/ E, F6 ?2 e mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: }' D% O+ w0 F! S6 c7 I5 W. Y9 N8 Q/ L! A, l, Z
while(1)
; T" l( G+ N5 d3 U$ d {% s0 K) f5 y0 X+ f5 ~5 R6 q6 Z+ }
read_MSG_buffer(mem);& w- M5 c2 ^: W2 `/ ~7 T
}
6 B4 v5 f& ^7 Y}
$ N5 ], A1 U E4 h3 w
' w8 ?3 k4 S) _void read_MSG_buffer(int *baseaddr)# H ^# l1 R* ` j
{9 A& @5 j' s. [, \2 S& I4 T
pRX_MSG_PROTOCOL pshreRAM = NULL;1 `/ O# W9 ^# S8 A
% e+ p4 w, F/ M3 {! Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: D9 Y% _, i1 U; T/ F. @! x& a: b: q8 ~: S+ d/ b7 p
if(pshreRAM->packet_cout != count_copy)* s8 _; V" o; X* I- S6 h
{# x& r0 b- P- e. C/ r0 `
printf("a is %d\n", pshreRAM->a);! [; E$ o* n$ n9 }7 k
printf("b is %d\n", pshreRAM->b);4 |; M1 u2 @" S0 {
printf("count is %d\n", pshreRAM->packet_cout);
) [) {7 Z" X# Z/ ?% l' B0 D count_copy = pshreRAM->packet_cout;
! q v; A5 j. B# s6 P( F }/ y) c% S. t) ^7 F9 C" s
else
) s4 U- N+ Y$ _7 D: |' Z- y2 L, S {; o7 |. r6 g0 {. }& R! ?
printf("No effective message!\n");, p Y! h2 c) n8 b1 y
}
' `8 c' ^$ a5 ?}- Z5 y( L( n5 X
9 H" @" D7 x! V! m3 n2 K# @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' z) P7 Y# y4 e. U$ A. f) E- K+ @+ g: U; W
; C" R! i" X- ]6 [0 P- d
$ {9 n/ @4 F+ K) k2 @
. q5 \" |6 h5 ^! L! y5 D |
|