|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 w: X$ u; Y3 [+ T$ z+ ?- s
' U$ S* l w Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: Z ^ Q, t7 K' P, u& L3 J
#include <unistd.h>6 a) c* P8 E7 V/ I& f
#include <sys/mman.h>2 I+ h* d5 N9 B) u# F, N0 |) S4 g4 f
#include <sys/types.h>: \: G3 ~7 X4 I1 \& h1 B4 \2 c; D4 F
#include <fcntl.h>
6 [6 ?+ w8 [8 G: Y2 k
! r$ p& `; W8 {+ I6 Q#define SHAER_RAM_BASE_ADDR (0x80000000)
8 U5 i( V- H# M5 m4 f) A3 g" v
' D* ]) o8 Y, L) n9 k* B0 u$ s" o" }% Utypedef struct) k- T% ? w, A& `
{
( x0 X `2 U6 T8 M0 ^" H unsigned int a;( q) W3 a! R: {* j; g8 C" f
unsigned int b;
" F5 y9 N% W- p. R, X unsigned int packet_cout;& v, N$ D5 G& p. }/ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 f9 B9 ~" u4 v; D$ |, k w% y! ~- d! m' e2 A. }- M$ t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 ^/ P# I: }- N7 L& A0 v" K& gunsigned int count_copy = 0;
* R2 X; O/ W8 w+ S
' x! y- [, J) e7 O( q
9 }0 l |% }7 ]' a) H; H/ [1 Jint main()/ H' Q1 c& N6 v" ^
{
, y+ j8 b& _# Z& N% x pRX_MSG_PROTOCOL pshreRAM = NULL;
6 e& ^& @' O' I7 T! y6 o" T! B3 W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! a3 ~) R" L) C# m7 |- ^2 \" l; Z, p( }
while(1)6 e% z0 A; u) j W1 i
{
" t: f" k) U ?; P$ O$ n$ L read_MSG_buffer(pshreRAM);! h$ N2 F5 c5 b; Y. h2 ]
} . w( Q, A5 I" w0 R* D
}$ e! f5 D: B, }4 ?8 D
! [3 q( i3 q; p' r1 \' @* A0 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" I" V+ ~ J8 K
{4 R1 e; ?' u. g& H1 @& r( d
RX_MSG_PROTOCOL buf;
- |: D/ W( y% n. j6 ]
6 y! f# I# h- _4 K% ~2 I buf.a = pshreRAM->a;- w* a3 ~+ C9 q
buf.b = pshreRAM->b;
/ _% v# n- }2 |5 c. c% A buf.packet_cout = pshreRAM->packet_cout;( G/ G% `' |7 {- Z8 N' O& Q
% T/ s! U' D3 S: d- r% e
if(buf.packet_cout != count_copy)
! t* U0 r6 a6 G, B# {/ v0 T {
4 e/ A" C. [5 x" F$ A4 u printf("a is %d\n", buf.a);9 t6 T* b, |: R' O' n4 ?# W
printf("b is %d\n", buf.b);( P( D8 _ H W5 Y( k' I0 J
printf("count is %d\n", buf.packet_cout);
; e/ O" }: k0 Y8 q0 i/ l count_copy = buf.packet_cout;
6 n: r `4 [+ o* Z }* @* O y. q+ a2 |: |
else
* t6 |9 _8 f# H6 g4 w4 b, _ {
& [) Z9 j% O% i. U2 c printf("No effective message!");
* r( \$ r) ^3 ^( W6 e0 C$ k }$ B; k( c, Q( q
}
+ c( e: ^, S3 |% G" g5 e% S& P
. k# j4 Y8 n0 C9 s! o7 V$ Q
& ?/ T# @5 H! ^: ?' a! F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% t; t) W# B7 k* J; Z) U使用下面代码,对内存使用了mmap函数后:
( h/ q& C; R( g% t#include <stdio.h>
& n8 k) g5 D) c# t$ W& L- @#include <unistd.h>
. V" s1 Y0 g* L( R; w. K+ E#include <sys/mman.h>0 [& h& A- L% h0 I, J
#include <sys/types.h>
" g! u0 A2 ^- X: L$ g& W L#include <fcntl.h>5 W! v9 y+ J$ h2 o
8 ^1 i- z; u/ q; m3 k" F+ r- L' `
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 @( p6 Q+ v4 `7 y$ r8 x; {# x#define SHAER_RAM_SIZE (0x20000)
_$ }# h2 T1 u; K, G o$ D2 b
+ `8 p' c! [! k+ Atypedef struct
% N3 c4 Q0 t& ~! h{
) i a1 b3 q! L8 [& p5 `+ u" m unsigned int a;; E, z6 ^9 t5 C' B+ W3 @" c8 G
unsigned int b;
) ^0 w" `5 _* {) K6 R unsigned int packet_cout;0 n$ b3 o) b& f% G- G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E3 |: v7 T' b* X8 b/ s- [, R* n
4 y. {! a4 F9 Y: V/ `/ F0 o2 xvoid read_MSG_buffer(int *baseaddr);
& n7 I" N- A, A9 R/ g, _( vunsigned int count_copy = 0;' H$ y+ n4 ?( V( g4 }# t
- [3 o' f) x: i) gint main()
) f- t) A/ [; }, O* z{
3 ^3 X/ S ]5 p2 E/ ? int fd;
( i" D! Z9 |; I U' r$ l, u& B int *mem = NULL;& ?( O& ^. f% u
6 [7 q/ K$ `7 v; {" U if((fd = open("/dev/mem", O_RDWR)) <0)
3 y& l {, l- G/ S {* D5 Q1 A# k% W* N9 Z4 f6 k. {; r
perror("open error");
$ a/ R- O( S3 h) ?& ?# T return -1;; |$ l0 ^8 |* ]- D# ^
}
; n j2 i$ n; c$ J : \# b5 Z/ Q' J* `( N1 Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% ?8 I# V: a5 K/ m. G0 B
: G# `4 R2 g: Q* l+ e7 ~8 G+ J+ Z' d while(1)
Y: v+ j4 K6 ~" @0 t {+ T2 O% @% b5 C) n
read_MSG_buffer(mem);
& D6 Y- \5 h: |% ^ ] }
5 p, b" d" I% m}
1 C5 f" X2 z* }* T9 x* D
$ u; q" L- `" I. E1 Yvoid read_MSG_buffer(int *baseaddr)
# g$ C$ g) ~, @7 h0 Q) m4 |{
$ ]" v0 `5 P& H/ g3 F& N+ O pRX_MSG_PROTOCOL pshreRAM = NULL;+ O, h. f/ B+ c! S( l5 I1 w7 C) Z7 O( D
" {: c) R9 B0 c2 z* f: x! q- |& Z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ Z* u. B) ^- k: t
( G9 Z/ U5 |! ?6 _0 \2 _
if(pshreRAM->packet_cout != count_copy)% i( y, A! @* r( ^3 q4 V2 i
{
- V" C# e0 w* ^, x$ N: g printf("a is %d\n", pshreRAM->a);
; i/ p c+ w0 m5 Y printf("b is %d\n", pshreRAM->b);8 l' m8 z8 F' O9 F& a" o9 C: t
printf("count is %d\n", pshreRAM->packet_cout); ^) [8 e2 z% ^- V, c0 d3 |6 @) L
count_copy = pshreRAM->packet_cout;3 \: L" O& c% z! o$ V( U7 y
}" Q$ z9 a. O' ^6 G- ?1 \
else( y# L4 I1 q2 P2 H% z) w* N- \
{0 W. I1 Z9 O, ?* @. \
printf("No effective message!\n");. A7 P% g4 e5 i2 J. ^
}" [0 }' Q# \/ m0 F( D% z
}
4 g, k. T1 D! Q* p4 f9 Y- ]. L$ H4 P. ?0 ~. Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? g4 i( C/ I- J" L( N5 ^+ y; K0 \
( n. x4 V3 v: |1 V* J& `
K8 O6 t7 v; b: P% E
% d! E8 p$ t& X3 Y$ i
' F8 Y1 d4 ~* P6 y+ h1 }; h B |
|