嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . M% S: A( Y/ d" t# `6 v( {2 Y6 U* K
4 g1 o7 O; n7 n* Q  c/ j# g0 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 A6 A. l0 H, }7 i: m# c8 J
#include <unistd.h>4 @* V! E* a. I* c/ K5 f- F+ _* t
#include <sys/mman.h>$ Y& r0 [( o( {2 p/ s( J& k* H3 L
#include <sys/types.h>
) w& q* T* l/ t#include <fcntl.h>5 @5 ~8 D- E/ {' F. k/ ~) e% k% x

: N- i! W7 I* v& `. P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  T& `9 n: D3 O# W! y7 n% T; b+ E4 d" Y; W6 L7 |
typedef struct
0 X/ @! H( o6 p2 g2 d! g{( k6 D, t& C  j2 V9 r6 l# a
        unsigned int a;7 j3 f, N& w* B/ Y- Q
        unsigned int b;
' ^- o" r8 c6 T+ \: D0 T" m$ ]        unsigned int packet_cout;/ |% V! q0 v0 L5 O+ J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  }) H: _$ J- U+ \% ]

: B3 P7 `4 L$ _  q6 j: s/ o. Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" [6 Z  ?) f" p$ q% q( E6 I& K- a' _unsigned int count_copy = 0;2 j+ G. o9 ^& G$ |
; Z5 q! F& D/ F( p  G% y
" E& l1 Z5 P4 _! G5 O) |1 H
int main()  M- z3 o4 Y( t# ^8 S
{
  l7 a% y/ F. M* {. r+ \+ I5 m' J        pRX_MSG_PROTOCOL pshreRAM = NULL;1 B$ |* n! B' b) d( g' c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  Q$ U' I+ T2 u! d

* q1 \5 h8 L4 ?3 f3 C9 }" d        while(1)
& M; f7 X; u' n        {
/ u( P! z: d* [% c" {6 b                read_MSG_buffer(pshreRAM);5 k4 I1 F" _: Y0 m- D) R
        }               
: R4 R3 ]4 {- [$ \  O) [}
6 W: u6 E6 ]0 L; L& _. S& D. h8 `; m% m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 d; v! ^. w, N9 s; F: u
{6 F# A4 L% H# ?: A
        RX_MSG_PROTOCOL buf;
4 P8 t8 @/ N6 c- m2 {* a        2 A* B6 M4 V" Q' p2 b7 H
        buf.a = pshreRAM->a;
/ k, p$ [! h$ r  s3 h        buf.b = pshreRAM->b;
) R# Y/ R* `- l; p3 j" o        buf.packet_cout = pshreRAM->packet_cout;" B3 A1 S$ G; @* u; J
        
  ]( j. S3 d5 P" L! q1 ^% S        if(buf.packet_cout != count_copy)6 N0 E6 a; Q' r/ _0 h% E0 l6 W0 t
        {9 Q3 ~$ y+ [& Z9 O+ H4 Z& w# t+ z3 g
                printf("a is %d\n", buf.a);
" T4 x+ X9 O" f- u                printf("b is %d\n", buf.b);1 S, `, |9 h3 j) L( S$ {2 E+ t
                printf("count is %d\n", buf.packet_cout);2 K1 |) q& o$ D; S! e3 k2 `# T1 ~: z
                count_copy = buf.packet_cout;; D& r- R1 k2 F% u
        }
5 W0 J6 B7 ^4 n1 X7 E5 U        else
8 A1 q/ q' X: f0 t7 h8 p, p        {$ N8 [9 q' ]* C6 V" M" D7 j
                printf("No effective message!");
3 E7 _  c3 j7 E5 g; q; a" n        }
7 G& e8 J* J/ Y# h0 `  L; E/ P9 e}
5 R6 I1 O: h3 e+ f3 C  p! y( i: g1 x/ u, y% y
: C! x) s. R2 N# ^3 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* F, Q/ U; R1 e
使用下面代码,对内存使用了mmap函数后:$ e0 @, |4 h5 k2 z
#include <stdio.h>+ Z8 s! i, q, L
#include <unistd.h>5 I  k  X/ H! D2 H! R, C- ^
#include <sys/mman.h>
) O* @& G3 I5 S6 {/ L) t$ P#include <sys/types.h>5 Y2 K- r0 l, z& G+ @1 D
#include <fcntl.h>5 K$ O4 N; q! l' g) u

  v! c: M1 M- c, Q' u( r#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ m! [! @4 C) M$ m( ]; u1 M#define SHAER_RAM_SIZE         (0x20000)   
$ h9 L; K; r7 A1 e" m5 M
* l, x- o+ j- |) m  L5 t! }typedef struct0 Y% X- f; A9 [3 }- S$ j- T
{
' `% S  K. M; W! w$ w$ D        unsigned int a;2 v/ s! r3 [, v' |& j! A
        unsigned int b;
, p" i) G0 ]: t- b( P        unsigned int packet_cout;, _6 v- k( I( V' ^% X: {" I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 M; V; e% R" |

# d5 b* n8 b4 U8 N: Ovoid read_MSG_buffer(int *baseaddr);( x6 x# M7 O  H: L$ q1 A! E- o
unsigned int count_copy = 0;
* f: |  E2 Z7 H$ D5 G2 N5 u2 R
) Z9 I) Z5 A4 I4 vint main()* i: I0 K3 l& s) Q
{! V* r( _! M, e5 G; \. E
        int fd;
- U& o4 C$ h2 X/ x# K        int *mem = NULL;
& s, ~- ~! g# ?" }: \
  I) |4 y% M( P& K! p5 A        if((fd = open("/dev/mem", O_RDWR)) <0), C" Q8 N) l- Q! B! h5 a
        {' m4 T+ W. J. |, F
                perror("open error");. L1 a; S. K* \/ Y  V
                return -1;- P: J, q+ B+ z
        }
0 l0 C. K' Y; T        + b6 _7 z( I6 h! {" o& ]* t$ o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 x( h- ^9 G2 f0 a, V9 N& K/ ~
& c, C( l9 F5 u+ F        while(1)
1 I& t5 a+ |) s9 {7 H        {8 |4 [6 x/ l! k1 R  ~3 |
                read_MSG_buffer(mem);, O( o- y3 ]7 @9 ^
        }               
" q. K" f* S4 l% b7 }}. Q8 i- S! E% r+ i

3 @1 r; r1 `" l" b! Zvoid read_MSG_buffer(int *baseaddr)2 f" n& \( e6 q8 o6 |! @: [# d
{; |; `& j, i- S" @9 s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ~" b0 y1 |; }3 s8 c, S/ g8 a! {3 y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: }$ u2 `7 V9 J7 D) J
" W* L1 ?( s# k! m# {; C
        if(pshreRAM->packet_cout != count_copy)1 l! m  W1 R5 e* q
        {* b# a' e3 X( Y: q
                printf("a is %d\n", pshreRAM->a);  L1 ?$ H  V7 Z- T
                printf("b is %d\n", pshreRAM->b);2 D5 O% A  k# }
                printf("count is %d\n", pshreRAM->packet_cout);0 E' q1 }* ~' h) c
                count_copy = pshreRAM->packet_cout;! B1 y5 I% {$ [" ~
        }: i9 M. x& j2 G6 Y( T: C
        else; Z6 N" |) |! ]1 R8 G  r+ h
        {2 }( i: Y/ j2 p
                printf("No effective message!\n");2 @: ~1 Y6 z: W/ K
        }$ [# E' K$ o7 r# K0 u
}8 z  S4 G0 H$ o+ f/ N

0 M  S, {- x* {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- Y- q8 d. q! k  y

4 L. _( o- n3 }2 c% N- o. K, l9 q6 O/ _( k6 X9 Q. p& p
  J7 P$ F3 m3 |7 s
- X# k% C/ t: Z





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