嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 I7 t! N  e; f
! q- j2 p. M* @! d9 p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 i. ]% p& R5 z6 ^6 R$ v& m#include <unistd.h>& D# W3 R: ^3 W+ C6 ^
#include <sys/mman.h>
: S2 w6 e, \7 Y% k" q#include <sys/types.h>
7 v7 x& F8 M. t2 O8 E#include <fcntl.h>
  X# [5 O+ t7 E  m0 C# l6 q7 G
" Q( Y0 g+ c0 @' M! U1 U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 J3 i1 _7 @  i# @: F% Z# }/ x- E* I* i$ C7 ]" [$ y
typedef struct: x2 s/ K9 F% J0 B' `
{9 @, S& x- Y2 M/ @7 k  o& K' f
        unsigned int a;6 o3 E3 k2 u  |, E* J; O! e
        unsigned int b;
) T7 N0 g/ `! k, L& o  F5 S        unsigned int packet_cout;
0 O$ G, Q0 _. w7 s" j4 S$ l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 a: ^; @% s! ?, a% V0 K5 o1 Y3 ?/ n) b3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" _* H1 G* b( ^- \3 i! A8 X) Vunsigned int count_copy = 0;
9 M# X+ h7 E0 `; A
0 r5 u8 S  q! W) n; r
5 v/ [3 |, R/ d6 o+ h5 dint main()
% i3 W, y& n3 {* E# j/ U{1 y9 O3 q. l5 S4 v: m1 e6 h
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 f5 o3 y8 O6 A- c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. d8 }% t; v7 A; S7 ]$ e( V! x; J8 u7 v: V9 H0 K1 R, G6 h
        while(1)" P" j9 V2 t& j, P5 C8 T) m" Z/ u
        {
' D+ T0 e1 ?+ C& ~  R                read_MSG_buffer(pshreRAM);
5 }# k& m( t4 F, f9 _8 H        }               
7 K0 m  P2 ^0 K5 x4 _8 ]}
/ T5 M, ^' O) t7 T, v3 r/ g
* b5 l: ~" l3 }8 W5 ^& n# l% avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& w1 g) n% M! a0 Q* `{
$ R( V& Z: J1 S: I        RX_MSG_PROTOCOL buf;
2 v4 c& o  V6 \' \+ q        
. L: a. ?, v. b) @5 l        buf.a = pshreRAM->a;0 m  v, h+ i( r8 Q& n
        buf.b = pshreRAM->b;: n. u5 V2 U* N
        buf.packet_cout = pshreRAM->packet_cout;
- |- J' ?2 b+ a8 A        $ O( n; |# t& X$ u
        if(buf.packet_cout != count_copy)
! e6 y4 u3 I9 X$ F/ s# D$ D* \; q        {
% D- {  c7 G! C) B# \1 P) ?                printf("a is %d\n", buf.a);; k% L# i2 G3 @* }  z
                printf("b is %d\n", buf.b);
, ?! z2 k6 c% j! y( b0 y                printf("count is %d\n", buf.packet_cout);8 A3 D4 C6 i" ?! T* ~; c4 u
                count_copy = buf.packet_cout;
3 H" E. \) o# J1 y- B' y$ x        }  t# L/ {% u4 i$ u" O
        else+ o( ?0 m: _  b7 g" G6 b* \# R
        {/ M$ \. x" x. Z! |- k6 C( B
                printf("No effective message!");$ V+ T- u7 A" O) \- v
        }1 `( m3 d( B- t  i
}8 X/ U* V4 U$ C1 |/ D' L

7 {$ P. |" J6 I$ W
, v5 U/ v, `, s' y! z+ W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: U# K% G! D8 `6 T% T% t使用下面代码,对内存使用了mmap函数后:
+ M* }4 O* f( _7 |# P% {#include <stdio.h>; x  K0 T5 h& V7 e/ z( B
#include <unistd.h>- B! N& k! S6 K
#include <sys/mman.h>. h- Z; J& T+ b3 M% y
#include <sys/types.h>
, m5 j5 A: F- y$ L4 t$ B#include <fcntl.h>
2 Y2 @0 A" g* q4 Q
. w1 M6 _# o+ q! ^#define SHAER_RAM_BASE_ADDR    (0x80000000)6 I" h2 z/ j+ M, L/ O
#define SHAER_RAM_SIZE         (0x20000)   ! {. U/ K5 C6 X7 X

1 E" `9 U! T& T3 itypedef struct
5 M/ A$ G/ b) y{
; {9 _8 H& k# S4 Z2 O: K, M/ u! ~4 o: E# M        unsigned int a;
+ J# o* L2 J, x* R  \  A9 H7 @        unsigned int b;
! W2 ]  S4 r( @' r/ U* l+ q        unsigned int packet_cout;& _& S' Q1 c( Z, }$ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 H' B; L/ n0 u$ o- h+ H
) K6 i5 L8 {! [. H* Wvoid read_MSG_buffer(int *baseaddr);- `3 T0 z" }  d% k2 e5 V' w! x
unsigned int count_copy = 0;
4 e2 H3 ~0 s7 t0 ?% i- p+ e& b! ^- S8 U  P) Y3 M
int main()# `0 g* B+ R" |2 u
{2 h" }( g' G! w# A' }
        int fd;3 j- L4 @6 R' r0 g* D- g
        int *mem = NULL;" j: e* C7 @+ u

2 a1 R% U: x& h1 i2 Q" r0 L        if((fd = open("/dev/mem", O_RDWR)) <0)
9 P" w: X( q! c( J, J        {
( x/ x2 o& B$ F) _0 m; ?                perror("open error");
0 E' s+ q7 |8 S, z                return -1;
# k: H  {9 M9 F; j4 ^# t        }# O2 q+ j1 P, H8 J  h" s$ o% D
        # E0 K0 r" N7 b% b9 Z( Q+ e% `5 G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; k7 H+ `6 v) \" }; X
0 \. V$ ^, h' ]0 c! b5 h
        while(1)7 m1 t) W0 k+ d: V2 K- \3 u
        {$ [0 q4 `/ h$ Y" m/ a$ H: R  @4 h
                read_MSG_buffer(mem);
) C7 Z# u& q5 w0 y- V, @5 w        }                ! A- w: q1 S  Y! r" d
}
1 m) ?- K& |) d: j# `
. ]" e2 C' K$ r' K$ R; U( kvoid read_MSG_buffer(int *baseaddr)
. t: W+ {* y7 }{) d& V0 [! C9 q& m
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 Y- g' _8 ?/ M, _- z& o7 r  r0 K
: f6 x9 B: u1 W! a! g, k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# L/ j2 W5 p$ W: _7 h2 H8 c" ]# g

+ l# ?. e+ k+ w        if(pshreRAM->packet_cout != count_copy)) g. n# U2 Z( P& S
        {  M; w: D8 @3 V( o9 f  j
                printf("a is %d\n", pshreRAM->a);5 j: `6 G8 [/ P7 v
                printf("b is %d\n", pshreRAM->b);
8 Q" p5 \, u( N/ h3 ^* B/ `                printf("count is %d\n", pshreRAM->packet_cout);
* y  g1 |% e  g% `/ W                count_copy = pshreRAM->packet_cout;2 S8 d* m) f( I: T
        }( P" \  n5 M! B. w4 a5 F# j5 B
        else! ^: p; Y) J5 i7 u" R8 S+ {- c
        {3 U! Q& }* S- o9 f
                printf("No effective message!\n");: ~) t) O0 p( w. I1 H
        }" x7 `8 `- r" T
}
& b, J7 B" r2 ?* u7 [
1 b& l9 `0 d3 X# Q% ~5 m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& j; y3 o7 f- d
$ \/ b, I# k( _
8 A4 c- d; Q+ F8 O0 \
/ k: O8 a' u% t' Z9 E! _

4 }& n/ B* t  P& E) \3 j- @




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