嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 q2 N8 x. q1 \3 h" [1 w0 A& p9 a! @* v# r, \, q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 S. ]* M# z- ^+ p+ c3 \#include <unistd.h>
3 F: f7 u. G1 a3 M4 k* F#include <sys/mman.h>3 S& N" z+ `- s/ i3 ?: n4 D
#include <sys/types.h>
2 E- z" `0 d% l7 r9 D$ h5 Z#include <fcntl.h>' s4 a$ d6 h5 J: M1 M& n. y4 b! v
7 s. [7 l+ [0 Z7 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' @( d2 o: s. e# O1 z4 D& L3 }% B) X3 m2 t. E+ G
typedef struct
6 L/ M5 ^5 e0 ?% S" H5 Y{& z3 {3 c% F! I1 |3 l
        unsigned int a;; |+ r" j& o4 i  @" z. @
        unsigned int b;
8 @2 {3 b/ r: s1 Z. ]3 Y/ ]        unsigned int packet_cout;
2 m2 y- q' U% @) t' [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 I0 Q3 H6 C  m4 z

  |9 E1 t( m$ d& dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 y+ s% E: E0 e" g- w- W, ~unsigned int count_copy = 0;1 A$ d8 t0 T( P$ V2 k* N
2 P( b4 P) W2 I3 a5 p* L

, b/ m' n9 ?* T/ k6 p1 Hint main()2 F" }. Y2 j  Z9 D
{
$ T: N! }+ ]7 K        pRX_MSG_PROTOCOL pshreRAM = NULL;8 R/ v4 r6 W7 d3 h4 Y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 B" m$ E6 H. C: v
6 U. I0 f, V. c* {4 x
        while(1)
! p9 E( [4 N/ T  e; T! z        {+ ^/ K# E+ O& Y2 n+ @
                read_MSG_buffer(pshreRAM);% u6 C5 L. A) e4 ^+ H' c, Q
        }               
' f/ u9 z' c$ U. D& `6 G1 G3 b+ K}5 M; c9 A0 t& ]. A, J# O
& I# _; Z; q8 G1 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r! C0 M$ x1 a/ G, y
{4 Z% k% ^) a2 v# O3 f
        RX_MSG_PROTOCOL buf;
! X, @! [- D4 B* E1 M- w, i        3 {3 o% a6 _8 i. q3 s
        buf.a = pshreRAM->a;5 g' F& j+ @2 i9 |5 p- t
        buf.b = pshreRAM->b;' X; b. r7 V! t  |3 [$ n
        buf.packet_cout = pshreRAM->packet_cout;$ t0 d* V- [- a7 S# t
        
8 j, f9 r7 `4 {3 D  o( P4 P        if(buf.packet_cout != count_copy)* K) F$ t8 @' S. d! d
        {- J2 ]# G" N4 C% q: _2 C( y' a
                printf("a is %d\n", buf.a);5 q6 R( ^9 Q* o2 v: m% B
                printf("b is %d\n", buf.b);
( b. c: x4 q6 ~+ Y2 y3 X9 ~                printf("count is %d\n", buf.packet_cout);
+ o2 _4 a) ~$ u! _8 ~                count_copy = buf.packet_cout;  S, h3 q7 s$ e; ?
        }7 |  C4 W5 T1 \( J5 F4 k6 {
        else1 }- k+ p0 h* d  e8 a4 y3 E# n
        {; j+ V+ H, P6 F& B2 w# A& W# d
                printf("No effective message!");
# E7 E  X( u! x0 Y; K8 I. i7 W$ q        }
0 K! E5 T" y: n* k; G! C}* B' s7 t0 a0 P2 P4 x
3 y$ {" ]6 s" t" G1 h
% w1 s3 v0 L3 |4 L* F- f) \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( M# |; b7 F& B/ l+ K$ c
使用下面代码,对内存使用了mmap函数后:
9 d: x+ z. {; F7 c6 w* M' I* s#include <stdio.h>5 T$ L0 I; z# ?
#include <unistd.h>
0 \: }5 n. `8 X4 F# i% w& q- b#include <sys/mman.h>
3 c0 }* G- R3 b! h#include <sys/types.h>
2 Y2 J! j5 _8 `( |# T#include <fcntl.h>: k; _* d" U2 J+ }0 W8 o/ ^

0 U0 B! C& U5 D1 @2 ^#define SHAER_RAM_BASE_ADDR    (0x80000000)/ a6 Z4 k+ E# b
#define SHAER_RAM_SIZE         (0x20000)   
+ u0 V3 C3 T9 ~1 ?4 K
; I8 r( o4 V& y& g( y7 Jtypedef struct3 x' D6 m: {( C7 e# T4 G
{
: v5 ?  t4 N+ j* P        unsigned int a;: h% _( H+ }5 G# J4 W
        unsigned int b;
3 [$ q; ?' B! L8 W" w  o1 C        unsigned int packet_cout;
8 L8 t* u9 G, o7 K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, m- j8 _: n, P; v6 b
0 b% _  q0 \# K# J2 Hvoid read_MSG_buffer(int *baseaddr);5 @8 y( u+ N7 @8 o% E! s
unsigned int count_copy = 0;4 S5 S- K5 }  R1 u# o

0 T; A, R" d0 D& H: O8 s% ]int main()
/ Z; b$ t* c5 V! ?; M{/ w* g& S- ]/ Q* `/ I* L' M
        int fd;' G# L4 _  M$ k3 Q
        int *mem = NULL;+ @+ j# S5 U$ Q( U- o" |
+ H) X: i  ^6 K9 u2 x% H
        if((fd = open("/dev/mem", O_RDWR)) <0)
- [% f& Z/ F+ `5 K- d* o        {8 O! L( }: W. m0 b% ?2 m8 O) x  w3 ?, i
                perror("open error");. p: |4 ^+ C( K; r2 l: f- J
                return -1;
6 C) `* o6 ~' Q  r, u        }
) \! A2 j$ f7 `1 a3 S' m        
4 B' w, s' ~/ l5 L' C3 U        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! `3 H9 _% F5 t/ R9 H/ X& A- A  F$ G
- ^6 v8 ^6 N$ m3 l" J6 q        while(1)
0 y6 S8 f. _# G$ L        {+ m- p2 h$ ~* @
                read_MSG_buffer(mem);5 B0 L* B  R' c" A/ o2 E6 J
        }                5 B& m, R0 {7 v* n" Z7 e
}9 i0 r* T0 p! ~! A0 C  x  j% W1 ?

& i+ c: J) J, Q' f" ovoid read_MSG_buffer(int *baseaddr)6 @% z$ n  o" s: l$ C! \
{& l) E# U7 W0 `' a: S
        pRX_MSG_PROTOCOL pshreRAM = NULL;. a# D  u5 j/ `/ F- X
7 F2 x4 p! @5 j4 s5 W$ w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ h9 D& ]& Z% x0 s9 a# p3 P3 }# q

4 X' \1 u) j& o        if(pshreRAM->packet_cout != count_copy)# r) T( P* F, ]: L6 Q# v
        {% e. R2 C! Z8 D, w5 O
                printf("a is %d\n", pshreRAM->a);
5 D2 s: ?, F$ z  y* g' X( C5 `                printf("b is %d\n", pshreRAM->b);
/ R3 S5 ]) x' C                printf("count is %d\n", pshreRAM->packet_cout);# I. T5 t+ a0 N& r
                count_copy = pshreRAM->packet_cout;7 h5 D& q4 l: C. ~" Y
        }" c, f: J( H! u9 b- K
        else* a# S# q! O) u
        {% n* }( S; G: B- ]. c0 |
                printf("No effective message!\n");
( N; G0 d3 l& F( |, S        }) _9 f* I' Y0 v9 r
}
. |$ j' s; w! Y. q/ ^+ Q6 I! M& A
7 {. ?( \5 B1 E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 O/ t+ y: q+ f
, A4 C2 n2 A5 [2 U* d/ F0 @2 E6 y" R8 H1 p! `9 G
9 g9 {+ o0 R6 ^% \

7 u0 R0 r( K0 l8 \$ r




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