|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! v1 [9 Q6 G5 X& R0 p
7 t- G8 ~7 x/ \# o( N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- A2 O4 \) U: R+ z( a#include <unistd.h>" z) G% r3 c) k; q) n6 p5 M
#include <sys/mman.h>
w! f$ B9 ^9 F1 P, s* j#include <sys/types.h>, q6 r0 p. q" I8 ]. P
#include <fcntl.h>
& d1 q' B2 {/ g% p3 J3 S. l5 B3 Y
/ R: Y; A9 z5 e: i3 S, n#define SHAER_RAM_BASE_ADDR (0x80000000)
@5 y: y# R4 O) ]- ~+ v% ^7 H! k5 h% Z) y
typedef struct( v$ |* k, B9 }% l9 U0 w6 m
{" X, p9 P/ p1 F! T
unsigned int a;* G& K& U1 k, r7 Q, O( I( u- ]
unsigned int b;
R p+ z8 s" j" n% x( g unsigned int packet_cout;
6 L4 f6 I" {2 p6 H! E! R+ Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) j6 S z" A% A8 _5 q* y5 o. A3 N; a) r) I- q' s/ ~, z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 K- s: A m* ?
unsigned int count_copy = 0;! l5 G/ V4 \) Z& Y0 {, d, T& m- q
5 s' P3 F* q5 S0 P
: P. N/ z$ }9 V" ]; ]
int main()
/ ]* H/ G' q. @! `{% i+ C4 X9 w1 a* ^" S8 D! Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
" W- l3 m& R5 w! w) z8 D/ ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; t) G) H0 V; t# j" u: g7 Q
& T4 X2 m8 j. D6 r g- {8 a
while(1)
/ x0 I' o" e7 u2 Q6 v {
{* R0 f7 w2 h9 r2 g' z read_MSG_buffer(pshreRAM);
3 B% w! u- e7 y/ l+ @1 W }
$ h; d2 _; V9 q' c/ @* I0 Y}
% O% y* \ d+ x' h# \
5 }% K7 k: f7 U2 b2 X8 N0 {& a9 D9 uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 C: N/ U* A" q3 @{- }# Z, R1 k* P" c
RX_MSG_PROTOCOL buf;% C8 C8 U* U: W0 ?) `
5 \8 a* J# I* W9 v buf.a = pshreRAM->a;9 G0 F- ]6 r+ v: y* c1 G5 r3 a
buf.b = pshreRAM->b;
: a/ H3 u9 F9 U buf.packet_cout = pshreRAM->packet_cout;
( k* I# W, i) H2 G
! s$ K" E4 X$ R5 _! M, h if(buf.packet_cout != count_copy)
8 X- B6 }3 r: d0 S {9 x4 e0 i0 f( i: z( ^
printf("a is %d\n", buf.a);
2 P: m& w* G% x) }0 _& j7 m0 r+ L printf("b is %d\n", buf.b);/ K. ~/ D( X& `" ^( e
printf("count is %d\n", buf.packet_cout);
& C8 X3 k% i3 X3 i count_copy = buf.packet_cout;0 k2 {) [8 b2 {/ h
}* F: Q( e' {3 }7 P) U2 R" x/ c3 j
else' R9 f' P8 ^- x
{
# Q+ r: k& { Z1 m3 D/ w& s printf("No effective message!");" Y4 y. K8 R" A/ J( a+ m
} ~* g( ?5 K1 q8 W% t9 S- x" v
}
) m7 h' U4 U; F" G4 b3 }! R6 Z( s9 p6 Y8 G- E& S
: w: P$ F9 a/ Q5 o3 a" a) s& A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ \: Q' P" k5 s- j- b1 p( _3 `, d
使用下面代码,对内存使用了mmap函数后:5 e, U, c7 l6 f. _9 _9 C6 R! X6 a5 ]
#include <stdio.h>: Z" u" w6 d, Y, y2 S
#include <unistd.h>
1 N7 t6 D5 k7 E2 s( S#include <sys/mman.h>
1 x0 Z% ]) ]9 Q+ b0 B& W$ q% v: b#include <sys/types.h>
& P h! X5 i' n7 u#include <fcntl.h>
& }, G0 o4 V: C. U5 u. l. f/ D, J G* e/ X
#define SHAER_RAM_BASE_ADDR (0x80000000)
s+ b, P t9 p5 \* n' }" T( ]#define SHAER_RAM_SIZE (0x20000) - S% @+ ^/ ?" y, s/ l
+ F" I+ C( [* V5 Q* Qtypedef struct
8 v* b0 L- G2 ]* I0 U{
5 K# D0 D1 A0 d9 L$ U9 b2 Z# B1 W unsigned int a;
5 q% }% [/ u3 X; L unsigned int b;
/ d# J1 L- s/ b5 w unsigned int packet_cout;
! C$ z! b: R. C6 }/ \; n( u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. J" e7 L/ q% {: G( V ?' l% i# Y S1 C. n: S+ _5 v# R% B
void read_MSG_buffer(int *baseaddr);
; x2 m$ \$ T( B$ h$ B* T" l0 j, ~unsigned int count_copy = 0;
6 H# n/ Y0 R: q9 x# C
2 r7 V- [! c S# S9 u, j! {* ]: qint main()9 I+ k* H1 T# H& j8 n
{& e# C F) l: b" l& s8 o
int fd;2 w/ N, n0 o! `3 u
int *mem = NULL;! H! R8 y0 F: C9 `8 D( U
8 F4 z" c2 l* _2 f' @
if((fd = open("/dev/mem", O_RDWR)) <0)0 c& e9 c: K; r5 @
{9 ~8 g$ G( A1 q& j" J* q% O
perror("open error");5 z( N4 u0 K7 _
return -1;6 L0 K0 p2 j. _5 ]& O5 o% t
}
% L9 W, [7 |$ A. n. B. E9 q3 P & s6 B) U3 e, c
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 d+ r+ ^) c0 F
" y& K5 \0 \' _! G( J3 ]& j" L
while(1)
. ?; Y/ Q3 f1 ^4 j$ T" X {- _0 a( K6 Q1 M$ X
read_MSG_buffer(mem);
+ M. M0 j+ ] W. q: d$ | } / h s$ i0 J; w2 v E( a' h
}5 K# h& R( _; W/ S
6 F9 g) A5 V/ S% g) @: ?" Xvoid read_MSG_buffer(int *baseaddr)( X T* W4 F+ P/ p& l4 U! P* V! E
{
. p" }0 E% l2 C. D# o pRX_MSG_PROTOCOL pshreRAM = NULL; r6 X5 d1 C0 A3 ~
- o) M8 h6 w- T- l0 v. z9 Z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. V" N( h$ ^- C
" k$ }( g9 G# H- E if(pshreRAM->packet_cout != count_copy)- @( `( x' d' H6 f# E
{
9 F( ^. e/ F+ c# l( k3 D printf("a is %d\n", pshreRAM->a);6 `. l7 {4 s; k, z# e
printf("b is %d\n", pshreRAM->b);* p9 i: v- C4 `( A7 W1 C# x% Z
printf("count is %d\n", pshreRAM->packet_cout);
% @# N ?7 _/ F n( m count_copy = pshreRAM->packet_cout;9 V: ?+ s0 ^! q6 V- U" t
}: B, [9 K% p: W" | h8 h- b3 u: @
else
, Z7 f1 i2 a) s# e# C {/ T- _4 }; r( Z* Y/ s- x* p
printf("No effective message!\n");
$ @# s4 d4 W& E8 Z# Z+ p) k& v }
9 C, n% ?3 T& [}& A, `$ y3 u7 } b' c3 d! k9 b5 Q/ P
% }/ e$ p9 T3 E2 W( H; F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! L5 n+ T* r) H7 j0 f+ g
3 o i& k. y7 g k }1 X+ \
# W5 J/ @1 B Q' I) h% ~
" ?* m/ s" f& L% W; u$ z4 ^2 ^- `( V$ d9 x- U" P4 h' S% Y0 c7 a
|
|