|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 \/ f3 x7 `' t# L+ l! {3 n; O
* c' y r9 I) A) C4 X3 |/ OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ {" ^& x2 l9 a$ A#include <unistd.h>0 `. i4 J* f" T
#include <sys/mman.h>
. J6 }8 V/ \1 D5 s; x5 m6 ]& t#include <sys/types.h>( k, m2 _5 \) [3 o
#include <fcntl.h>; k- ^+ r t# g- Q. s& I% }
. t% l3 b) \4 z8 L: B% Z% N#define SHAER_RAM_BASE_ADDR (0x80000000)
# O" x. y5 V; b1 l# ` J* r" L: M+ K; v9 r! w
typedef struct e5 G; O5 u; E( X; [( q( E. D; Y7 U+ h
{
0 b: [3 P/ _4 W9 f. i; @2 I: @ unsigned int a;
1 U- {( d! z( L; C2 Q unsigned int b;* J$ }. D. E7 K" p+ q8 H- Y
unsigned int packet_cout;
5 s& O$ A$ J5 H ^& h+ W2 R+ d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. L* H2 K1 @8 ~5 r5 ?
! i5 a# j8 @ T& H5 O! E; j& D0 J/ l1 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 w& K8 S0 J+ n. P
unsigned int count_copy = 0;
u6 `9 {* o7 x9 H$ ^- M* b, `
/ i/ d! q/ h$ r4 [, U" C N$ w$ n$ D6 P
int main()
# O4 F* u* Q1 n% ]4 x8 y* `: E{6 g! r/ i8 M: z9 ]2 l& |6 s
pRX_MSG_PROTOCOL pshreRAM = NULL;4 q4 L' I' G3 u; e8 b: D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& _ @% \: {% x& I4 a
9 a) k* K y3 I
while(1)
* k/ c0 M/ S" K, t {
( T. W! f/ q) d$ I; T" g read_MSG_buffer(pshreRAM);5 U' V4 C7 J+ r: n: m9 D7 R
} 1 C: q. f0 [; B
}
! M6 n! n6 A' d; e& E4 a, } y% k
5 ~, A: Q% ?/ l8 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! W% Z! N2 D' n{. V. y! t0 g. v1 J+ J$ E6 q
RX_MSG_PROTOCOL buf;% G* j Q4 ]' B; P9 Y
. p5 |7 c6 U4 R, O
buf.a = pshreRAM->a;
) J& h' h7 w7 B1 J3 C8 X$ X buf.b = pshreRAM->b;' H' ~0 F& e$ B
buf.packet_cout = pshreRAM->packet_cout;% X# w. p, b* {- @1 n- D$ V5 D( l
9 u; S7 d9 Z- C) @
if(buf.packet_cout != count_copy)
' F+ f' r3 O% l% I" M$ U) F# f {" g/ i7 y' k! ?6 U3 }
printf("a is %d\n", buf.a);
; x$ y; p3 F9 y5 z printf("b is %d\n", buf.b); _" l+ }6 g/ |" U1 t9 V
printf("count is %d\n", buf.packet_cout);
" B6 L- d5 p4 X. ]! C5 G l count_copy = buf.packet_cout;
a; D7 b* u: w) F c- L }% Z7 Z$ k& J8 S) W# q, A
else
6 r( y! L5 W2 }! w {
; @# M6 i% G8 g2 V printf("No effective message!");* [( P' H- V7 S# {( V* g
}. K0 {& G* ~ H
}+ e, {5 {( J# ~ `8 P
9 B' H! x7 ]6 Y0 |! N4 ~
" `& z! s, F/ J1 N1 Z# I) l. N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* @# E% |! E g/ i
使用下面代码,对内存使用了mmap函数后:/ Y: S$ w( x: f0 K
#include <stdio.h>5 G0 W8 U7 E; I8 n9 Z7 S5 ~/ g
#include <unistd.h>
" N( x- k( z( J4 t& ^#include <sys/mman.h>
0 J2 q! {' f3 w" _: T$ f( j: T% H#include <sys/types.h>. T" I0 ~- C- u& i- k
#include <fcntl.h>+ j# Z0 q4 _, g8 x4 H3 S
. I% b* J( M4 ~& V7 J" m2 j# _
#define SHAER_RAM_BASE_ADDR (0x80000000)
' G$ w4 c, ^" ^$ b6 ~% j#define SHAER_RAM_SIZE (0x20000)
8 t! |& E# S. j/ @+ X. P
" k- M4 P3 g0 X# Gtypedef struct
0 m* }: Q9 y4 I- _* t2 q{/ g4 L0 N. j4 o; W
unsigned int a;4 ]8 Z* a8 M1 u" N+ ?! u$ h( Q4 |
unsigned int b;
# n% g1 @8 {; V% g unsigned int packet_cout;
, P6 c% y9 N8 L" u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; E! p) e0 P \+ G4 f" S
1 ~5 n$ y4 f5 [void read_MSG_buffer(int *baseaddr);6 [( C) o8 ~' J4 t9 ~6 K5 H5 p
unsigned int count_copy = 0;( ]& g2 E7 l8 U
5 S% K+ v5 Q! K
int main()
! H+ E* p) E# [& H4 [- P{; k- A& M1 \0 E
int fd;
7 U* d/ @" Q# w6 t1 `2 F/ S; N int *mem = NULL;
& M' N. ^6 ^) d9 `
+ V' g* S, ]0 `4 @! r5 w: K1 J if((fd = open("/dev/mem", O_RDWR)) <0)" Q" c1 M" m& @3 @3 T9 ^1 Z
{/ o X6 P0 m( ^* W0 s
perror("open error");- |7 u* T8 S% f' W, V9 l; C1 I
return -1;
% C: N) I f; ]3 W% G }1 ~7 i9 z/ j; W* r
; e1 c; C7 Q. l9 L. _/ P1 @; J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 c) ]5 S' a- K# p M
! R Y$ A/ K: \( Y while(1)
0 o+ v# a( M, k0 S/ m! j' O { v- }5 |0 W% m0 \6 X
read_MSG_buffer(mem);
& j6 b8 x; y( `' d- y2 Q) c7 A9 [* m }
% s ~, z5 _7 [) r7 B+ G}+ m* \( X- o- ]% b' U
: Q6 a4 U4 B, W4 ivoid read_MSG_buffer(int *baseaddr)
. x8 N& J1 Z3 e5 n* k{8 F2 N2 N5 h6 [ f
pRX_MSG_PROTOCOL pshreRAM = NULL;
, x- A6 m! ?1 K1 O
/ n9 t3 G& d' S a; h' Y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 u/ ]* R' [( P$ n1 i% {9 p: [+ \
, X% D! C. _; t; ]( h. u
if(pshreRAM->packet_cout != count_copy)# K! w8 F/ L' q' j, f Y
{
5 e7 p8 ^2 t! @- ~9 \2 z8 E) N printf("a is %d\n", pshreRAM->a);- s! j- t8 W# \) j; a! W
printf("b is %d\n", pshreRAM->b);
{0 g5 {% u8 ^" v" {5 ?. w$ r printf("count is %d\n", pshreRAM->packet_cout);
) O8 e- ~( ~: x- t count_copy = pshreRAM->packet_cout;
$ l8 Y1 o/ w( K7 f }( C5 k7 N) _- r
else/ p% r2 x- l! \
{: h) V& B4 F! z2 k
printf("No effective message!\n");
" k6 y: V1 E* C/ E6 i4 [ }
0 O5 i( J! \3 H* ~( ?) x) w}# P( e$ R- C2 w
9 y& t4 v1 b. b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 i' N5 A) O# C, ?8 ?% b
: e X+ f2 Z+ O7 k
+ E: T$ t3 e5 W' ~6 Z) s9 f# |/ K- n; i
* q) F5 E/ ^: c( X$ b
|
|