|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 i! A; Y2 ]: m+ k
' ~! z1 r, S( s/ ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 z& k l+ ^0 E#include <unistd.h>( _! @& O' T) f: u$ z% x) ~% L
#include <sys/mman.h>- G: x# K7 \5 i
#include <sys/types.h>
2 j8 D: t1 \3 j& O1 O, e' B#include <fcntl.h>
1 Q5 i. J. W; D" \
: }3 A5 P) f, m5 P#define SHAER_RAM_BASE_ADDR (0x80000000)
) l& d, F W% K2 h" z% R. t1 d; r
( d) k# {, |; w5 A$ M5 z1 dtypedef struct% b# L6 [+ M/ n: V# @* g
{
) n1 I# f# W( C6 w& _ unsigned int a;
1 V a9 U% t& f9 ^3 @" t" R3 I1 J unsigned int b; B" q( R0 {* x5 _" K6 m7 P
unsigned int packet_cout;
. W: z# |+ G* E- n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; q X9 d5 r/ W$ G( P- M/ X
- u5 t& o* ?+ y6 a& @/ d, A' L0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 y% q% F0 Z. X* N: y
unsigned int count_copy = 0;: C3 ?! |: ^' ^, w: {4 a
5 r5 Y$ |% N3 `; `9 T: B
' m( n+ g" a2 O: Dint main()
G0 N7 u6 f- [3 {5 X{) D& E% L7 Q+ H
pRX_MSG_PROTOCOL pshreRAM = NULL;+ C1 u! t( y; [% X* K# w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: R4 `2 {! Z$ v& H. y b2 H( o' d2 Q8 h4 F; ]: r" E/ {* M$ n
while(1)- B- I6 i: |4 `$ F3 _' i
{
0 D9 L7 |* E( s M read_MSG_buffer(pshreRAM);
' Y6 V, Q# a" y1 S9 H } ) d: M) i# |% R# C6 b) r, r7 Z
}
1 E/ u' L9 k; H3 d- x/ K7 w
0 Z* |, }) O4 j: K5 V; Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 k: g/ c) p' [
{5 O; g( B X/ ^, g: g3 V* d& ?0 U
RX_MSG_PROTOCOL buf;7 C9 l0 {4 L0 t( u
) t$ z0 E2 Z: v$ L buf.a = pshreRAM->a;4 t5 K( t; v2 ?1 C6 ]4 Z% }
buf.b = pshreRAM->b;
% H& l) Q8 [+ P1 @) Z7 V buf.packet_cout = pshreRAM->packet_cout;
4 E5 r7 W8 w1 e7 Q8 ^ * v- {# l& y) U4 h
if(buf.packet_cout != count_copy)2 I. {8 L6 G5 J0 Z/ X
{
8 X0 v/ `# V& f' N! h printf("a is %d\n", buf.a);9 l2 y, i" J! ?. ~8 ]# J/ Z4 ?) ?
printf("b is %d\n", buf.b);
9 B% E" g, H v6 x. z+ i1 m printf("count is %d\n", buf.packet_cout); i; J5 d$ e( Z5 e( S2 B V( ~1 m4 N
count_copy = buf.packet_cout;
* F3 W8 Z M& B/ f' K. B! _ }
! s7 g/ i" W4 t, G9 A& b' G& ^" ]+ W else4 s$ a+ r$ M0 ?7 Q6 e+ G# J$ @1 `
{
" S3 b c# ?4 I$ T% j3 V) ], ~! | printf("No effective message!");
! s: I" H% A4 G* L, ]+ k }
9 F$ S' T1 r) v3 ^}# q: c1 Y1 c, J! @' @
8 z: s/ a [- B$ t/ V8 d. w! L8 [* P" ^) w. x% d( ?7 n0 ^ B. B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 Z3 L) ~0 @. b9 U, }: f. H
使用下面代码,对内存使用了mmap函数后:. i% A6 Q6 E! f) V2 [
#include <stdio.h>
$ X0 w' u* O* a#include <unistd.h>
6 z" |5 P8 @& A% ~7 Y: W#include <sys/mman.h>
; g* K {, W! Q& k" S" C#include <sys/types.h>- l V! Z. Z. e* m* @- f! C
#include <fcntl.h>" ], c9 h) L& a( x9 r
f! Y/ v) H6 N+ f, {
#define SHAER_RAM_BASE_ADDR (0x80000000): ?2 J+ V9 U( c j3 \3 J% Z* s. a
#define SHAER_RAM_SIZE (0x20000)
9 d! ~5 V* A1 ]& S$ {, X' z( \; h4 p" Q! P. x1 d0 d% j" J
typedef struct8 }! v8 {( Z. p- Q# W
{8 {6 S3 T7 `8 m" w3 ~+ X5 O
unsigned int a;; D3 W9 B3 t6 A: r; Q! |3 W
unsigned int b;
5 Q* e3 p) c3 J0 A& y! N& D$ ?: { unsigned int packet_cout;& v& I O1 H% @) ]+ t& [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, \; a) \' {! C
% q6 Q; ?- c" @& o$ R4 [+ Pvoid read_MSG_buffer(int *baseaddr);6 B. C9 K ^# X- C/ \5 l
unsigned int count_copy = 0;
! ^/ Z$ F: Z; f$ Q
5 D K4 m. o1 e7 xint main()" p: f* X$ B, q3 @, \2 G7 B
{! F: [, k$ Y9 |2 C: d& o! a
int fd;
# E' k/ F% ]; D4 G" L9 K* y int *mem = NULL;
- b# L$ L; k. M& H6 y' {+ [" g! D+ F) B4 n
if((fd = open("/dev/mem", O_RDWR)) <0)
4 W) t3 p; V7 E. N0 p6 s {+ \. n# o' _" F& P9 J7 S3 F2 B
perror("open error");5 E- x+ r) ~+ t0 ^' o
return -1;
) Q" R2 K! a5 u }4 P" r3 b4 s y9 u/ X: c
& X9 [9 y: o$ u! E8 \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 C2 ^, F" T* u7 i$ S( p: I& x! h
& B( v! l+ x8 |/ ~7 L while(1)
8 D' D4 u$ `3 F" U& a {; y; S& X9 J1 O Q& X( Q6 P/ M
read_MSG_buffer(mem);
3 B/ b$ l, i2 c. d6 d7 e' Y }
* a# j# e" O2 E( P' r" b}
5 m8 W3 a' [2 ?9 w
% j4 C/ E" x3 f7 U, tvoid read_MSG_buffer(int *baseaddr)
5 N' J9 A* R! n6 _4 \ z{
U. I/ m% J$ F9 n# k) `" k pRX_MSG_PROTOCOL pshreRAM = NULL;
; y" ^* M, v5 h* Z" X& s; t) Q0 U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) t: H. f8 P0 T
. ~/ W6 I# m; t7 p if(pshreRAM->packet_cout != count_copy); ^" n, n* @: _1 V# n9 l. y2 W
{) ^6 _, N8 Z% I5 K9 z2 i7 h9 j
printf("a is %d\n", pshreRAM->a);
( `8 F0 ?' p( R$ ?$ F2 h, V printf("b is %d\n", pshreRAM->b);8 O( J9 c( M) u7 d8 W5 s: g$ \
printf("count is %d\n", pshreRAM->packet_cout);
5 y- V1 Y& p' \- A- x count_copy = pshreRAM->packet_cout;1 X- Y. l1 h6 n9 ^! {& x
}
# B, D" a8 T+ @ else
1 V% a, t& k2 O& l( c {
) U% G: I( v( \7 K, v0 @2 \9 e2 a @ printf("No effective message!\n");) j9 f3 |: |3 N4 t- u1 w
}
0 c& u9 S, ^5 C/ k}3 H9 h* b* i8 V+ f8 G, J
- B, D5 y) w$ z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 F0 m3 K0 Z& ~9 s. F; K: x
6 X: L# j: q: } [5 i# g# \: k+ S
0 Q$ i+ s- c( P. |5 x+ Q
$ ~, s, I% Y; l4 x2 i0 L. P
|
|