嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) P3 P' Z9 F& }0 S2 Z$ r
1 L, E! B7 |3 C; S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 L$ E# @& T( r& n8 b6 o& |3 ~$ `#include <unistd.h>* H. z+ [' j& u, R6 [8 c
#include <sys/mman.h>6 {' C& T& W& d- a
#include <sys/types.h>
& P5 U4 o' y! t( x4 T$ M#include <fcntl.h>
5 s9 g9 ]: w; E5 q4 t
5 F& D% `. E3 \#define SHAER_RAM_BASE_ADDR    (0x80000000)   - M) u, s* m$ H$ ~& ^! d! H
( i' ]2 b7 u& b" I1 C
typedef struct' V/ `; t* [  J$ h3 p/ A( s
{) }. W% u0 G& K1 H/ P
        unsigned int a;7 o# C" P2 j1 a1 m+ w+ G" W: Q
        unsigned int b;1 ]" V. Y3 b9 a) }* E  a5 [0 A+ u
        unsigned int packet_cout;
' j9 `1 ^  w- d# \% p) h2 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# b  S: i6 L6 g: U/ C
0 l7 p' f5 w$ H3 y- N: P. Y+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# x* A" [, I6 [; m5 A3 F" R, c" }* U/ i8 `unsigned int count_copy = 0;! z' D) }5 |/ a4 O, `/ d; Q7 T( M1 l
/ l2 d! j; e1 c* j* Q9 p  z. S

! c  t; o- A( ~1 i, g  s4 J5 T9 kint main()4 j* `' e5 u4 g/ k( A; c  S  h9 h
{6 y  J- v& f0 }/ ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! t4 g0 _/ i/ P; z5 S+ _3 ~) n3 n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 w; d5 w% {, N* t1 m" ^% Q3 ^  `; f9 }4 z: X
        while(1)" p* I0 P* W+ U; g
        {
  f* p; _7 h+ v6 e3 \7 T" o                read_MSG_buffer(pshreRAM);
. M9 @" v$ z" p6 Q( ~* H        }                , o1 w+ T6 X8 N7 O
}
. s- P: i6 x6 J* Q  P6 \" L# x$ a( U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 w+ x2 I! p4 c0 V
{
8 O: e/ N4 }) e8 o* z: F$ {& K        RX_MSG_PROTOCOL buf;, F3 G- B9 s# w+ X) M0 ~  s+ O. g1 a  d4 V
        1 }/ w' x* ~: b3 b, S
        buf.a = pshreRAM->a;+ }6 g; I6 E% {# C7 M" R
        buf.b = pshreRAM->b;
% Q* ?: ^: p  k  f4 C% t0 Q2 {        buf.packet_cout = pshreRAM->packet_cout;9 l8 \9 q  g- ?/ A
        2 j/ n5 q' m7 b9 W4 v
        if(buf.packet_cout != count_copy)" k- W; r/ d9 u  Q- u3 {
        {
; G' }4 e+ y- D6 E                printf("a is %d\n", buf.a);* L# @; |' B( l6 y9 f* D/ ?
                printf("b is %d\n", buf.b);# S' w  j9 m! t7 f2 ]
                printf("count is %d\n", buf.packet_cout);/ ]/ @3 @3 q# g) J% m) T
                count_copy = buf.packet_cout;
; K" b0 x6 q7 i3 a        }
# g. b3 L2 \( V- _5 c        else
: R  x5 w: p2 b  k) Y- y$ H- i& L        {) a3 O  _7 ]3 J" H& Q" b
                printf("No effective message!");1 K0 y- U$ j0 g+ U4 M' V6 S. Z
        }
$ ]. Q- W) @8 F% H, x1 u}
. c! G, G' S$ `) {, }2 x
% g: }' H  R; r" W, U( q8 N- o3 e3 o0 ?) ]; y9 I: d( N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 k4 D/ a+ N# S6 b  d
使用下面代码,对内存使用了mmap函数后:
8 e; N  A2 N; V#include <stdio.h>/ p3 Y' X# ~4 Z0 \$ ]
#include <unistd.h>2 n+ C6 t$ y1 d6 Y
#include <sys/mman.h>
% I& S. N. {7 h* A* Y& P, Y+ F#include <sys/types.h>2 ~0 w1 V  ?/ _3 q% ]1 L7 I
#include <fcntl.h>
! l$ `( M6 |* e% O9 o' a, t  }! x8 i
#define SHAER_RAM_BASE_ADDR    (0x80000000); r1 x/ `* i- E9 c& P4 @. X5 f0 B
#define SHAER_RAM_SIZE         (0x20000)   / k* c; p" U) a; \9 a7 B7 _  Y

- {) p" M* {) z5 B6 c6 X! o% r# e% c4 [typedef struct5 w7 i) M1 [5 j
{% e( H4 _% T  i( N3 R) Z
        unsigned int a;
* I5 q8 ], C' f0 _        unsigned int b;
) K+ B! l; S, r) u        unsigned int packet_cout;3 C" E& {$ M* @- P- ~, d. B' h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 Q- G- v0 [: Z: G0 ]  n- V4 {7 t# e+ `" \, m- H$ V% o& g$ `
void read_MSG_buffer(int *baseaddr);
& W$ D5 F* n) f+ \$ B' |! c+ m5 funsigned int count_copy = 0;
1 |( v& Z: O( t; f3 U0 r6 B
) ~6 f! R, r" ~) \4 Oint main()
3 D" B+ F1 C; ^2 D* ?# h{
  Y, k, ?- E1 q        int fd;& D" n+ r6 B* p1 f
        int *mem = NULL;
' z; ]# f. g5 D4 A( U  Z1 D% }$ o2 C4 R: R" U4 x
        if((fd = open("/dev/mem", O_RDWR)) <0)" l8 G% K6 O5 N
        {
1 \3 z5 Q. R; a" u                perror("open error");0 B( Y& A; b$ |5 M4 O- K
                return -1;+ M! w$ u2 c! i& k4 a/ @) E2 `9 _
        }8 b; F0 v, g$ K( x
        % _+ W' P! J6 \2 ?0 @1 x1 c
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, E$ F1 O3 g) J9 Z* T) q  R. y0 S, X( S, n) D5 S1 W6 d8 D
        while(1)
! y0 w) Q" e# ?2 X: x- t2 U7 B+ W6 _        {; v/ N( I% x( [4 V1 q& u; [
                read_MSG_buffer(mem);
! J" m9 j' X9 B* _$ m: |; F        }                + C: d. t( L3 t. K6 T4 N
}
; o+ O: X. k4 T) X* @# g, y" S1 U* y6 e$ t8 `8 m1 w( c
void read_MSG_buffer(int *baseaddr)
/ }+ O# D! o4 |8 b  _+ G: j{9 w3 S/ r- Z9 @( _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- s. Q# L& K6 \; O  ?3 l% R! g$ i6 m1 U% g% F( {" D+ W8 ]1 h+ K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: k, c# s+ h; N) G" _3 A: ]

6 v' L2 J6 b  g8 B        if(pshreRAM->packet_cout != count_copy)! K9 X3 a/ h/ [/ B/ k* h
        {
5 d3 s+ l# C3 `& ~: c                printf("a is %d\n", pshreRAM->a);
; k5 s0 ~  v( c" d& s& H* {: W                printf("b is %d\n", pshreRAM->b);7 `: A. k- T" p1 a
                printf("count is %d\n", pshreRAM->packet_cout);
. y. i$ T4 O$ y+ ^' j1 K! [3 d                count_copy = pshreRAM->packet_cout;
$ A5 E. p* |% p/ J, O/ P( T; O        }: R4 A# |+ |! E5 N8 F3 O+ r# N: S: ?
        else
' f) x1 @" d- `3 [( W        {$ H. A2 O, w2 [8 r/ t
                printf("No effective message!\n");
. P  ^* T8 N; M        }- A* X# @+ O$ L( h' ^6 V
}
7 v  J+ P2 @- Q3 M7 X
- q" c. Z+ G" \3 c% ?) t, T  ~& p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, R; z$ c$ l8 _. M
8 m. |3 T- k* C1 V

  _: t2 _$ i, U: R
+ ?- \" J. F# i- ]6 ]. \$ `1 U: |
+ Y+ G. `! q; M) B& Y/ b) M




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