|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
X9 X2 x3 C7 g1 [8 f
/ C! `( r, f6 @ R( T7 ?. fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ O% U, B+ c) d4 n2 d& ]#include <unistd.h>0 p$ A/ k! I& x, ?/ Z
#include <sys/mman.h>
1 G, d0 y1 c, O! ~! x$ h; g" ^9 O' @#include <sys/types.h>. ^' j5 F6 ], s; I% k3 a. |0 N
#include <fcntl.h>4 j$ a4 E* B( g" W, i2 H
$ C% F- F/ k- L. i! S' F
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 U, q+ W9 } m4 ?8 |2 I; |# R
0 M" h3 }) m# Itypedef struct: K0 O6 R/ g+ ?3 R
{$ M9 j" O- `; o7 ^; @: g- K( @4 h/ l
unsigned int a;* ^7 \! P( H9 O3 g4 T6 {! }
unsigned int b;
, \ W: S" d: A t% R9 ?9 A unsigned int packet_cout;
7 H2 o$ X6 E" L# N4 e1 C3 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- n% M# J: X. R# O. l, f4 f, U9 t7 {, u$ h' f' d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- V2 P2 e o8 e3 f3 r$ f/ |9 l
unsigned int count_copy = 0;
5 U5 O: |. ^3 i. Y7 p8 K) }
# T' T! m6 k: O g5 g
3 E$ y4 ?$ a, Xint main(). y" u! i+ y6 g
{
f6 u& D+ O6 y% Z pRX_MSG_PROTOCOL pshreRAM = NULL;/ S4 G& Z. E/ G$ Z7 k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, W; `. l% Z9 u+ |
+ h7 J2 e7 ^. Y9 t) t while(1)' M: W% a: {7 r! c# Z
{7 D0 }. C3 r* Y; c J
read_MSG_buffer(pshreRAM);
; k8 M- D5 e; M- g9 s0 r/ s }
6 ]1 s2 O, `! c4 q3 Q1 V r1 S}: X6 s' j/ z5 f
+ u9 G+ K: u5 k8 E J; K5 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 K Y; i7 C1 v0 Y( Q+ @{4 \0 O" E5 I& V* f
RX_MSG_PROTOCOL buf;
( T d5 N' ~! n4 P& a
! g; q2 S3 g* e- ]7 _ buf.a = pshreRAM->a;
# _8 t& b" Y2 [% S+ p+ _ buf.b = pshreRAM->b;
9 L& y7 m( O5 n# x k buf.packet_cout = pshreRAM->packet_cout;8 o. j* @0 q [
# E- O2 k% \* Q* ?" U% _
if(buf.packet_cout != count_copy)' b0 Q9 F2 K) Q* T# h8 ~
{) D# ~% { R t* c4 l6 l! g7 W% n; V
printf("a is %d\n", buf.a);
' o1 ^+ q; o4 y% p% g printf("b is %d\n", buf.b);. l4 l& i$ s0 ]+ V. W V% k
printf("count is %d\n", buf.packet_cout);
# ~' S8 ^9 X4 f& {1 x) l0 Q5 F count_copy = buf.packet_cout;
7 j( U- g8 T+ n: s0 \ }
( i6 {* m6 I1 k! B, K; i& x) } else# L8 V. m& d x* P% h$ P
{
9 W4 Z3 Z+ b8 j! N: y* k. t/ N printf("No effective message!");8 q2 c+ P5 |& {- Q! k% i8 C
}
1 L' ^1 r7 t/ p$ G3 g}
5 A3 q- G. L" w* Z! S: _8 o" C4 a3 w: W
9 i& R) [4 w# T) x2 x. b# F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 ~" P* |" ?" J0 s" W: E
使用下面代码,对内存使用了mmap函数后:
+ ~' `7 T) A0 v4 m- ?8 p- B0 B# S#include <stdio.h> u% w/ C& Y C& E$ J0 w. o5 z
#include <unistd.h>) G* [% E D5 I% C5 E
#include <sys/mman.h>2 H/ Z3 _- r4 u% H
#include <sys/types.h>
. X% A# c4 c3 a: H4 e#include <fcntl.h>- r- L5 {2 s$ |6 V. k
5 ~" K, c8 i& p1 x3 m% a/ T#define SHAER_RAM_BASE_ADDR (0x80000000). V6 Q0 _ u7 H8 K) v9 i3 k5 R7 ~
#define SHAER_RAM_SIZE (0x20000) ( ~/ D- l0 T8 P4 z2 W+ c
2 _7 u5 e" G2 A. }: Q6 X
typedef struct9 o" ^1 {/ O3 n$ y9 U
{* G; ^# i/ I: G0 Q8 @: E$ P
unsigned int a;
, y4 ]/ _' F& e0 B7 X+ g unsigned int b;
$ K/ d$ A1 h6 Q: n; } unsigned int packet_cout;
8 s4 a% @' q2 r4 _0 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' w* U: B$ s' r6 c" P
' w: o9 T9 N0 v+ P5 K: lvoid read_MSG_buffer(int *baseaddr);2 @5 b; Q* u$ T1 l6 Y6 `
unsigned int count_copy = 0;2 m8 D& ?) o# K+ I3 i
. w. D2 J* g0 a9 Z# L! u: i# Tint main()
- |/ O: Z2 E! p, ~{
1 u' w9 Z- [) L# | int fd;
. [' u, _9 A3 t% T/ l( B; j* @ int *mem = NULL;3 A1 S: u' R! R& D0 f4 t
W) I0 m$ o8 R2 }% b( A
if((fd = open("/dev/mem", O_RDWR)) <0)
' l, x5 s4 _' D, C* _: @ {
' D" e* i8 R2 ~% H5 p4 |" `8 h perror("open error");
' {, S8 {$ L7 A1 F2 e( B: B return -1;
: N; K z1 ?( T" @5 ?5 x) d% s" _2 [ }
1 p: A" d3 J! |
. ^8 g' ^' @/ f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) p; d- T1 j) L# i" `( }2 G# N+ N# f! Q+ i% A( U
while(1)8 D2 _: g, {6 R
{
$ @$ W2 y% l) j read_MSG_buffer(mem);# \* S1 ?8 f- `$ B$ k
} # {6 K" n X* M0 p% i7 J) E
}* y! D1 X* I0 b; Q8 _+ A; J
3 k0 f3 @4 b, k" q$ k& z5 svoid read_MSG_buffer(int *baseaddr)# U6 p) R6 H' N0 Z! O
{
( m' G6 V$ [2 l/ k/ e8 J pRX_MSG_PROTOCOL pshreRAM = NULL;+ o: }$ F" w9 i6 L* |4 `
6 }# ]- A8 a ` pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& y4 |4 p! P$ \( \; x1 f4 v3 P A' H& G
if(pshreRAM->packet_cout != count_copy)
. r, c# `0 P* F {
: ~3 d- r9 j* g& J2 a printf("a is %d\n", pshreRAM->a);: l( k7 B& X' B! S5 H( C
printf("b is %d\n", pshreRAM->b);
q; t, e1 a" V; e$ ~" a- t printf("count is %d\n", pshreRAM->packet_cout);8 p6 ~7 o$ m3 s! G) \
count_copy = pshreRAM->packet_cout; ~) c4 u: n3 B. H
}+ h, s9 L) G. Z% h3 M: V
else3 t! f) C* L0 E9 u' o/ M, }" A3 M; |
{+ f. [* h& @. V+ ?* x
printf("No effective message!\n");. \+ A; t: ~% F$ `
}! Z, y! E4 X& U
}
! T6 Z0 q! k3 |7 i( W3 \$ a( q: w: G9 n* Q# o( }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) M( H+ S* A! i# r2 n$ n
# B7 T1 u& g9 t& w3 F: G3 C8 j3 S d H; ` s
) P. g, F* B+ w8 S# ]: H' s) z- s9 O
: [, P" e" e5 B6 v% g2 [5 M
|
|