|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : ~% ^5 y- X3 v5 ^( z
. I7 x) {2 L5 c, @! ^' s6 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, }) C9 x( m: H3 v* K#include <unistd.h># r" U! f* k; K! K9 Y- r
#include <sys/mman.h>
, n I. Q( v/ P; |- K% v# w4 W#include <sys/types.h>
B8 ^+ F+ s2 p#include <fcntl.h>
& ^6 y& I" z9 f6 X
7 ?. l& H0 H- y, E, ^0 q' W0 m#define SHAER_RAM_BASE_ADDR (0x80000000)
% c4 c' B0 s1 B( l; G5 o" R
% H1 l" A; c5 r# ~- V& p Ktypedef struct8 y! y* _* Y+ o7 Z! K
{) T, G2 f& A6 F' _$ ]! G" n3 N
unsigned int a;
- Q# I& m4 X( H# p unsigned int b;
9 @ ]1 m4 H- o3 E& g unsigned int packet_cout;
h- d/ A/ d/ N: V: C* ?" F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' P( v, M* a: P" Y) Z" N8 l# m4 s2 [& p# j! a( p0 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- n% x) z5 q" f
unsigned int count_copy = 0;. U: y0 ^, h0 P2 I2 n) [
$ |( S! l& e: U4 Z: q" m9 ~6 v9 O$ _4 P% R
int main()! G, h7 d+ }2 j( b& |
{
$ E) Y3 p$ ^+ s4 R2 g# _9 v0 y' v" | pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J" d) y( F( S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- `5 D4 b1 _% h& |0 v9 l
& b0 C# l: V; a( o- z- h ~6 N while(1)1 D! G* }; `" O7 b" k( A
{' X6 J" H+ u1 z5 o; u
read_MSG_buffer(pshreRAM);
# i* d2 d. i( k0 X3 Y } % c! y( p. c7 N6 l
}" q: N; i( k' ^8 U
( z/ C" t9 o. Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): `$ d. }1 H+ }( d. d; k
{
& z8 ]) K6 H. K. M1 P" a RX_MSG_PROTOCOL buf;
1 n: u l, ?4 W
: M5 K2 G0 y0 }8 ^$ ?5 Q buf.a = pshreRAM->a;; r, G/ e# s. G) E1 p d- P7 x3 S
buf.b = pshreRAM->b;
) K: s+ j, _+ W4 t3 _ buf.packet_cout = pshreRAM->packet_cout;
; t, {# y' }) O: c$ p4 `1 A E+ Q6 N7 V! {" s/ Z2 {
if(buf.packet_cout != count_copy)
# }2 f# T7 {0 e9 U; S2 k, \, l {
3 O# n5 \8 \# a' ]4 ] printf("a is %d\n", buf.a);& x2 Z& o( B: U* z
printf("b is %d\n", buf.b);
, D" ^3 e U$ i5 J2 K printf("count is %d\n", buf.packet_cout);
3 k# H( q" O( V- i( D9 s count_copy = buf.packet_cout;
' r9 w4 U1 M! j W ?2 r6 ^ }
( T( ]" d4 c" C8 S4 d else- g' o1 q! M+ d# n& s
{
- o8 _& c6 s) m5 w- r* v printf("No effective message!");1 s# _4 A1 F2 l H
}( p6 G; M8 |. N( Z2 ?1 x
}
. [8 h! c& H2 _0 f' ^2 d4 J
3 k- Q8 Y! H8 f& Z. W6 U" `3 @# Y3 w: I; H$ r; r8 j8 k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 @+ f3 _! S( r0 c |
使用下面代码,对内存使用了mmap函数后:8 T" {; H/ l' T$ m% I/ S7 e' q
#include <stdio.h>
3 |/ U% u' q5 a) a#include <unistd.h>
. n5 A/ M. ~* P' J7 N#include <sys/mman.h>, j1 h3 o- q" \: z
#include <sys/types.h>
8 b# `: r/ O; H) g#include <fcntl.h>* T, z& D5 t" w, j
: k( I, h. P2 A; J) R9 Z#define SHAER_RAM_BASE_ADDR (0x80000000)1 K0 f5 }" M/ {: @3 z& s9 X
#define SHAER_RAM_SIZE (0x20000)
A1 Y0 x' Z6 E9 G4 ]7 } q: \6 x% I* w+ C: O/ j
typedef struct8 T* K% X7 i. i! X
{1 J5 ~* q) x/ n e
unsigned int a;- [1 D; U8 S6 R9 r$ f2 b: T
unsigned int b;" h) J1 I6 A! X- w/ K0 ]8 D. d
unsigned int packet_cout;; _) F( {0 s. w% ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) R( C! j/ x3 ?2 W: G
8 t. M$ {3 S# {$ ~2 `* h
void read_MSG_buffer(int *baseaddr);. Y0 |# w3 _0 J
unsigned int count_copy = 0;" G; c' m0 j2 v$ _
% T" j8 U* ~4 k( p
int main()) ^; n e# o P& W3 f d, q* w
{ f' }: H0 G" `% W
int fd;! B8 t7 X& o+ V. l0 a
int *mem = NULL;
/ {6 ^7 I0 _! [- ^1 w. H' y
: B% V- [- T' C3 l. ]( ]0 B if((fd = open("/dev/mem", O_RDWR)) <0)7 s" n M, H9 c7 ?, u
{
, m+ x' z4 Q( v( ] perror("open error");
! s6 c3 i& `& P return -1;; Q% {* s7 n! S" Y
}
N, u* @2 ?0 \- N1 z8 D
+ H+ v, _# z# B& A) R6 n1 e; N mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 \3 |9 ~( l: X5 r& i
5 P" ?1 ?2 t* S while(1)
, _: l% R) C$ v5 d {
, V; |! E7 @9 F$ p6 k3 m read_MSG_buffer(mem);
7 f) x: b! V* ^2 p4 D } ( k* Y1 ~- Y' x. k8 M
}4 Z4 u u4 z6 o- I
' M( @# E) |) j' Q: d- E/ n
void read_MSG_buffer(int *baseaddr)
4 e4 J8 _3 X+ A{8 ]1 g9 A& s: C4 @4 e2 r
pRX_MSG_PROTOCOL pshreRAM = NULL;
. J: {4 r8 K \8 N+ I, b5 \+ I
7 ?0 P) x! I" c pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. Q$ u7 c# F; L3 Y
2 s2 F) p2 a4 H: z2 t" M if(pshreRAM->packet_cout != count_copy)
4 C; F) f1 o/ \: X: A. B1 o6 P" K, o0 s {/ s9 n& _; O/ e% f& Z5 K% a
printf("a is %d\n", pshreRAM->a);( N$ }2 K# \5 s0 {7 D
printf("b is %d\n", pshreRAM->b);" f4 [; b! {- K2 p9 V9 S
printf("count is %d\n", pshreRAM->packet_cout);
! q. b% L1 y# W. X$ s z count_copy = pshreRAM->packet_cout;
5 X4 L6 A; b/ k0 C& u* U, Y+ b. T }
9 }- ^4 P ~- j R' L8 ?" R else+ ~4 W. Z9 @: [4 ?
{5 ^2 r d }% N% R6 ]1 b
printf("No effective message!\n");
/ t0 e' N! N; G' z4 ^' S7 b+ K) J7 @ }% l% K% n2 v5 V, ^5 ^
}3 u" h$ b2 c. f& i6 C
) y6 v" C" Y+ ~ q" n& y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 X# m9 Q# b5 @3 K9 l# b" N; a% c" n: z8 p. s8 N2 F7 V* `
+ G2 W, w* X; Z8 P
! w& I" T1 d6 ]7 z2 a% F
1 V0 i4 y7 p, U8 l
|
|