嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 d. y4 q3 x9 N6 V. C) [8 T
+ L6 E6 e; V0 g  P, d6 c* Y0 X5 ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 q, y' e+ _; @# u1 n; }0 ~
#include <unistd.h>/ ]% U5 g7 t0 Y. u5 h& H: p
#include <sys/mman.h>
. F3 h3 e: c- f4 m#include <sys/types.h>
  D. m9 a0 Z) m' B8 ~& z* Y#include <fcntl.h>
, [  e% x* h: m! W
' z, @; j$ ~  A  G#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 T4 t: p0 i# h7 w) N- Z! j) x0 P! X; z. G* A% X3 m7 ^. ]
typedef struct
; S, o1 A7 O' w/ h/ a{
/ o* H& t1 y7 c4 u- ~0 u- H! ^        unsigned int a;  `( t( _5 _( l- a
        unsigned int b;- N9 S7 K( G) X. |( u
        unsigned int packet_cout;: m. t8 O. b9 A6 V$ c7 Q# Z  s6 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 x8 {. {( x: E! ]& O# @& m4 j9 |$ A2 y. n* W' s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% f! u! l% s6 W1 R+ ~7 y1 c% c
unsigned int count_copy = 0;
; o3 V# s# n9 ^! @, j
) Y" X' o  ~+ e; J( E3 C, w, L1 d" [2 a% E
int main(): v* O: A/ h4 {/ n0 W8 J* N
{
- I8 q% U& S$ v/ _* L        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 K. F/ M; `, X( X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, v9 L, Y/ M! K$ _$ ^. i$ d( e8 a5 m' X: Q+ p6 \# }. {, W; w3 z7 t: L, C
        while(1)
4 O4 {8 m$ L  i3 z/ f1 P( e9 q        {
- u) B0 w- x1 X9 N$ I, `                read_MSG_buffer(pshreRAM);. G8 R* z8 i. C1 V+ \  z
        }                % i' j' L  B  f' c2 p
}7 j. t0 D0 l& f1 b* Q+ X
  b5 t4 \; b! Q2 V7 r* z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), e- R! q9 T1 t( j2 ~. M
{; Y  y$ N3 T' l% O- ~0 q6 f
        RX_MSG_PROTOCOL buf;
( w% _# S  H$ [        
( m! d1 E/ U# C. p        buf.a = pshreRAM->a;; \% a0 E% i( F* F& ?
        buf.b = pshreRAM->b;+ @: E* W/ h) f2 ~# n* v2 \
        buf.packet_cout = pshreRAM->packet_cout;
) p0 j/ p( S- G! P, l        
" c" R! C+ D0 r( w0 A( j        if(buf.packet_cout != count_copy)
7 h/ @4 _8 v0 [( ?' b7 z9 T; s        {
, P/ E& P2 I8 U7 m                printf("a is %d\n", buf.a);( ~  ~( q5 i& b* r/ [! m
                printf("b is %d\n", buf.b);+ G$ h/ L/ x5 J% ^2 K
                printf("count is %d\n", buf.packet_cout);  ?( U6 X7 |4 }( l$ f0 ^( z4 b; I5 [
                count_copy = buf.packet_cout;9 d/ e4 N* D- @
        }) S7 _) N8 R4 v" s$ U
        else6 X. l- x2 F- {( ^# ^8 _
        {
% n) g; V$ H- @5 p9 C                printf("No effective message!");0 P- h7 s; p& p3 N# O0 x( r& c
        }
( h  I0 V4 z1 w+ b5 h) S+ v% G" f7 k}
+ o% T( v% K8 Y2 y8 t5 J9 y* O  Q' T7 z. s) L( {
9 v; @+ N4 m3 v# }  K2 R0 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 ^/ c. q+ O- j$ b2 y4 r& K  a
使用下面代码,对内存使用了mmap函数后:! H2 j2 Q$ d5 d, J
#include <stdio.h>
" Q# O3 O' P- h% m9 K#include <unistd.h>
, \" z5 P8 M7 F! @1 s#include <sys/mman.h>) G6 m! R$ r6 b- w+ z# `9 A* t
#include <sys/types.h>
& `$ A; f. q7 B#include <fcntl.h>. U8 a' K3 A2 _& c  t; e: ?
3 U+ a( w1 V! A2 ^$ M0 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: s$ I6 |, |* j3 ]& g8 ~' O, S#define SHAER_RAM_SIZE         (0x20000)   ! _: d% I  `5 d5 {3 C7 [

: H  O  w( c9 }typedef struct
/ q+ R. m1 o9 j) V! q{
4 Q' J7 o( Y) q; K: r1 g        unsigned int a;
, A  s& j  B) }8 |  |  h$ s' a        unsigned int b;' z: k+ g  X2 {0 u3 [, m- m
        unsigned int packet_cout;3 v! W# r' p& G9 T6 I# p& Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) G  j! R0 V! w/ l0 W; Z) x5 w* f
- [+ C, D$ Z" ?
void read_MSG_buffer(int *baseaddr);# ], s/ e% s1 G% z. W8 W* F1 d
unsigned int count_copy = 0;
4 F3 z! p' D6 I' d- ?" U; U$ H9 X' o1 d/ m& R1 _
int main()
  j2 p4 i" A! m& |{
8 {5 Y% Q  v* ^: T8 {        int fd;
1 s7 e' F" ?8 z        int *mem = NULL;
  b) E- D: c2 e4 L
  ^0 E$ T& l2 Z4 u  Q) U, `* C        if((fd = open("/dev/mem", O_RDWR)) <0)
1 @/ N; z% b4 {3 l/ d: E1 e        {
$ }8 v5 K; ~0 q& K& j5 u0 o7 ?& V                perror("open error");8 a6 y1 D+ K( m: P" `% [
                return -1;
# D1 ~, z/ {+ C) }3 K+ r        }
) c, l3 Y8 _5 P# e1 u          i0 \4 M: K; p  y1 W6 A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" V/ F) Y& c) [6 g

7 W8 k9 }6 U( h2 h. m$ }        while(1)/ ~7 h( G0 t6 N1 }4 v% i3 q. y
        {6 L( p; ?$ N/ k7 R
                read_MSG_buffer(mem);
* d4 o0 x/ M& Z3 z4 a) c$ s. h( R        }               
% _( C: i; k' d+ s. \& l}
7 u+ M/ g* l: p! S. a
/ T( I1 S' J' ?) ~  rvoid read_MSG_buffer(int *baseaddr)
6 \; K; K3 w+ f% H2 h{
. Y. A# o. l0 M" O4 u. l$ V        pRX_MSG_PROTOCOL pshreRAM = NULL;* `1 h5 G# U3 y' l5 W

; ?) I* Q! t0 U! _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( b4 B1 ]/ q8 }- ~- ~
$ t7 H! L7 n) p  `( {
        if(pshreRAM->packet_cout != count_copy)+ a- z: |4 A0 L" C/ y
        {, l  j! P& Y' ?- k. m( w
                printf("a is %d\n", pshreRAM->a);
; i% a3 Q8 Q" {" u                printf("b is %d\n", pshreRAM->b);) h- H9 D6 E6 i+ x# c2 k2 z- b; M
                printf("count is %d\n", pshreRAM->packet_cout);! L4 x% x6 p6 g; h$ g+ d3 L
                count_copy = pshreRAM->packet_cout;
3 T( u* i7 Q$ P        }
% O# l+ [4 h% b7 g% ]( X# ]) ?& a        else1 ]  r4 h2 ]  x4 c# U3 z
        {) |3 a& C' v8 k- u
                printf("No effective message!\n");2 b9 o4 t9 n& E9 s
        }
/ }) y0 m  q3 y8 I& q4 I}1 O% `! d0 @) h. M

# I8 \( d9 U6 f4 b! X5 E: a6 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 n+ q% v/ t& J" X# T4 ~

2 r$ [" ^+ I, o1 E" n4 M7 P) P! ?& N) F5 S) t
( D: y9 h- O% u- p  P2 i

5 m' {1 k) ], ^- I) a! H  I




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