|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 |( A/ ^' ]. g
`9 R! f* T. s; FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 Q- c1 b$ ?. J) U8 M
#include <unistd.h>+ _* S) U5 j3 g3 i# \
#include <sys/mman.h>
0 Q) n2 o7 E: m5 [#include <sys/types.h>8 o: }7 \8 c7 ~/ g7 }
#include <fcntl.h>% @+ S; A8 `! W$ t% G0 _% ^
) s7 x/ r9 r, e
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 _5 u6 z4 N$ a( [( k' k
) m; R) a* ~7 _) }& o1 Btypedef struct
; z3 j# |' c: j" i q* V$ D{
+ z# i y \( a5 B7 |) i unsigned int a;
7 {2 W3 t# l* x8 G" W+ `$ W unsigned int b;
! W/ _' f2 _* ^1 d9 V5 m9 u6 g unsigned int packet_cout;; ~ H7 h3 c* R1 J. u' r% t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( \# `/ ^+ o/ v
, _, G1 E% M0 b+ I6 G' q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* Q, k& Z! L& P$ W* g6 i( X) B, D
unsigned int count_copy = 0;2 o7 w; e# k% U0 ?" x1 H
( Y% `2 k, @5 \
5 |6 N# m! ^- X q
int main()$ C6 ]( H$ I- L" l1 |( d
{5 W" L' i* F+ s
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ J! d. G' D' f: n0 O/ q pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; m8 X) u- j/ W& Z+ v5 c3 n
, q B+ F1 r; `. f
while(1), ?# r& Y, s! D6 r
{1 t K* I z* R7 S5 S& ~
read_MSG_buffer(pshreRAM);0 R& j8 A# ~7 R* d1 l' Q
} 8 z. P$ Y. a" `4 f* p
}/ A2 O0 S& c) }# A+ L
. m' P* @( A9 D6 P+ yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, p) f; p& l" N: p$ f' k{& J) g+ d+ q" H
RX_MSG_PROTOCOL buf;
; Z, g8 v, S% y3 K/ y7 w; v6 R # f6 T1 L$ f: @( @
buf.a = pshreRAM->a;* D1 j! A) H& d! a. c
buf.b = pshreRAM->b;8 l/ K$ n, X6 r& t
buf.packet_cout = pshreRAM->packet_cout;# D' z6 s! B1 X' A+ w+ a$ j5 J
5 l9 s+ @( s# p( ^, \
if(buf.packet_cout != count_copy). x4 i) l$ J% n
{
( J# Y( r3 \2 \6 [" c s printf("a is %d\n", buf.a);
% p7 M+ q# F, u printf("b is %d\n", buf.b);& X) ~$ }6 m. W% P* @: ]
printf("count is %d\n", buf.packet_cout);3 R- A" `8 p+ }5 Y
count_copy = buf.packet_cout;5 V1 ?, o' e3 e( u* c3 e n
}
5 L- J" X* c6 D else
4 f9 Y; f% q3 N7 H {
8 |9 [- s# o6 r# u# s- y printf("No effective message!");
. G O+ K! t. ^ }
; \( R/ e v! r+ f0 f# B}0 t( {7 l$ O" z/ P3 h, J: X9 b: Q
' L1 b S- g& S+ C, @/ S$ ?- h2 W, j Y1 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! a% C+ G9 t8 |1 j# m n& e使用下面代码,对内存使用了mmap函数后:
7 ^% b# h7 t' q9 {/ {" L+ t' U#include <stdio.h>
) S6 u# ]. L1 s- H8 M#include <unistd.h>& k9 r2 } @# J4 E" F
#include <sys/mman.h>2 r5 f( Z, s- l3 K/ V
#include <sys/types.h>8 D$ W9 c& s4 }: @' N& w# Y
#include <fcntl.h>
4 ~ h9 O# {% X H9 Q4 ?+ I* W* C$ m! N x v
#define SHAER_RAM_BASE_ADDR (0x80000000)9 q8 T8 \6 z4 q. @2 B
#define SHAER_RAM_SIZE (0x20000)
- p; x0 l0 t/ d' |2 U2 U
: ?' V7 _2 z5 `4 D5 O) s. [$ Etypedef struct! ]$ x" M; l& C* R* U+ n$ ~* P
{
5 [* J$ F2 W1 x unsigned int a;$ h+ B! y4 k- b$ C. ` }
unsigned int b;
" ^2 y: }/ Z1 J1 @9 h6 s, |7 S unsigned int packet_cout;
6 d L% j4 x' d7 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ W) k- m K" O2 ]2 V
) C3 K+ [/ V. ]5 c. h; a6 _$ Bvoid read_MSG_buffer(int *baseaddr);
: w+ l3 W$ b8 U3 h0 vunsigned int count_copy = 0;; i3 n& G1 n* ]$ ], r
0 y) N6 @) C9 ?; z. _2 fint main() y& {# U. T$ B) p! F/ j4 W9 g# |3 |
{
E: Y. B7 ~' z& H+ U" z int fd;; d* y9 [# q% Y% H! m$ b
int *mem = NULL;
7 Z3 s% s/ v& n$ k
5 Z+ t0 w( }4 X* X if((fd = open("/dev/mem", O_RDWR)) <0)% w5 v5 d9 L! h
{' n( o3 h& {& \5 W' O* `" Z
perror("open error");7 |1 x# m6 Q) ]! ^2 ?: ^+ R! a1 R
return -1;8 W0 ^% E) C/ V/ v/ Y' [& l
}
" ~. u9 I8 i+ `) p& Q % c2 }/ Z5 }7 w% l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 X7 P% f5 G1 Q: d
4 F) v# n! F" M( I, Z5 N4 `
while(1). W! ^3 L' v6 O6 O2 J
{4 ?2 `. H" V1 u) s) j
read_MSG_buffer(mem);4 t% a+ v. M/ B
}
- N0 F% D6 N2 ^# s/ i. Z! R) ]. i}
! ?7 ? T$ R3 z) @& I; A- A( ^: V- k* _: p8 R# b9 N
void read_MSG_buffer(int *baseaddr)( d9 G* ^' p9 v' l1 E u
{! [$ v9 {1 i. J: i( a
pRX_MSG_PROTOCOL pshreRAM = NULL;
T. c& Y0 n0 Q/ k b* N( `
$ q" f, O7 _' \ f! N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, X5 o5 q# F7 _
! { I. `& M9 J f3 | if(pshreRAM->packet_cout != count_copy)6 ]' J" P1 Z! E/ |
{
# z8 ]& L3 `. Q! i printf("a is %d\n", pshreRAM->a);. k2 ?3 L1 l3 h& f/ c
printf("b is %d\n", pshreRAM->b);: F# ^3 C! d$ U. P5 R
printf("count is %d\n", pshreRAM->packet_cout);
* A/ G( a4 F0 Z( c0 \ count_copy = pshreRAM->packet_cout;* X& u' A8 s4 u1 x# _1 z
}
; c. t( Q+ J/ L2 n O5 n- P- Q: G else2 Z4 u( p( p/ P! ^2 F- w
{+ i) X, t# L+ ?5 ^" j
printf("No effective message!\n");
0 c6 Y. l' P2 [) v+ l) {. s }$ z( ^7 B+ W! N# `6 w* {) L
}) |7 k6 `) U6 I5 }- {- B
: a" x' S% u$ o7 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 k' N2 {+ A }
7 x( R# k9 }- o' `
; V3 m6 T7 z% @0 i2 M$ i6 Q+ b
0 E2 _3 M# ]/ A3 I/ d& f1 |: ^: S3 j, A. a
|
|