嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 x) q. W- ~& d2 F/ p$ H8 b& k

8 A3 t$ W: R1 q4 l; {$ w# KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 I8 }3 u- y8 B  N4 [: e
#include <unistd.h>' P/ ]: ~9 D3 W+ E( _7 [+ t
#include <sys/mman.h>$ _% v* ]/ |8 o
#include <sys/types.h>4 r' x9 q3 j) q6 @& I
#include <fcntl.h>- x/ N1 p' X% D6 t6 u

$ B! \+ k; I3 n#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" c5 g. [2 ~3 c0 m/ A+ A( A* p: U% A
typedef struct" ?* j* K! O! E2 ~1 l" w, s$ T6 P. Z6 n
{+ a5 q$ E8 r0 @
        unsigned int a;
- h9 h! b. X, B        unsigned int b;& r6 N0 |, |+ O9 o( e
        unsigned int packet_cout;0 L( J  P6 S3 ]" I- {; G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. }, e& V: x. d# a0 }& U. A; m, Y8 ?9 \0 r5 E7 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  c6 ?( T0 D! }) `% @, B4 D$ l% Q& I
unsigned int count_copy = 0;' ?9 M; j, ?2 v% b/ L) G" ~! u

  X; C' C0 A3 ^3 }! U* a; J3 q9 t$ f( Q+ x+ k
int main()
7 e& A, h, }2 A/ `; m' E{
& i5 f, O$ T" e# o& J" |        pRX_MSG_PROTOCOL pshreRAM = NULL;) j. J4 D: Z% q. {) ?/ J: }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 |6 ?5 q# q4 \2 y

4 h3 L" D6 X0 i% L6 S9 C        while(1)
& E( v  _) w) O2 R        {
% i, {1 B8 o& H( c; |9 X1 Y4 q                read_MSG_buffer(pshreRAM);
0 X# a# q2 D% `, R6 k/ C        }               
; G0 U9 _" T) D, D$ x" V- \+ E8 z; u}
1 g; f! u7 d' ^2 ^  r% N6 I7 o' l( \) W. R& t" i0 L- E/ l. y1 ?  K: H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% ]( C) B$ E* I1 [" }- d
{: b4 S4 B9 q1 C4 W8 Q
        RX_MSG_PROTOCOL buf;! h1 g, G; d5 w- b# {% @, b
        & K: O% j' A0 q9 w( C) A: F
        buf.a = pshreRAM->a;
( f* K9 p! Q7 _: t. E" y! f: T        buf.b = pshreRAM->b;1 x1 }1 o; b2 x2 Y  ~' I
        buf.packet_cout = pshreRAM->packet_cout;7 P% [; b9 r! B4 J; C7 ~
        
2 Y) X9 k6 [. I" E& j        if(buf.packet_cout != count_copy)
$ R; r. y' j+ w  o# j3 I        {% @: |2 A2 m; T1 h) H
                printf("a is %d\n", buf.a);
4 |8 ?. t' x0 u- ?6 V, N2 T4 h* _$ h: ]                printf("b is %d\n", buf.b);
0 i6 R) v7 Y; J; J" s' Q                printf("count is %d\n", buf.packet_cout);
+ \9 G3 P- ^- P) O1 Q                count_copy = buf.packet_cout;, W2 r- c4 c) {; _. N
        }  d5 h, |$ y' x5 r1 C- c; M( t& l
        else8 C/ p6 ~4 m7 c% a1 }. w( o) x
        {& ]; e- ~3 q* r* d5 c7 U8 ^4 d
                printf("No effective message!");/ }; Z- N/ _1 t3 J) n. B" Q
        }8 G' e' ]% q- x- e" n. X  i2 J. w7 B
}6 n! u" w! _3 \: ]/ u( o

5 N3 R% `+ C% g, `! H' I- C
8 z1 d6 }1 U1 R2 b* L$ q2 f; D: ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 R! d8 r' i3 R  x' _7 ^8 |使用下面代码,对内存使用了mmap函数后:7 u6 a+ o4 Z0 Q
#include <stdio.h>6 k2 I$ f5 C7 E4 X. S% U
#include <unistd.h>' [. W- x; Q3 n
#include <sys/mman.h>
& v; Z0 h6 {5 p% V* Z/ a) K% |) t. R2 b#include <sys/types.h>' h2 E& Q" ?4 T' p  o3 d
#include <fcntl.h># j4 }5 b, H( K5 p* m5 {6 L

# Z( E4 b) T, [#define SHAER_RAM_BASE_ADDR    (0x80000000): K, S2 H; w& C
#define SHAER_RAM_SIZE         (0x20000)   
. I0 k0 F* _' C- R9 w' V5 a
* }( a. e4 U' ^  f, {3 t/ dtypedef struct, Y$ w9 w1 \) Q6 V7 z  X2 ^. H" @7 c" D. Z
{
' Y9 y0 }3 u9 N5 U3 _. E3 R4 S8 _        unsigned int a;
$ `. Q; U% n& H9 `5 T% a9 @# d        unsigned int b;9 G% Y  U7 }- i" l  I9 ^3 E- X
        unsigned int packet_cout;; m* o) o' o  x7 @" `1 T9 L# q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 \4 ]: F8 `* N) q1 S8 ?% ~) t# @& L4 E$ G
void read_MSG_buffer(int *baseaddr);
: x0 r" x- J5 Z0 G$ |8 p7 \3 Z* yunsigned int count_copy = 0;
, l) e3 c5 N- N) G  u& a. x6 \8 m- {( z* n  b  v$ m3 _
int main()0 u* P2 Y0 G( [2 _) Z
{6 ~( M: {4 `& V4 G* A, p
        int fd;
! L2 B: d6 i7 u# F/ s. Q9 Y3 |        int *mem = NULL;
, t5 G$ o8 N% K2 H) I' ~9 Y; {+ f+ {
        if((fd = open("/dev/mem", O_RDWR)) <0)
/ C4 i3 y$ i, R: C        {: p$ q2 H- H+ P1 X* _& o. N
                perror("open error");
* v' H/ w3 \2 y$ _8 S* K7 o* [                return -1;# B% p6 [3 n$ }* w' |8 t) F
        }+ T# Q8 h9 Y/ H; t% H& N
        
4 V& |+ a# g) [5 v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 u! [! {+ G% f  v& ]/ {7 B% t1 x& ?6 M3 h2 l
        while(1)5 w8 |4 i  \: `$ M' A& E
        {
4 S* G4 }3 d. p: o                read_MSG_buffer(mem);
3 ]  v9 M6 T+ ^! |! S        }               
; `% W, F; Z. b; P3 J* W# _}* a9 B! i- I; b2 O! F; V) N
& M0 q. @1 p( d- }( X4 p
void read_MSG_buffer(int *baseaddr)
$ ^* q$ }: Z% v% S  j0 R{$ ]/ T. H6 m) X, z; K2 H4 z
        pRX_MSG_PROTOCOL pshreRAM = NULL;( l3 k) K  K% I9 _. E' h0 H
( y" _- `- A$ Q. \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ x+ F0 W- d$ h0 q9 _

$ w. K8 J, L: {& u        if(pshreRAM->packet_cout != count_copy)" ^7 J: d7 \  T( ^. Y
        {2 g- C" }2 t9 y# }* o9 t
                printf("a is %d\n", pshreRAM->a);
8 d% W8 a/ O  ]( U                printf("b is %d\n", pshreRAM->b);! k0 O7 c% ^6 M6 c
                printf("count is %d\n", pshreRAM->packet_cout);% |4 ?9 @- c6 W$ p+ k  R! H5 Y
                count_copy = pshreRAM->packet_cout;
# [' c# [: u/ k# C+ {7 b        }
9 K, ]- P% m8 m$ l2 b        else
/ o, P" Z, ^. X& g8 B" b" x( _! L) M        {* v! D- P1 i8 b
                printf("No effective message!\n");9 W+ D+ l  Q+ ^. M9 U9 e" y. ~& \
        }
) g( }3 w5 }2 z6 M}( z+ t* y4 O2 ~0 M
, i3 O) P+ Q4 k0 x: b: N, J! o, D* g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# ~( s( K" _' A0 C
1 [4 r9 Z- A7 `9 m1 j0 ?
% i' G8 E$ z2 C( _: _9 f- Y/ \' n" V! f! ^, {
6 i2 ?) G; f$ O- J# Z2 L* q





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4