|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 r0 ^. p! o8 f- q" @6 g/ C1 j0 d
) ~4 P, I; |9 ^( [4 t2 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
h! |! ?- C7 c. J0 i2 M#include <unistd.h>" F, |' G7 z/ W( t1 w
#include <sys/mman.h># }; b+ ^8 I3 h E1 N+ L0 T0 d
#include <sys/types.h>
) c; P* U" x/ w- E9 Z$ R#include <fcntl.h>
8 h5 I' n c- W1 i0 [/ Y& U# }8 [' g/ O! o! ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 Z- M; J0 A, J1 {$ i Q) q8 c, @+ X4 Q' |1 ]+ u U0 U' |- X
typedef struct- _. X% r2 d; X3 W, T
{
+ |- }; W6 ~: A5 L! V" i unsigned int a;2 H$ C2 w% C* J4 H5 Y
unsigned int b;
# x9 Q7 j) V) x5 ? unsigned int packet_cout;
% z( F E B1 w' w V6 n! I o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 _ Q5 D8 \2 ]! R, h" k" ^
( ?# D8 K0 M7 C* Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 E3 B2 g6 n9 [3 f8 q# [( M
unsigned int count_copy = 0;
: B: }; u: M- q' D( ^0 h, f6 g4 X* J3 \2 ^$ b" S+ o! S
+ T8 [: E- |3 S. o
int main()
* {; o9 g* [! T' s. L2 j: C{
. K" b! e" `' I! N/ Z9 J! _5 B9 D pRX_MSG_PROTOCOL pshreRAM = NULL;( R( x3 O, g5 r. Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 z/ L9 g" N, H1 Z- J3 I
1 i# z# N0 V& a& m8 w* d4 \3 r while(1), v& X" u8 m T. t3 q2 s
{: }% K* V- T. ?) G2 u: d
read_MSG_buffer(pshreRAM);
+ g' Y' G7 B. ]- @ }
- e, p/ X+ X- m" b7 b}
' Y( f5 G- p8 z7 d! l0 K# S# J) C: ?8 X6 | T% @6 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& M1 L4 H6 U% ^% }$ E{
( l8 c5 l3 ~. H) g- K8 W; `$ V RX_MSG_PROTOCOL buf;
5 b( l4 Q" f2 E' Q( ?1 o& w8 K
; Q6 Y1 g; S& L" T% {4 w buf.a = pshreRAM->a;
O$ l( L; J0 D0 u1 ^ U" | buf.b = pshreRAM->b;; a) p) l0 b2 z4 F
buf.packet_cout = pshreRAM->packet_cout;$ W5 {9 o# v0 q1 [
4 I1 W; v) L' [6 S
if(buf.packet_cout != count_copy)
. F1 W; o w6 Q4 X! i# L q {
% I; u$ D+ ?( W printf("a is %d\n", buf.a);- j) O; o, M1 u6 J
printf("b is %d\n", buf.b);
; }& g; L- J9 k1 Q6 ~8 q printf("count is %d\n", buf.packet_cout);
1 b. d" g. Q ~4 Z! t! @! c) e count_copy = buf.packet_cout;
( x+ n& t% c5 D8 W6 J$ p }
; W$ t7 |5 m: l0 K else* I0 j H& Q0 n# Q# P
{# K! G5 j9 ]: B* U: E
printf("No effective message!");$ F5 H+ i$ q% }" P1 p
}
! _# Y) N4 O+ w* O$ n4 D. p+ ]}' v2 w; @# U: x' y
4 W& {$ W* g3 \) r( R
5 v7 C6 K: d$ V! d) @' L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 W6 F9 U- w9 Y! G& n4 i- g
使用下面代码,对内存使用了mmap函数后:
' U2 ^. y9 r8 N1 z6 o& P#include <stdio.h>; s7 J! n) M" O$ F, S9 f/ O
#include <unistd.h>5 n6 F. k1 a9 p5 ^* d: ?7 d! n
#include <sys/mman.h>9 Q- m% T/ L+ D
#include <sys/types.h>
0 y# G; m6 T" E1 X#include <fcntl.h>) [. q6 R5 ^( \# m, v% S& `9 M
5 a2 j) k& ?4 u" `: E' Q& l#define SHAER_RAM_BASE_ADDR (0x80000000)
4 F7 [: h8 ~# m! g9 M- o- H9 k#define SHAER_RAM_SIZE (0x20000) / z" x/ y+ t8 X: F
& g& Q% q1 m; s8 Qtypedef struct
* u) Q/ z8 R5 k4 i{
8 s$ ]( L! L) E7 ~- u% B7 x unsigned int a;/ ?# {: T, r, ?2 x- A! l' I
unsigned int b;9 c! K; _' g1 h' d
unsigned int packet_cout; ]* f, M: y) f' F" _6 w5 h, S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 c' g# A9 g, p2 _9 i, p
4 {% _" F) a) j0 I) f
void read_MSG_buffer(int *baseaddr);- e, q" h; e) D- E
unsigned int count_copy = 0;
) l# H8 r0 Z) r1 {) f, ~) [" q% I7 K' \# B4 g4 k7 {2 T
int main()" s, b+ M( X/ m% W
{
2 F6 x, S6 r$ Q+ H2 r5 R) a8 _3 U int fd;
+ L7 ]6 [9 ?9 [9 X" n int *mem = NULL;; }9 J I" v1 I2 e$ d- b
7 B6 i. D% g2 w! {# ?# |8 S, o if((fd = open("/dev/mem", O_RDWR)) <0)
: J) S& I; ^3 n; g% X# i. U {
' I& R1 O7 R0 p: q- ]- M perror("open error");
, S C3 z7 J& d return -1;
5 h, t4 B2 ]9 j; B F+ M }3 {+ X+ a L) ?. @* S4 G
8 I4 y9 X+ F, G# v+ ?: m
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ M8 u1 g7 E! Q
4 j9 G& {- Q! s: ` while(1)1 h5 I2 a) d5 D! t0 U/ S. O, S1 I
{/ O5 `* w7 x4 ^& S1 I
read_MSG_buffer(mem);
F' d+ k4 J* ~; R- x }
; u9 ]4 a4 l* F# k A: H/ T) d2 |}
% ]! `3 @ q- Y+ w% M& y/ n
* T3 k c$ O. Yvoid read_MSG_buffer(int *baseaddr)2 z, F. _6 b3 w. w% \7 c! G
{
( e7 v$ K, @- e& x( k pRX_MSG_PROTOCOL pshreRAM = NULL;
, A8 V8 y, X5 z* ^8 o7 G; n) o* P2 k$ l7 H8 ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& p a2 e: E! r, Z) a6 P/ F; i
8 g8 b& I% T0 I7 ?. h
if(pshreRAM->packet_cout != count_copy)8 J2 M* Y+ C: ^+ P. ~9 q
{& f5 X+ j8 \- s+ z( H
printf("a is %d\n", pshreRAM->a);
) A+ c V' E! f: L9 Q0 D8 e printf("b is %d\n", pshreRAM->b);% w$ h4 k, y. K0 K
printf("count is %d\n", pshreRAM->packet_cout);+ O8 W( w% S8 u }6 L, E& w
count_copy = pshreRAM->packet_cout;- G$ y @2 H A7 A" m: a
}; V( u* H- h1 G0 P* t U
else0 E/ r$ ]0 b! B) _( [: E& c4 r6 d
{; _7 M5 B& u. `
printf("No effective message!\n");% u, s$ G+ C' G" K2 V. K
}2 G2 K; O! n$ o. c1 N3 q
}
$ j. c. z( _ `" M z C5 a, Q7 d% F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) M$ {3 T: v& A7 n w
2 t. S5 D7 O4 v3 t- R* _, @4 f
& K1 r! Z7 e- P1 O* _4 j$ m, }- D8 X4 a# |% _6 O5 z
" h Z9 O- d; C6 P) y
|
|