|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 t! O {5 Y1 }" F1 z
9 h1 b9 e4 f) _7 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- u% h! }: ]) r2 U! _; p
#include <unistd.h>' }0 D5 r2 T6 C* c4 e
#include <sys/mman.h>
$ y/ q' _4 E, A9 X( b#include <sys/types.h>
4 |7 G2 C- {. i9 X G' k6 ~#include <fcntl.h>
& } t: T+ l" F$ b6 T, U& t* }$ b A. E
#define SHAER_RAM_BASE_ADDR (0x80000000) 5 l5 b* k) b, D6 M1 W
! _1 Y2 [& F2 W9 c4 w1 }% H itypedef struct% S5 u9 e6 L! A; Y
{# a) Z- L+ F0 F; I) P4 d
unsigned int a;
& D. y1 P) V; Z1 Z+ J& ]0 C unsigned int b;
/ V# `; p) v( c+ v9 W4 z9 P- v9 B8 L unsigned int packet_cout;' W, V; a' a" p/ s# j1 K: F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) Z9 ^5 x8 n* r9 i6 O& D
& @5 {, F9 `9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) d. F! e' N" ~$ N& X0 Uunsigned int count_copy = 0;5 Y' D% I0 F# }+ I: D
- a1 s8 C2 f: ?( Y* [2 a
% A- K. F4 J1 }8 A4 B+ U- n: qint main()2 H$ k, I8 ]2 A9 h8 O/ k' |8 D# a
{7 e' t/ S) D( N+ _- W' ?
pRX_MSG_PROTOCOL pshreRAM = NULL;: x: n( s- B6 ?" V" @" B. {2 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 M+ L* l" A) b/ `' c: |. y+ f
1 o7 l/ C% F5 L+ _" Z: D+ l7 D while(1)
+ A% @! M* q ]) z. M {/ y/ g6 v* k g: o: H$ @6 z% ^8 l
read_MSG_buffer(pshreRAM);% E3 _& X" f8 T7 M6 A
} # K- |) n3 J0 S0 k6 N, C
}+ F2 U3 b" S# [& B' V! L1 S! Q( Z
8 G! m/ r$ ^) U) _& g3 d7 K5 C |* Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 h4 W0 C" {% X8 F4 a4 f
{
8 b: b- @- Z: n* @% T1 b5 S9 L& l+ ~ RX_MSG_PROTOCOL buf;
8 q& s& }+ y. }
) y. ?6 d- J+ ?2 G( f! h- z0 \ buf.a = pshreRAM->a;
" |* q+ d% n( U, N: s buf.b = pshreRAM->b;! D0 L7 \- {, h7 e9 ~7 E! H' `: ~
buf.packet_cout = pshreRAM->packet_cout;+ U! ?; |+ y- k( ]9 A9 v0 w+ {; c
0 ^% A! t9 e) J8 Y8 A6 |
if(buf.packet_cout != count_copy) R( ?' g6 N5 c- P7 s1 u
{
9 [ R; D) ~- g. i. a' g, x printf("a is %d\n", buf.a);9 j- R$ X, x% X" [ m9 G5 Q5 U
printf("b is %d\n", buf.b);
! ~5 I! h A5 b+ | printf("count is %d\n", buf.packet_cout);
6 f7 u/ s/ ^3 Z9 | count_copy = buf.packet_cout;
# i) s. {3 | V$ u }+ t; v' R0 b0 \. d5 m2 F
else
" l4 Q2 T0 u' ^# e% W: T) T8 a( D2 v {, _( S; s: r$ H6 d( I
printf("No effective message!");
& E+ g3 F' Y1 `( Z }# E$ b* l: t( U
}* g0 e1 [) [: ]! t; r
; b/ y2 a$ s& d$ I, g: q/ A# K7 V8 k9 f- X0 ^; E) w3 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 c, E& f( _6 O8 O使用下面代码,对内存使用了mmap函数后:
8 `- _# x a3 w#include <stdio.h>
6 A3 l! G1 I1 C, B9 D8 c K- x' D#include <unistd.h> m- F: v0 y4 ~. f, p3 O! u
#include <sys/mman.h>
* E$ L* u' E4 l% R9 T5 s#include <sys/types.h>, {4 o) E7 J' | Y# G4 s4 \
#include <fcntl.h>7 ?- a( G9 E! R$ U4 ]6 l
$ `7 x8 C9 f, R& U0 [2 p( F h
#define SHAER_RAM_BASE_ADDR (0x80000000); Q- P, V- o, A9 U1 m5 R6 `2 v
#define SHAER_RAM_SIZE (0x20000)
' C3 s$ ]( h" y7 ^7 ?
. t: W+ r2 f {0 U5 Xtypedef struct
+ }' L( ~" b& n{
* j" b( x' x7 z9 ] unsigned int a;" _; p& G+ E5 A. f; \
unsigned int b;
6 y: l! r& R8 u% X! x unsigned int packet_cout;
% p6 G6 @7 r) f/ ?. O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% X7 z- k2 f' l. i% L* s
* H3 s# G5 o2 nvoid read_MSG_buffer(int *baseaddr);
5 J1 ]0 u, j$ v Aunsigned int count_copy = 0;$ O! `9 F% P8 X3 U# R) g
' r2 a! _- i. V6 C- ^" |0 o# Tint main()0 ]( l. B8 C1 V; Q$ K
{
- J" B- g: e9 E" L$ l0 i/ C int fd;0 l* `1 u. B3 o5 c
int *mem = NULL;
6 U# n0 a, t2 U' U
+ l! }5 e4 B5 D: ~% S! m% a if((fd = open("/dev/mem", O_RDWR)) <0)( [4 |, Z% F; X' g
{
1 K/ Q% R5 N3 A( w/ y, z2 R perror("open error");
+ ~3 u% @& j% H# m! [. Y& c return -1;
3 v6 u) f* {2 I- t }
; F* E/ f5 ?) h, d9 R6 R# T2 u # m# q# n& e; X/ @& s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: {* K3 T, o) R9 M1 q3 J4 \; l. F( E" W
while(1)3 k! c" l/ n: Z5 O; i
{1 k4 o' C, f/ a: k2 A
read_MSG_buffer(mem);. A5 v4 t7 t3 I% |
}
+ y1 d* g8 Y2 M* j}
7 N. }5 c c, o5 M4 }# W1 z0 ?6 B$ V0 H4 |
void read_MSG_buffer(int *baseaddr)! Z# u, z0 v5 e" x
{' N1 p' B% q' w: H
pRX_MSG_PROTOCOL pshreRAM = NULL;9 J. i# e( g" y! Y
6 q4 |5 F: K$ t6 U' |4 I5 b2 t, s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) o& X3 h. k' I2 [# e- t& E" H
) b; _; {. m; L if(pshreRAM->packet_cout != count_copy)0 k. K; `2 q" Q1 J5 _
{
* u) @9 w! s+ M7 ^$ }/ Z/ d, s1 Q printf("a is %d\n", pshreRAM->a);, }8 F. `# ^2 t, p- i
printf("b is %d\n", pshreRAM->b);
3 l- ~+ E6 q B9 m printf("count is %d\n", pshreRAM->packet_cout);) O. G# Y' |5 M- X- m7 Z
count_copy = pshreRAM->packet_cout;
! y3 @8 k) ~6 J& m }
+ K* i1 Y8 Z' C, Y& n- { else4 v' H- e' n0 j: c) u. P
{% q5 W* P+ b. g/ D
printf("No effective message!\n");
, Z9 n( c+ Y6 i }: V' q W5 @ [: H U, d
}
: w0 t# O; [$ d. ~( h# e9 y( R# b" H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( k/ ]3 o: V1 l- W7 B
: T. L3 E$ M. G. B9 A7 h
9 y1 d6 J/ Q4 s' d# S8 r. G2 l& K9 W9 J
1 e, ]/ f8 q u
|
|