|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 m+ y; e8 J& h% j: \
* M# E" U$ r( X) Q. n- sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 S; ?6 D' i! Y4 V; ^- c+ T
#include <unistd.h>
$ U$ B+ o( ?( M& w, m- g" C#include <sys/mman.h>
j2 r- ~0 @5 B! r5 X#include <sys/types.h>5 l' R+ N- S* M Y* F) f1 n" S: C
#include <fcntl.h>9 H5 k8 \. b* R
3 X4 ?7 G s1 x {/ a#define SHAER_RAM_BASE_ADDR (0x80000000) % c' r, h: m9 N) C3 U2 W
! V! T% j% k+ Otypedef struct
5 a+ k( v0 i( m4 S/ q9 V{9 |! L# b7 A0 Z& b* a' I. q, u) Y
unsigned int a;
' f% @: M6 i" o& Q/ q _1 c9 L unsigned int b;
" s5 d: D" q, g& g unsigned int packet_cout;
! H1 a V9 H# Z5 P4 P4 a% Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" {5 g' N y% Y0 f9 s+ T6 ?" \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 s4 m/ h( u2 C. O
unsigned int count_copy = 0;/ A% d, Y$ u1 D8 B! L! ]
& H; W6 Q/ S" y- Q. l- c1 o) e1 g- q' ~
int main()2 N" ~* t6 ~9 u% {7 x( q
{: P! e( |5 e$ o2 P
pRX_MSG_PROTOCOL pshreRAM = NULL;) t% ~9 x# x% W7 I/ s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 v& o% O3 b+ r9 `9 D: B
( q3 C1 Y8 S. Q8 R0 I
while(1) v6 F' E3 }2 K" M9 n# z
{
5 e. X% K8 D- ?$ O& |; h7 e read_MSG_buffer(pshreRAM);0 q& q+ K" a. l9 G* H. S4 G6 A
} % M/ H: n. `3 ]# ~* n+ Q& x. C5 A1 U
}$ o+ r* }0 ]; ?4 u
1 ^& |9 I4 q- n- p4 u& g/ x* s; W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) O8 e1 n+ F" C3 T{
$ H0 d0 k8 j0 D RX_MSG_PROTOCOL buf;
% b% c6 f! a# F8 N6 ^! A6 @- a6 i) D 7 @. L2 ?) {, W0 x# h$ K9 y' Q
buf.a = pshreRAM->a;$ v' C3 @) o: z" C: b3 [( K( j" w: O
buf.b = pshreRAM->b;+ u2 {; l+ _# V% n" a+ e5 R
buf.packet_cout = pshreRAM->packet_cout;% u5 f7 V3 Q; ^ O/ [! a% q" \
8 @+ |3 J9 B/ {, X* K; l% W
if(buf.packet_cout != count_copy)
% f" b7 }* @, q6 \( @1 \ {2 B8 V$ A. U; ~/ s1 w5 F0 W; Q8 G
printf("a is %d\n", buf.a);
$ J* q- U* i6 N# [- ` printf("b is %d\n", buf.b);8 z& y: N% c. r$ K$ ^; j: B% V ~3 h
printf("count is %d\n", buf.packet_cout);8 w( U7 u; f1 h
count_copy = buf.packet_cout;
- _# k; c+ _: i1 a @0 e0 W% q4 q }
2 Y. i0 j; I( s/ B else3 x1 g9 \( V/ J/ ], F
{
) b+ u( p' h' K- Y% q4 S printf("No effective message!");4 i$ @- \. U' d0 w
}
( x3 V, E- Q, x2 H}1 X h0 V2 E% P& \
, ]1 c9 c6 D- \# c6 X$ t5 ~2 h: h$ f! E2 l/ Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) X0 H) p+ m! i' a
使用下面代码,对内存使用了mmap函数后:9 Q) \1 @2 z4 w% U. |% u! g- j0 n
#include <stdio.h>: o* d9 ? U G) h) Y
#include <unistd.h>" S& z' V/ H( N
#include <sys/mman.h>
, W) K1 ]0 H8 ^2 p#include <sys/types.h>
" t. l" R# `* L- x# d#include <fcntl.h>9 ?' ]" f4 m' D) }: `
. ?1 U% Z! F; A5 L9 s4 H! ~#define SHAER_RAM_BASE_ADDR (0x80000000)' m# b4 A3 L6 o# V. L5 s5 ?. W
#define SHAER_RAM_SIZE (0x20000) : @7 u2 k; |. r
0 J7 U0 S, I2 H, ~1 j/ I
typedef struct( y/ U5 r* a- T3 s G0 w
{$ { G8 l" H7 }
unsigned int a;
n" Z% x8 s. b' r7 K6 e# s# G( B unsigned int b;5 B; F/ ^; H3 B' E) s. [
unsigned int packet_cout;
- ?: I. Y: I @9 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 u5 \* k! ]4 F {7 t B
, f, v9 G% g1 e; s: b r
void read_MSG_buffer(int *baseaddr);$ n! a& H4 S, g, o0 t
unsigned int count_copy = 0;
# N+ P$ J3 g8 p9 V& ?" \; d
6 ]" K5 {0 e. ~) R: mint main()
4 Z. j8 {7 ?0 @" M{
2 ^1 J! b& l6 B. A0 G. t8 K int fd;
; Z) x1 m$ V' Q# E& i" q" ~ int *mem = NULL;5 s8 W7 J& n$ G: ^
& e8 K5 X! m2 h* |. W N) ^( Y2 o if((fd = open("/dev/mem", O_RDWR)) <0)& A( w) m8 Y- g: y2 |
{
; I# P8 E5 ~+ B9 _% j! ]2 @, B- W perror("open error");
$ M: G& O3 U3 E7 D7 h' K return -1;
* P8 [, w/ p1 z }/ j7 u- B: b3 l c2 p% Q# {
$ J/ E% o$ _- l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: h# S. M( s3 @+ n$ n- N1 o2 n; w8 m
7 D* M8 Q( H/ @6 D; F T+ b while(1)/ |# t1 O) k# [* K# R
{
3 ?& A1 I8 ~0 L A2 `- h read_MSG_buffer(mem);2 k5 d9 u- ~: G; J) O
} 1 M" x/ K+ C$ c
}) u4 s6 K& b. a* x9 s4 _$ G
. v% O* u$ U8 h7 }3 z# Uvoid read_MSG_buffer(int *baseaddr)9 o9 {5 |/ j' k
{
% s' B E# B# H! A pRX_MSG_PROTOCOL pshreRAM = NULL;
- @" @- |( f: q6 `7 l! J8 i# N* K& b! i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# O2 v& h; ~% A0 t0 G
, ^7 {/ a8 c+ ] ?$ r6 L if(pshreRAM->packet_cout != count_copy)
6 q, o9 g- x% U4 j {
& L9 U8 Q5 ], |. \9 I% n4 y) v* \ printf("a is %d\n", pshreRAM->a);- K( p& o! h2 l- R; e3 J6 n7 V" ]
printf("b is %d\n", pshreRAM->b);5 Z% X0 r9 p7 r: Z7 }+ u4 q u4 J
printf("count is %d\n", pshreRAM->packet_cout);
* ?- \7 A) [# E* f, ~& V count_copy = pshreRAM->packet_cout;
- d- s5 m- m# t; w }
! g K/ h5 o; p1 a7 O2 m+ y0 j4 h else
* I9 W4 E/ u9 s. h& `; o3 x( P/ W {
6 W+ o l3 ~' H4 | printf("No effective message!\n");) C9 O' i! K) \
}
# c% T. Z+ F: e5 H; w3 G& n- T; \}
3 D' i6 E2 z5 N
. @5 ~9 s' j4 \$ T8 o6 D' H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 y f$ j: U, [. D, g& X
( Z+ \4 e+ m2 V- H
0 ~3 V6 A' j- v Y5 x
4 O# a$ h: I5 i. [: |3 K4 g% k, ~0 |5 I5 {( Y# [9 L9 O4 G
|
|