|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' P9 i! ~& C* o* [3 M P
9 i ?+ `1 Z+ p5 t) h3 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- I* G) L3 c T0 g( x
#include <unistd.h>
0 ?% X- I8 F6 W; p8 C+ T/ `/ a, E#include <sys/mman.h>: K' i: p" S3 {0 @8 H
#include <sys/types.h>
- @; c7 Y/ _$ _& E! x#include <fcntl.h>
2 g$ x/ u# c7 g$ _, B; `& B$ b8 V( M# D
#define SHAER_RAM_BASE_ADDR (0x80000000) : j% B2 q0 q: H: c
4 f4 s6 S- f5 V* O
typedef struct# O+ @9 o4 F1 X! _: Z" P
{2 k9 j$ n; b6 n( `% y- f' b
unsigned int a;" \5 g$ l; K2 K# M
unsigned int b;
( L3 p; G* H4 q( J unsigned int packet_cout;/ c S' ~ r8 S8 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) O* F6 U- ]7 z
! p/ _& n4 [' I5 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- @/ x; Y6 D) R$ o5 u
unsigned int count_copy = 0;/ y( E( `: q, o/ X% B8 h3 |2 E3 `
' n1 d+ }# H" g' }
5 j' t! M7 T6 Tint main()
: z3 x' M3 [3 Y8 l i! C6 Q' k7 R{
5 x2 E. T2 s" v$ h' F9 r pRX_MSG_PROTOCOL pshreRAM = NULL;
2 @$ a9 P4 l$ y, v5 x, T pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ ~' x$ S: ?2 Z! ?
& N* k0 g+ @' v- }" P4 d- h8 X1 Z while(1)4 x- ^2 A( O6 j" h( ~! i: \! ~
{
0 F) R6 w: ^% t( z* x read_MSG_buffer(pshreRAM);
. h. p- h8 z! H# R+ M$ n* {- Y% v }
; D7 p$ F1 R5 m$ P4 |( k! E}
5 l. U$ C' M: K8 P# x9 d% B) A; a* ]# |
. c% u( |# ?9 |( C+ ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r' `" d3 F3 E7 ?# g- I' r
{& i( F2 g8 G* B) u4 `2 _
RX_MSG_PROTOCOL buf;7 F) U; H9 \! _ a
! m, d/ V' ^% B: W* b
buf.a = pshreRAM->a;
! q9 O3 B$ Z8 K7 Y4 e/ e- m8 x buf.b = pshreRAM->b;- K* s1 |/ u$ l6 v6 d" ]) p
buf.packet_cout = pshreRAM->packet_cout;
, Z) u3 u4 B( U, Q- V# Q
, t7 [" o+ @7 `) n if(buf.packet_cout != count_copy)
, e* _1 `1 u! \) s2 I- [. { u {& w: J: [: E) T/ C" b
printf("a is %d\n", buf.a);+ p3 H" w. t" g/ w. y
printf("b is %d\n", buf.b);% L w. d5 j; G) f4 F, _
printf("count is %d\n", buf.packet_cout);
' A6 c- D) ?; y6 j/ U }, L( {8 q N count_copy = buf.packet_cout;( j0 I+ @$ S9 e2 t
}2 A. s( N1 X' Y
else
' _# k( Z5 N$ N2 G+ \! } {
) L: x6 z! k. e printf("No effective message!");$ H# t/ g8 a/ W5 ]: ?5 f n# S
}
- s Z& x6 w/ q" ], X+ [5 Q}( o3 s7 e- z& Y% K C% q* b' g
, Y; p8 E l. p: n3 [- r0 e8 P, I
2 O" ]# G; _+ @# ~ J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" p- \5 ]$ h& f% [% J
使用下面代码,对内存使用了mmap函数后: U3 _5 |& s" J- D1 H" \/ M g
#include <stdio.h>& o7 q) v& U6 F
#include <unistd.h>. g: u0 T3 p* e. j2 H0 a7 l5 |' M
#include <sys/mman.h>
- m/ j3 h& ?( @. \#include <sys/types.h> P+ D2 k- O4 [9 f: r, }8 W) J
#include <fcntl.h>7 B: N6 r1 P& G- M, k2 F
8 [ f$ [: }9 d$ }
#define SHAER_RAM_BASE_ADDR (0x80000000)
& X/ n8 }5 m( s' H; Y4 o#define SHAER_RAM_SIZE (0x20000)
# J: O& J" G* Q7 a$ Z* U) d2 R$ [# t5 _1 z9 W
typedef struct
- Y2 H: F" q5 X- L; R% i2 y{
: O* m# m" S+ R" l* J1 ?5 @ unsigned int a;
, G2 }2 y( A" }) Y" v! ^$ Y6 N5 s unsigned int b;
& |& d, v. ~, G; ~+ { unsigned int packet_cout;0 J% R! q3 J& `8 L! S+ C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; L" i3 @+ k9 w5 _% M* m
" e' j, Q9 G: W3 m" S( f
void read_MSG_buffer(int *baseaddr);5 }* X- ~7 m# _ [
unsigned int count_copy = 0;
$ m, @. @, O! o j+ d
4 b( S4 @ h5 C Fint main()
! p0 X5 {3 i7 q0 U y{
0 |9 }" M" Q2 Q/ | int fd;
6 @1 B; w* _3 {! { int *mem = NULL;
1 o- _& A2 T/ z5 J) ~- h9 V
3 b7 ^' e9 I6 n. g$ [8 ? if((fd = open("/dev/mem", O_RDWR)) <0)" N- D5 ^& n1 d, n% Q" j5 |( A9 d
{
$ Z0 v2 }' O& F8 o perror("open error");; l: X9 ]4 j! w. P; S
return -1;- O6 H, k, m6 p/ u
}8 U3 X0 A0 d, ]# h+ Y* ]$ w/ C
" |; }7 f# K! r3 p. }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ U1 X8 q3 W! `; Q. ~) |9 y9 A1 f; o, U8 f4 ^; q. _; o$ K# J5 Q
while(1)
( W9 z/ A( k; E; h$ D. N0 T# \ {* K% a; G- f, o
read_MSG_buffer(mem); v2 Z6 d/ C3 A9 |. u9 V; n9 x
}
1 I$ B! @8 U, E2 M( }" V}3 |3 L7 n/ Y. g- B y
8 \& R8 `5 \! D' A/ d- U
void read_MSG_buffer(int *baseaddr)% E$ d5 W# L0 A4 i
{8 G! F8 p V' T6 k- \7 e
pRX_MSG_PROTOCOL pshreRAM = NULL;+ S* {( J8 Q2 |
# U8 j) A0 q! r( G0 h; \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 N/ X G8 O- e, K+ Q( i6 U9 y+ t" g$ s
if(pshreRAM->packet_cout != count_copy)
) o2 u! t( i/ N9 C7 F/ i {
5 X- ]' _3 z$ B; u3 m printf("a is %d\n", pshreRAM->a);/ K( w/ D+ K3 H5 y- [/ t
printf("b is %d\n", pshreRAM->b);$ U0 F- u1 c3 K* Q [2 n
printf("count is %d\n", pshreRAM->packet_cout);
3 O( Z q" @9 l1 H; y0 w1 R- o7 V0 j count_copy = pshreRAM->packet_cout;) L6 l+ b" O! q$ j8 T; _! Y
}
$ @( p2 t) a8 {6 d else3 j2 d& i. t/ a4 l% C
{
. G$ o2 y$ H4 W7 t printf("No effective message!\n");# a6 Z( p9 w8 w! m) j( m3 f7 I A
}0 d' C* K: u/ E, S# w0 M
}- F; i- s1 [3 w1 \- V6 r
$ X+ U( b; g6 ?, L6 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 l5 E9 u9 W B+ H
- z0 U- \5 O& l9 k$ a, e$ b8 r( {9 p7 E4 U
& ], q% X8 }4 t4 ~) j o$ g: {1 ^! j6 a. U# D/ N
|
|