|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 E" ]+ u* Y9 X, `7 B
: p) ~+ b! f8 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 J1 C. N# H1 o. z! _#include <unistd.h>
2 h, Z( }* N0 o n" j/ r' K9 E#include <sys/mman.h>
; }# h' S4 A% a9 o4 d+ N#include <sys/types.h>
! I) p/ [0 V. q o6 ^#include <fcntl.h>9 W) J/ P% |+ J, W
" K3 F# N/ B1 H: R#define SHAER_RAM_BASE_ADDR (0x80000000)
5 O3 q0 W- V g) `! L) p+ u8 G1 s ~
typedef struct
3 c2 I! y5 y! Y# I! F{
1 t/ T; ^2 t$ ] unsigned int a;! X/ y) N( g5 n! w, b1 a# Q
unsigned int b;9 ]9 J6 g( Q1 g5 K/ j( [- w
unsigned int packet_cout;$ O# d# Z. T R* V3 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( x6 _# a* _: T- g0 w
x3 T0 h0 r$ ?% Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( ~' ^" k2 K" i0 W
unsigned int count_copy = 0;
" j. Z1 Z3 _# H/ L' R9 `# e; Y2 w9 y( D3 |( `: ~2 X0 F4 |, i
6 S4 C( S' w5 v8 Y" Z) S1 c% gint main(), p) C0 B/ ~# i; Q/ f$ k, T( l
{7 z: u. u8 W# y6 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ L1 H% `: h+ m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, `& v. N6 @ o5 H* b
% E. G0 H, L1 m F" u. ?7 L while(1)
# P# S- `' W0 n/ o: |; R: e0 l5 Z% O! K {
; s9 d& K, J3 e, O read_MSG_buffer(pshreRAM);$ P+ J; F5 C! k5 b# O9 ]" e! r
}
! y' d% l: A- q6 \. B}
* ^) v% \4 k* N/ M4 b- Q6 z1 A8 i$ d+ U$ g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 d3 B+ ] j5 N1 l& i4 I
{
Q& P7 O/ N# Q RX_MSG_PROTOCOL buf;
0 x, a; A: |' k- M4 Y6 P: H
* c' M1 P2 R: e$ S. ? t buf.a = pshreRAM->a;
9 t% r! I; f+ G* O# s e# e+ Z1 u buf.b = pshreRAM->b;5 } K3 `- _" D5 G
buf.packet_cout = pshreRAM->packet_cout;6 H0 g2 @( r/ H
8 C8 `+ P" X! J4 I1 @! s' Y' y if(buf.packet_cout != count_copy)0 a- j7 p0 S* M# L
{
; M. o/ I4 s. `* H7 h1 V printf("a is %d\n", buf.a);; J& n( b' F& i$ u6 j+ ^% Z3 n4 g
printf("b is %d\n", buf.b);+ \9 M: v7 U. f$ I0 w/ Y
printf("count is %d\n", buf.packet_cout);
9 ^& F" w# H+ @! Z4 B9 k+ X count_copy = buf.packet_cout;$ D7 }; F$ g, t9 g W
}
" _, ]4 Q9 u& X0 y6 S else
- `$ N7 m" b/ H3 a1 X1 U" @ {3 l3 H4 t+ L6 l# i' z6 W
printf("No effective message!");! t0 u( \( e4 l
}5 _# [. E3 K, h$ O: t$ ]2 J$ a
}
0 a, O! t( J2 q, ~9 S" U/ C8 b1 u+ e* K" c
/ B! `- |5 c# t; l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& ?7 ~" C2 i/ Z4 H9 [
使用下面代码,对内存使用了mmap函数后:" T m/ c2 j. Z9 L- Q# k
#include <stdio.h>
9 X% G- O6 d7 s$ K% h9 b#include <unistd.h>2 F; J3 z! N$ Y" V
#include <sys/mman.h>
2 v" S& M1 S5 F( z. q) U+ `* T#include <sys/types.h>
) U$ T2 i7 N; K0 `#include <fcntl.h>
( E; j$ {5 y2 T: v
( V; w( `$ J; c#define SHAER_RAM_BASE_ADDR (0x80000000) r4 ?6 e! V: N. L) v) z
#define SHAER_RAM_SIZE (0x20000) 2 r$ f+ u) E% C( t; u, Q7 u$ ]4 X
- b# q% b- L1 \& s/ I$ ], ^/ f. gtypedef struct
. u+ C P- j. i5 a) S" A% E{
6 \9 F( ~1 Z7 d5 X" v3 W" L unsigned int a;+ ?% c8 q/ q' B# X0 W( c: A0 r# n
unsigned int b;$ Y, K9 p* Q# v6 [
unsigned int packet_cout;
6 z4 E' f/ ? z9 b% z! j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, j# {5 p' O* U2 v6 U
. v4 ?& ]& l" r# zvoid read_MSG_buffer(int *baseaddr);+ w- X! W* r) B; d! X5 p
unsigned int count_copy = 0;
4 s0 ?' ^$ Z! j2 P$ b
& z# f' v" {1 u% |8 oint main()& g. z$ k6 r0 R; }
{: Z2 p3 G. A3 F# a" H% w
int fd;+ A2 g8 k9 u0 h4 M
int *mem = NULL;
3 J1 P3 E) o3 M2 B. u( L, \% `: K. V9 Q4 x- h
if((fd = open("/dev/mem", O_RDWR)) <0)
3 z1 ?) @; s3 I P' S* s$ M3 W {8 [( O* Y6 K6 N' G0 v
perror("open error");; P3 Y% _* S/ f9 V, w; f; M! k# b: T
return -1;
c5 Q* j6 `* A# o1 @ p7 b }
4 s) Y2 d" S0 A 2 Q9 L* z: G$ d7 N! u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 L. u7 V' s! b, ~
9 d) B7 w& Y: Q0 F- z x0 L while(1); s; I+ {- ^7 {
{
" J) F' K5 `$ ]! H! \: c& P! f read_MSG_buffer(mem);
" }6 p8 r0 N l1 \ } ) l' Q; I5 F* o& j
}. S$ v9 H4 h& Z; w r
1 ]$ ]# G" i4 i% ^# e/ s
void read_MSG_buffer(int *baseaddr)+ h9 t. t# M! m
{" |' ~$ E! o, F. G, J
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ?6 P9 O9 V( T6 \6 R! W! m9 u( c* u, {7 `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; c2 g3 T; V' ^7 _3 p; d6 u+ x+ b
+ q8 Q% O% }, x2 \: e9 T
if(pshreRAM->packet_cout != count_copy)0 W4 P/ V& O( j; f: _0 `7 n1 Q
{
3 I; Q- ~. M: Z# _) K* u printf("a is %d\n", pshreRAM->a);( X* `, S: W0 A5 g* c$ J7 B: P
printf("b is %d\n", pshreRAM->b);, F/ Z, q6 ?$ Z" d% X C7 |
printf("count is %d\n", pshreRAM->packet_cout);
# }* v t. |1 r; |/ N0 V; r* Q count_copy = pshreRAM->packet_cout;
$ A; N0 O( T. L4 c) {/ r }
: G/ D& z- l: Q else" T& ^6 B0 w; P" K/ a; p9 j
{; j3 M2 t* \$ {. F+ } W- H
printf("No effective message!\n");
" W- O) V9 b3 y }2 A' w4 M/ L6 Y
}* _6 g' P4 t/ u% |
2 w: l8 D7 P4 Z! Q# r8 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; T- {- j2 W$ C1 t
1 }' W/ O: X" n) J: d: V
1 Y. r" t+ X, B* ^. ]# h) [. ~/ ?+ T; w( V
. ~/ i5 G4 E% S L, e
|
|