嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 Z$ ^! A* R6 j' X8 o: y/ w
& R$ @! s7 H: o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% C8 S- J" }" E9 H
#include <unistd.h>) m( P$ N$ d9 e2 a0 L
#include <sys/mman.h>
7 t0 z5 o6 T$ t% F  X#include <sys/types.h>4 z' M8 e# H2 d/ \
#include <fcntl.h>! g, t) U3 u# M# }  h

; t6 Y* w# E6 ?: P) J7 A$ I2 @#define SHAER_RAM_BASE_ADDR    (0x80000000)     k$ V& b4 |$ ?+ i. b: `4 E

+ W# G5 {/ a) H, u% rtypedef struct
! P4 U+ K* ~  M. M: \) C& A{
4 A5 x; F& {2 {: G, Y        unsigned int a;
* h+ A: g1 N$ ~5 `+ A$ h. x1 r& ?        unsigned int b;( }+ Q& W* ~4 T9 t
        unsigned int packet_cout;. H  j! B$ u1 \3 p% g! h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  x/ t' @% Y, |  X- L
( ?7 u# P$ A2 c2 E& B* B) cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 e& z$ U. U8 s! B) L( g  _
unsigned int count_copy = 0;
3 V0 V; y# u# p, r) L- i  ^6 l1 P4 s6 b# {. i9 J$ x/ L
  Y! w2 V" f. W0 }7 Q4 F
int main()& o) G5 N3 h; V2 b7 t% Y
{- m$ x6 `, r4 P2 a! s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' l6 i9 {5 z' {2 k( e+ `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 e; @% D" J! a+ ~9 I' c% X
/ x' s0 p4 D' F        while(1)* d& V+ ?2 Y# j0 X; |
        {- \. I- ^# D  t! G. [
                read_MSG_buffer(pshreRAM);
7 G5 p/ z) r; A& y  F6 f+ \        }               
: Z' ], p! A* l* ~( J( m" j2 `0 a+ i}
# E2 `  Q, \# Z! N4 U" y9 e. n8 @1 t4 ^- l6 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" P% V% ~! ~% U9 n9 f( {
{9 V: ?% f- Y+ y
        RX_MSG_PROTOCOL buf;! N  Z+ A( j/ @+ V3 i- ~5 i
        . c$ P+ z% ]  r/ ?+ Y# ?
        buf.a = pshreRAM->a;
+ @: l0 c8 R$ y1 h; S        buf.b = pshreRAM->b;
/ S( q+ D$ ]  x/ c        buf.packet_cout = pshreRAM->packet_cout;
* _# u3 H( W$ x* T+ h2 Q        ) P$ C' R. C# e. H: Y2 N2 ?" A; r
        if(buf.packet_cout != count_copy)
9 n( \5 c2 }; f* {8 j" s        {. P- d1 x" v0 B# v
                printf("a is %d\n", buf.a);
% d" H% v4 }" O+ N% {2 d                printf("b is %d\n", buf.b);7 i0 d- t2 b: h0 |% r7 h4 p! P! u
                printf("count is %d\n", buf.packet_cout);2 l  {& p1 M* W) C
                count_copy = buf.packet_cout;" z( c3 ], a& @
        }: H+ L0 A0 g+ ~: w$ ?7 R1 l
        else7 h& v* D2 Q# y& G2 v* e
        {
: A5 _9 s) R& r( ^                printf("No effective message!");: a! |( q6 h4 v
        }& X& p  ^. x3 `9 q
}( {$ W" n; [2 u% Z" l
8 e, G2 t" {% P$ l) `3 ~- r" S9 r
4 `' V8 r- \6 f" S+ _+ Z5 L3 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% D7 e. X& Q. x2 u6 P
使用下面代码,对内存使用了mmap函数后:- Y6 M# g) }. J
#include <stdio.h>& v, K$ d+ V; ]$ c2 u" H
#include <unistd.h>7 N" ~$ \4 \; }+ @8 G" K5 y1 w6 J$ _
#include <sys/mman.h>( Q' {) U8 |  E( ^
#include <sys/types.h>7 s4 N7 Y7 x# U( C& |
#include <fcntl.h>
; y, C$ p3 \6 y* |: A* P; F
+ W3 x; K- P8 C( L% @1 w+ ^% k#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 l# b# g  ^: G3 m& a#define SHAER_RAM_SIZE         (0x20000)   0 f. q& ^3 n3 d: ~) C% b1 V- Z

( z3 s6 M0 c! u3 e) p! xtypedef struct
. T% @9 u* ^( ~6 ~: `) i{) y  l" X: ]' K% q8 d7 _+ Q
        unsigned int a;1 d1 s; x# l6 B& t
        unsigned int b;  H; `; C, X* r" O- U  {% c! v
        unsigned int packet_cout;
, B8 m' t9 F2 t8 i* T  E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 X$ y3 Q! a) |. p" U7 H! A

! k% |. S  |5 [% Uvoid read_MSG_buffer(int *baseaddr);8 ?# o. G6 T8 J1 ^
unsigned int count_copy = 0;) h8 k& W' R, ?" n

5 E% @. A: C, J% d; S( ?( dint main()7 E* T* f" h$ p+ k! a1 N
{
! a& R4 O& \6 h  ]5 w! r7 V        int fd;1 n0 ]4 c. a- P/ e! N, R
        int *mem = NULL;
: _, ~. Z; U  d5 A- j7 M# G( l+ N+ M
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 e0 p- i% x& ~" J( r' n7 K$ ]: h5 }' W        {& W4 h* y8 P( D1 J) X
                perror("open error");% A7 z' B5 r; A; s+ y" z2 z; w
                return -1;: k, v2 [7 v) V( N
        }
+ d0 E$ j5 A7 W9 `1 j        5 R2 _* ?1 J  w+ h; T* m7 r% z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  N9 S# a& y5 W& U0 {7 G+ i( _& O3 G" i* y( @0 y
        while(1)$ d( t) t: s  g. s
        {! ?7 y0 |; a& ]- s
                read_MSG_buffer(mem);0 P; i; B  w& H) z6 [; v
        }                " b) V! a3 a7 H
}" _% S- i* O( z  \* \$ a

% G) c3 j) V# @6 \6 ?void read_MSG_buffer(int *baseaddr)
' u: b) A/ f6 A{
! `! H7 R( c. s( x% r, a2 I        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ p0 F$ w( {) P/ R$ r( x
' E5 U# r  ^, |- s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 I9 C9 o2 v- E% A* l! e: _( Z
, o; ?3 L  }! z9 a7 X
        if(pshreRAM->packet_cout != count_copy)
0 I, Z- ^& u9 X        {# P) @& l& O6 [$ v) n6 R
                printf("a is %d\n", pshreRAM->a);2 G4 m: Z3 j0 Z- R8 x; C
                printf("b is %d\n", pshreRAM->b);# A1 n% w& H& N9 v& C
                printf("count is %d\n", pshreRAM->packet_cout);
- ?8 M* ~+ Y7 x: ^( c3 @6 P, g                count_copy = pshreRAM->packet_cout;- H! ?' \; P% I. d1 @% Z
        }
6 c$ T' d1 ^" {0 R! i7 A3 ~        else
% Y7 T) ]: }8 ^" D# G0 }        {
% ]: M0 G, H' c' c4 U; L                printf("No effective message!\n");
2 h- N( W$ `# r  n) Q        }
; f" F4 x3 l0 B/ E* `! M, a}
. D/ a( O) |2 F; P0 K6 Q( x: G3 V, R) F) r) M: o) p% A- E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" w) h( ]  R) I
  _* ]8 Z3 w, B+ n+ ^) F) R, U

5 f, E1 z  R' s2 X$ `  K& S' G5 K  }2 A
+ T. M! h# l6 u4 G3 J- i





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