|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / Y* }! G! s" Z
0 x: u4 A0 B3 M. d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 X* {2 e6 s" w- a$ j C+ M
#include <unistd.h>
$ H6 {% j* K/ D$ c#include <sys/mman.h>
" R( G0 v0 ~8 \( `0 B#include <sys/types.h> N4 {% v+ U* D" z+ a
#include <fcntl.h>& m I+ |8 P! q2 ?8 s4 ~
( w2 D; q# t. a; _#define SHAER_RAM_BASE_ADDR (0x80000000)
% }; ]- p/ |+ ^, U. v, Q4 G5 R% N/ e
typedef struct
( U% V" k* H# f7 y2 T- o{) H9 E8 j/ E6 B
unsigned int a;9 _7 Q$ A- C% K6 d
unsigned int b;
& _$ z' D0 C5 V; v1 i* }2 h8 Q4 z unsigned int packet_cout;
# z7 e+ A: U2 `! o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; p3 a4 n, e2 E& d% v9 ~% `: d
3 g' ` A: E8 ~- [% \: n* ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ t) v& B' o; K4 _
unsigned int count_copy = 0;' t$ G t2 p( l7 u
. T l: t& b0 e5 @! s
2 k0 b- V/ k% l
int main()8 _& ?0 b+ d, r
{
) D' `% J' `/ K1 W pRX_MSG_PROTOCOL pshreRAM = NULL;
" Q8 Q0 z* _4 J/ [' t# X: A+ ]0 v" S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 b0 N1 z' U, `$ G/ p8 D0 @. d( `
* |% |$ \& Y! E$ F3 C while(1)
' ^8 l: }% |6 U- L Y" x$ f4 } {
5 w( _9 F8 m* M# b1 | read_MSG_buffer(pshreRAM);
0 l, y+ V& [8 S) x6 |0 T } 0 ]0 s: t4 x Q( O; v7 J
}# C5 G5 X# M( r3 `# f6 T
! g' V' F0 e4 I, S( M# k2 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( N" {# b4 X* g0 W/ }& E [& f{7 H5 N) o& j$ }) X/ Y+ \
RX_MSG_PROTOCOL buf;9 v5 i; X4 `" Z) W7 o
7 n# t9 @0 L+ ?4 \% h4 v: D buf.a = pshreRAM->a;
9 J* z! U2 n& A$ Y3 w buf.b = pshreRAM->b;
; M3 a0 k- z! Z1 @4 a G& y: | buf.packet_cout = pshreRAM->packet_cout;5 C* G3 p' h$ {0 X# q) E1 G0 K
1 v% y- T5 B1 a! ?2 U if(buf.packet_cout != count_copy)
1 \: g! {& a0 ?" x& _2 q3 o# i- K B& {) Q {
: }6 Y3 a ]$ q9 t @! P! G2 i9 | printf("a is %d\n", buf.a);2 A3 |2 I1 S* Z' M3 |: `2 @5 k( a0 @
printf("b is %d\n", buf.b);9 p# K4 d$ q4 p A- E+ X
printf("count is %d\n", buf.packet_cout);
6 D, C$ H+ R) p" N( C: z# G0 e0 ~7 k count_copy = buf.packet_cout;
2 y( R$ P, a6 O7 G }
+ b* L2 X6 b! b- e& B else
& ^! n8 \; b1 V {4 H; z6 l) B( E
printf("No effective message!");, e% u$ K7 E- O5 w. J
}
?0 x. Y- ]2 t6 f% \6 ^. n# E}
; j) k% `, x6 c9 z3 N
8 v1 A- s4 X2 a0 `9 C: j* { I: r$ C& N; Q$ u/ S* r' e0 {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, u5 j% W) Q4 s- n
使用下面代码,对内存使用了mmap函数后:
( t( S6 y9 ~& `* w2 S; y#include <stdio.h>; }6 b g: D( K: v, w
#include <unistd.h>& \; [5 R: p7 k/ f, l! l3 B/ {
#include <sys/mman.h>; E: ?3 [$ G+ W! ~% _3 Y& E7 a
#include <sys/types.h>
% X5 b$ K- T$ w/ m6 J* B9 g#include <fcntl.h>9 ^+ ^: t' o: l
7 R7 t# y$ Q. J$ i2 j' Y- R
#define SHAER_RAM_BASE_ADDR (0x80000000)/ T0 t0 r: F/ A8 D& G* L
#define SHAER_RAM_SIZE (0x20000)
2 m; S: ^6 y* R: C% Z' L7 S& M5 R3 |$ H& C6 P& l$ r2 E/ o
typedef struct( w+ b/ @ X2 }
{+ ]7 F3 m3 }; I
unsigned int a;6 {3 S* g+ w" r2 {6 ^* I; p+ ^1 b
unsigned int b;, K& k9 B2 z) z/ M( Z: G
unsigned int packet_cout;
7 {9 n* R" D, B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: X( U. L% o, \% Y
2 }# h% {; G6 h9 Z
void read_MSG_buffer(int *baseaddr);% o( U" j% d) }' c
unsigned int count_copy = 0;
) H% x' b, K4 w& Y$ a3 o% g- Y7 s% }2 P5 z% K
int main()& u- P- D3 ~5 t5 s/ W# k
{
4 i- {/ n _# a' q& y( { int fd;; w% L$ H( M" p' J# _/ B
int *mem = NULL;$ K1 R! A5 R9 Q2 o# H
6 {* j' ]% }4 y3 T9 |' I if((fd = open("/dev/mem", O_RDWR)) <0); i2 Z- |" f, @ v& W* Q
{
( q g$ w3 i. x perror("open error");
; s) w8 ]" \8 F1 u5 }6 U return -1;7 M8 I. O+ o9 M" t+ F: R
}
, O/ u5 Z/ h5 K* I( p7 W - h/ b9 U! _) x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 a U( G1 d- ]9 v" K5 g/ S# W( N& a4 D4 Z+ a5 A0 c/ h4 i
while(1)8 }( H* x, K- @% ]# y* p
{5 G6 p- J* X5 G, y9 t
read_MSG_buffer(mem);/ ]6 Y. E6 z- f4 O8 h* b8 k
}
5 |; ^; Z/ X' f j* Q) v}
: c0 |9 k, k4 \- ]" @, _; P6 M
; F j2 L3 e/ y+ s; n, Kvoid read_MSG_buffer(int *baseaddr)
]* v N+ {/ U M{
0 F) |# M* W, _8 C; j pRX_MSG_PROTOCOL pshreRAM = NULL;
# B/ I% }( J. }$ |: D; g" n" Q: H% V+ }# O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 {0 E- T6 O0 d+ F" x0 `
9 z, G! f/ \. g8 w2 d
if(pshreRAM->packet_cout != count_copy)
; o. X7 `" f' W& z0 Z( [ {6 \2 M$ U) d( H! s/ ^3 D& l' T1 v
printf("a is %d\n", pshreRAM->a);
- V2 L7 S3 b. P! q3 ~ printf("b is %d\n", pshreRAM->b);$ B1 U' J, ]' y, M4 M
printf("count is %d\n", pshreRAM->packet_cout);* f# g- G' E( \9 X5 C+ W
count_copy = pshreRAM->packet_cout;
" v8 m3 c$ P3 W! W }. V+ q2 ?% Q9 K8 l
else! K: U* o x$ M2 i) D3 z
{
6 h( c0 c' A* H$ G9 G printf("No effective message!\n"); V" R. p- J; M, n) a
}. [( [" D2 {& z( t% F7 Z1 ~
}
$ `+ E0 v! N6 ?( i* t
: p0 ~1 {/ e5 L2 Q$ l" u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% v0 Y7 S! J6 d( { Q& c4 Z8 ?
$ i5 v. W3 h v0 k) Z: P5 U$ d# k/ e
3 F) Z0 W- u; v7 [
1 N% g, Q% ~. n3 N' N. T! z) d
" ~, I& T/ K1 @2 T) c |
|