嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 e1 p, j( p' _2 C8 M
; _& v9 o; P' Z! A2 A9 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 D3 a( ]% L$ X6 i: X#include <unistd.h>' C+ t8 ]6 {$ e/ p2 k# p6 d
#include <sys/mman.h>: W: B. W; s# e
#include <sys/types.h>; [- r6 f! k) a) o$ X" z
#include <fcntl.h>
" ^" O( o- P* W: F. o4 u0 n7 d! ?7 r* g5 R$ K
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * f# ?8 w% l2 U4 ?  ~
, O  p  {$ @2 H/ V+ [) F
typedef struct; P& P. |4 o( `) K4 O/ K
{- ~  B- R: K6 N- _: N
        unsigned int a;1 A$ f7 O, c. [2 M
        unsigned int b;
% ~: R( E3 g; `/ H) y        unsigned int packet_cout;, r: V8 S1 ^4 D- C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ m/ q: {8 [: a4 |" a  F

( x' `4 x' Q% yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 U2 A$ {4 R" a3 X2 _+ d, S, Y
unsigned int count_copy = 0;, j$ Z8 Z3 C* n; k2 v0 |+ n5 l

+ z  }6 D* K* n+ y
. a# |0 K. F* \7 f7 u( x' X* X5 L/ h  S& Mint main()1 D5 X4 ^% |5 k  S9 J
{* q. {9 I) i! S' q) U; q0 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 _' c4 l6 j( B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: I; R9 r5 W: m1 n# ?8 I
9 N4 n' c& {4 p5 J/ f( b9 a6 @
        while(1)- J2 K$ k& j% T0 [) B
        {8 k2 Y1 {& C( Y. X/ x" i; Z
                read_MSG_buffer(pshreRAM);, s/ o  N+ H( V3 w5 e" X9 z0 @
        }                # P9 b0 f* b$ e# |8 r" a( S
}& n; d4 x0 P1 b2 u: ]2 T

: M7 ~$ T3 c1 l& qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r) d& ]1 w5 s5 T3 d* c' a$ e2 j. _
{  {* c  h/ S* @1 u7 _
        RX_MSG_PROTOCOL buf;- Y  I8 _: F- ?3 I. _  c+ e
        8 O$ v) L' S  o. x! e& o' |
        buf.a = pshreRAM->a;
8 T% @: ^( b" n6 o        buf.b = pshreRAM->b;3 I! Z% A  n* }0 N! |# F2 S
        buf.packet_cout = pshreRAM->packet_cout;
( I7 g. t* F' u! I, b. G! M. p        0 h4 p% h: r" F8 O1 N1 n& J
        if(buf.packet_cout != count_copy)
3 D; f5 ~( _" D, W+ z6 S        {
7 F6 n! c' K5 B9 h                printf("a is %d\n", buf.a);  H: i: N5 S2 L. P3 b
                printf("b is %d\n", buf.b);6 B" ]( \+ R; E; a0 M& J4 [+ M
                printf("count is %d\n", buf.packet_cout);
- u1 Q+ U8 k: ?5 N                count_copy = buf.packet_cout;1 u- P5 g2 U& ?1 c  b
        }1 l& d9 E% }* N7 `+ a: ]
        else
& x; h+ s8 t7 a1 L        {
3 K: l# z; w! G, X. V                printf("No effective message!");
0 v5 P- m5 `4 L' W9 p, m        }5 I3 N( I0 i4 S4 w% H' W
}
! z; S4 B" {5 @. c+ @
# [$ L; \* `- f
7 T3 l2 p" I0 k* [& S& s9 X6 i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 D8 o% b& \: u" p% Y& u$ k, O
使用下面代码,对内存使用了mmap函数后:
6 v! i2 ?; R1 R( Q" S#include <stdio.h>
. t# Y) l4 O' _" Z5 S+ l! `! P% |#include <unistd.h>
; r5 t. I& ]$ y4 y; B: _& d#include <sys/mman.h>* K1 m( L2 j( A6 `, `
#include <sys/types.h>
9 ?' r) Y" Y$ K, b8 Q#include <fcntl.h>
$ F5 a) J( Q* L$ i8 q* H
0 F: F: V/ U& W7 V; w#define SHAER_RAM_BASE_ADDR    (0x80000000)
. v7 {# _3 m' _( J( h' J& x#define SHAER_RAM_SIZE         (0x20000)   
  |5 {) Z6 c& ^, }& b9 F2 Y& n& m
4 e6 O. @: L3 U% z2 A6 w6 ttypedef struct
5 P* E* r4 {' q" ]9 {; z{
* J  c( u: q& i* V' |2 V        unsigned int a;
( W' L6 @- c! V- n: [7 H        unsigned int b;9 ^, F4 [* c* Q; X& |5 ]- U
        unsigned int packet_cout;: b* [7 I- _' u" y" O: C9 ^/ C( v( y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 `, {4 S6 l. e' _6 x. Z" J: C6 ^1 x/ [& v% g/ f( Z0 G* o
void read_MSG_buffer(int *baseaddr);
! b3 Z# j, t: b. L' [8 zunsigned int count_copy = 0;' u4 b* t" P( D/ ^6 d( z; T2 X
4 d$ H0 a6 e+ G0 I
int main()/ p/ Y) |* P" L. p/ x! m" h
{
" K) `  \. Z. n3 m' d- c  h0 z        int fd;2 M3 s; M- ?) ?* \8 X
        int *mem = NULL;
) @% D# N  V: c6 @" Q. s1 k
( @. L7 Z) Y) n- B8 B        if((fd = open("/dev/mem", O_RDWR)) <0)
- d& i; b9 }% c& \        {
' C5 S7 D6 P6 W* g4 G! u) E                perror("open error");* M+ a9 }8 s+ g. M$ v
                return -1;/ k  l+ P% d# k8 m2 b& a5 k
        }! }1 w) n% r9 z/ {% m
        & p2 t  j7 f/ v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% {) ~& V0 M2 i
% U, y. l/ a9 N: a+ L        while(1)
% p/ b. I" N/ H" _( n        {
1 R/ t( {7 o$ u                read_MSG_buffer(mem);( ^* \  n$ t- T" B
        }               
4 H$ H3 m) G+ t6 i}
3 T' i2 m9 J/ k- f
; x. u4 h2 v4 u+ {9 kvoid read_MSG_buffer(int *baseaddr)
$ }! h% \$ |% P. D: N6 ~3 t{
% I% I' [9 P6 i        pRX_MSG_PROTOCOL pshreRAM = NULL;' _5 C$ G6 k0 ]) d
! ~. }- N/ C( q! s3 L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* O# p/ [% y" t" m; A& B
$ d# A  M' u6 a/ Y( T  _( |        if(pshreRAM->packet_cout != count_copy)/ ]; A- N5 r7 i4 w
        {5 v# e& x% }, W( ]  \, @6 p
                printf("a is %d\n", pshreRAM->a);
. ~+ e* _1 z" y4 B& D+ K1 J$ i                printf("b is %d\n", pshreRAM->b);
1 [" k/ K1 A1 I. a                printf("count is %d\n", pshreRAM->packet_cout);
! E: x3 ^( u3 r* R) \+ a                count_copy = pshreRAM->packet_cout;
6 i7 |3 G( K- Y: |# N        }
  I- u7 k8 E- t& k4 E6 ~        else
/ ^2 T* J# ]2 V        {, V! d0 m7 }( ]+ f8 n
                printf("No effective message!\n");; O( }2 u- D/ ?4 C' A
        }6 ]( D' E7 y# q1 J9 T! Q
}
7 c" b9 e( K2 L) D
4 g' t+ L) k7 f7 [9 Y2 P' d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% _( h" z# _: u( I: S: Q3 i4 |

  y7 m9 I: E! ~5 Z+ R& U% D
$ }$ v6 s- O. a4 g, o1 `7 F7 {* r8 v. `% t% G- J) {

6 D3 S' z( ]. U9 f6 h




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