|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) S+ ~+ P+ `! I3 q/ m0 s
1 [' r: ^! _& b* }/ v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( m- M2 Z2 Y/ n& y8 U9 _3 M& U* J
#include <unistd.h>, h, f* T, ^8 c4 g3 n
#include <sys/mman.h>( N+ c4 H" v$ _. [4 H6 U
#include <sys/types.h>
" R, V% k' D* k% @#include <fcntl.h>4 R- K6 j1 m, p0 n
* M8 u1 J5 T' {+ m0 r
#define SHAER_RAM_BASE_ADDR (0x80000000) # ~6 V9 c- N5 m
8 p5 j/ Z% e0 V) K) B" `6 mtypedef struct
' N2 R1 p! @5 q' t. v+ k{
. L/ ]/ a$ n, P- Y! s unsigned int a;
/ t! Y' x; n! h- K* w+ J- T unsigned int b;, @4 r9 V8 \5 O+ r, O( I
unsigned int packet_cout;
. k. d+ f% D) e( Y7 f( o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* V" H& N' G, W# h" o2 m8 L
4 {; u9 G) Q7 z# H! P8 O( Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 w o: f1 c; ^$ V
unsigned int count_copy = 0;, v. j& D! y6 m% t) R- s) G
9 x. g3 E; K$ j3 _4 |. ~. S$ n3 @
1 B$ x. T/ w' F+ Y% h: ?% D7 I h. I
int main()
; j) a3 P8 I& u. k( l' j8 z{$ |, v4 W6 T3 B* C" z
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 d. c4 l+ P7 [ G: G; { pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' u3 S/ J3 e j9 h* p6 f
P+ G2 W. f; H# p9 | while(1)6 {; A, r; y% `6 J) T2 w5 A
{
/ \# l: w5 F3 q+ S, ~& ?# m2 G read_MSG_buffer(pshreRAM);/ |. w; n3 h( d1 C
}
7 K: t; l- |, C+ {0 Z: a/ s) x& r}
, }' {4 W# L2 I8 @ X
; I5 G3 Z3 K' L9 j! ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- e4 J0 @& Q. M0 B& {, {{
+ w% o% ]) _* a0 s- M RX_MSG_PROTOCOL buf;) D, C' {/ _2 R$ C: C
( b% m( W/ V* S* E2 _& g E i+ M
buf.a = pshreRAM->a;, U. q! n+ d: n. _
buf.b = pshreRAM->b;' [4 o" t5 F0 Q! w8 L; R0 c0 x" @
buf.packet_cout = pshreRAM->packet_cout;, U- L6 X$ @% u. e/ {, J
/ T4 @7 R& B! Y. t if(buf.packet_cout != count_copy)
( s6 g# L4 V) o) `+ y8 h( i {$ W k6 z/ P& M! k5 \1 k
printf("a is %d\n", buf.a);
( S" |% j6 r7 g5 F' z! r! _2 G+ c printf("b is %d\n", buf.b);
: a& M# }2 I$ m% O6 I printf("count is %d\n", buf.packet_cout);
. Q, x& w: `2 ^% L- r% s- D' r count_copy = buf.packet_cout;
: Z9 N' m- K% e9 G3 R3 s4 ] }9 U' e& K4 ~) Y: f8 l$ E9 G
else
* Y& ]" V9 J" C" n. k8 ~1 ~ {
# ~. m# |' n& a2 E printf("No effective message!");
2 J9 g0 b H( Q" G+ ~9 m }
1 [6 y$ }7 V+ N' z" |}- M- N5 k5 ^# H" A' `
# r! Y9 ^5 ]/ Y" m! L# w
+ S7 i, [/ g2 B9 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 V3 ^' Z3 n& I$ j8 C; U9 L使用下面代码,对内存使用了mmap函数后:
* D( ?1 l0 O$ F8 ~0 Y) t- T4 M#include <stdio.h>6 B2 j0 I0 ]. k5 C$ n2 s
#include <unistd.h>) V( l% a' C1 f: `+ q( E7 h
#include <sys/mman.h>
. |% j( }% M( n7 {/ w$ A#include <sys/types.h>, ~ C& O7 d1 l
#include <fcntl.h>; r+ I: s4 |2 ~5 {2 r
8 O) {; E; B9 w K( J/ \6 r8 `
#define SHAER_RAM_BASE_ADDR (0x80000000)$ Y6 ^# ^) Q6 X0 @: t+ E9 x1 C
#define SHAER_RAM_SIZE (0x20000) % ?- D+ w" ]8 r: D
0 I4 n" H, Q; w" e9 t% w# Btypedef struct
5 Q1 K7 b- c1 e. L4 e: g( H{
" j% j' h, L+ J) ^, d% } unsigned int a;
" }6 u2 C2 ]5 F3 n unsigned int b;0 R- _2 W/ z+ @
unsigned int packet_cout;$ i1 P8 x" @+ N9 k. H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# A: @! Y( I! e2 J# _8 L/ N C6 ^& `. X9 q- v9 ]
void read_MSG_buffer(int *baseaddr);! x- e3 C" t1 B7 t. o
unsigned int count_copy = 0;
; q/ Y: I+ o0 A5 K% c$ t/ u, e
; \5 J4 C" D& y0 _; V) Q% Zint main()4 Q9 ]# F' k6 C- y+ e; N2 a
{
. e2 F/ I x) D+ d3 x6 ~2 Z int fd;
, D2 j7 V3 |2 t) u& c: Q" x6 W int *mem = NULL;
; x6 a( ^; v3 x! g
0 c! R2 Y6 y( r if((fd = open("/dev/mem", O_RDWR)) <0)
2 W* ]& h" \1 {: Q' G5 @ {
+ b) p$ h" d: r* p perror("open error");6 v! F! U8 Z6 `! c+ @! b
return -1;" W7 U5 O' s' a9 D$ C5 Q2 z
}0 i* Q" j* ~9 R6 g. I
3 {" E, o. V7 O- q mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 m u) n* M; W- s# D+ ]$ S$ C5 @. k+ b4 o/ V+ q
while(1)
8 o# ?& C* H# A% k* w# N {* k b- [! z5 M6 u
read_MSG_buffer(mem);: e) m8 Z& [- N$ H. o/ M# ?
} , Q( i6 U. E! L6 W8 A1 i
}( s9 w. k% o3 B( D+ l c
, t! A" O$ N+ V# B7 Pvoid read_MSG_buffer(int *baseaddr)5 d+ r* h) N) D. X& S: `2 s
{
! u! E: [: n6 U" u! ~ pRX_MSG_PROTOCOL pshreRAM = NULL;
3 n& ~0 Y7 v. o- l4 \9 d9 _0 Z8 z! U* _8 g x$ E% b9 R6 V- A* z1 U7 l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. v1 Q2 t# G% k: M0 {! u. q7 g& s' ~; c [
if(pshreRAM->packet_cout != count_copy)
1 f5 x( {+ R n r( u& c8 d {6 R8 J, b: N: D# z6 R
printf("a is %d\n", pshreRAM->a); |( \' b/ \9 A7 r4 J$ k
printf("b is %d\n", pshreRAM->b);% b6 j6 E2 x3 r+ \0 R3 A
printf("count is %d\n", pshreRAM->packet_cout);
# D2 E; u; Z/ ]7 }; l count_copy = pshreRAM->packet_cout;
4 ~1 l3 u5 D+ k$ y' f7 W }. L0 s8 Y# A. E
else$ y9 D; j% ~# D1 ]+ d# `6 E
{/ i' ~1 P+ N! g/ P2 Y4 Q4 s5 u3 g
printf("No effective message!\n");
5 D$ N2 ?3 H. X1 X* p* [ }
# t1 a( K0 N0 z/ s3 O9 D}0 O g! }9 }) Q) X& }$ j% l
. w \3 O* _% m/ {: e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ |; n5 K& Y4 s. H
2 d; Q" H, N2 E: c. ~3 G: J3 E
" D/ a4 ~- I* E& |0 b3 k( \
: s/ G. d- _+ d8 L. D+ i. o' o$ y
' j4 G6 z& g% N2 M# Q/ {% T) I |
|