嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - `4 @$ {. u7 ~* l+ Y4 @4 z8 Q
- w/ w# {; q# m* T3 i7 S5 N+ z) M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 D8 t9 S! \7 z+ G& t
#include <unistd.h>
7 C! {; F3 q% x  E1 J7 ]" i#include <sys/mman.h>7 {( X: Q5 i. l1 n8 I
#include <sys/types.h>" _3 q, P% {0 p2 v* M; x
#include <fcntl.h>4 P, {" _/ U6 [. Q- |, {" p
& j# c: x# U8 F6 }/ R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' s- z$ X" g7 P) n  J9 X5 p5 @* X/ C  x0 C
typedef struct3 q; f) b, E6 ~3 R6 D0 h6 m
{
! I; b. n; u( E" e. u9 f- @3 q+ x        unsigned int a;
4 I7 i1 t$ N6 v1 ]) a        unsigned int b;, o5 k6 U3 l4 v" ]+ p& k5 E; W; D
        unsigned int packet_cout;
( ]- Z& P7 `. g' f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 X* @2 G2 ~4 x& o& k7 b) o* A
4 K5 o0 K! A8 z- a0 a* K& f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: A; n% A* n+ O- j1 ]* wunsigned int count_copy = 0;
5 ~; j3 f2 G6 V6 o& _: J8 `7 y/ ]0 |+ K4 K
) N+ c" V$ N1 l% l; B7 P- h! j4 w  P4 _7 S" V8 S) _
int main()
  _' ~% O  |; I1 v& t3 b" T' L{
8 J7 Z9 A0 f( W+ }        pRX_MSG_PROTOCOL pshreRAM = NULL;0 s2 d" m$ O) K- Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ z6 }+ Z* D  u6 P7 k
5 d: J8 e' ~0 {. o* }7 e        while(1)
  t+ }3 v' M' g# @0 ~& v        {
* P' D! D  G7 s' j* v                read_MSG_buffer(pshreRAM);
9 R& M3 \, Z) U: _( {        }               
1 Z" C" K8 _3 B* M3 Q}
* Y+ c0 Z. r0 q( E" y& R8 S5 d2 i% P* O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ v* N5 I+ C4 v' R+ B{6 G8 m! ~' {0 y& }0 Q0 @7 R
        RX_MSG_PROTOCOL buf;+ X) k3 ^" M+ r* ^& O$ W# m6 q8 k
        # P- P" G& W( F
        buf.a = pshreRAM->a;- z8 i# _; i5 g. g! M+ u
        buf.b = pshreRAM->b;6 l9 B, u0 i. m) r3 ]
        buf.packet_cout = pshreRAM->packet_cout;: w! F' U& f% ^6 V1 |- S
        
5 z  e4 t+ L# x' E7 r% c3 h        if(buf.packet_cout != count_copy)
9 P9 ^+ a0 L7 B        {
4 P$ F1 V, `" I' h                printf("a is %d\n", buf.a);
) C  X; c; D6 _( }* B' z                printf("b is %d\n", buf.b);
- v# m% `! ^: ^" x9 V4 g+ D( T. F                printf("count is %d\n", buf.packet_cout);
' G- v1 P0 `( ^. x0 r4 |  A                count_copy = buf.packet_cout;( D! |: k: ~  L6 x
        }9 q( a) T! X  f) J9 j- v- F
        else5 W; K% @/ Q! u5 ~+ Q) G4 `, Y
        {
  e4 ?2 Z7 v, m* n( s. }2 T- [% f                printf("No effective message!");5 d) _  Q/ j. s2 l: J7 p3 T
        }
* Z& L& @- o# M& O}4 Y/ S: o, `' l& @" F, W
4 f- n' X; K/ [2 s1 T  M" c

$ E- J- ~( H3 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. y7 n+ f- ^" X+ f; @6 C
使用下面代码,对内存使用了mmap函数后:
* W# B: Z# x/ h- P#include <stdio.h>
: {1 _9 H) B" o#include <unistd.h>
% P4 V  e: h' x" G: W% D* T3 O#include <sys/mman.h># @  v3 q, n, x% `/ V, g0 V- e3 f) X
#include <sys/types.h>. u3 R. Q; {# Q- @! \8 i: G
#include <fcntl.h>
2 c9 J) N( n+ D9 X1 p
: q: w3 s( t' I1 u7 `' b; [9 w$ J#define SHAER_RAM_BASE_ADDR    (0x80000000)8 x. f. K8 [0 v$ {/ V# f
#define SHAER_RAM_SIZE         (0x20000)   
1 x2 t2 ~* K. O# O. f. N5 Y  R. Q1 N; ?; a  }) f' X7 G* M
typedef struct
) v6 N+ z1 Z( L% }{
8 m  _9 q7 z0 m) B( t2 i        unsigned int a;
3 H8 L# C1 ^# {; r0 i9 ~        unsigned int b;
( |: z( l6 }- [* y        unsigned int packet_cout;2 M7 I, L  W& d+ |5 V; n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ i; b  C( Y# z1 j$ M9 D
" R  l2 R" o3 Cvoid read_MSG_buffer(int *baseaddr);4 a8 q" g# c& z8 ^0 M. f3 t
unsigned int count_copy = 0;
$ A/ p4 P& T  }' W. ~! k* _% r: a: M
int main()( l8 }. ~* k( Y" @( F$ }, {9 _
{& ~( |3 Z: H0 P: E' V1 Q3 x& M' R
        int fd;
. C2 T% X0 p) J        int *mem = NULL;1 }- v2 _3 F' |* H; v
0 c& i1 ]0 Y. R: f' Y$ A! [: Q3 M
        if((fd = open("/dev/mem", O_RDWR)) <0)
* N8 R2 H  \$ H        {
8 ]" v7 w# C& K5 K& I/ q0 F. p                perror("open error");
8 {; z4 P* \" }                return -1;
, ~: f7 k0 N+ }: P8 m( _9 f  R/ i" P        }) e1 Y8 {+ G2 k
        
) Z; [: w% w! I) x# s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, ^, g9 X3 u% q8 [* N

& s3 e( P4 f" {) z0 J8 Y; p& r2 r        while(1), B! ~" R% e* M7 ^
        {
  m# G6 L6 P# k# g9 `                read_MSG_buffer(mem);* W5 o) s, g3 E4 A
        }               
6 h7 [, S& j8 t1 T! h# A" _- m}
/ k" z( i1 h4 N
5 M1 e, T) @. N8 Fvoid read_MSG_buffer(int *baseaddr)& q: ^5 x3 C- L+ c6 r5 g/ S: {
{( R! j7 ?- j; L3 ^: t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ U+ z9 M1 M% W8 F6 b  e2 }4 z& t# J1 P4 `% Z! p  a: [$ f# a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& X6 L' b! B; ?* B7 a) y, k9 @+ j
        if(pshreRAM->packet_cout != count_copy)( F/ m8 c0 W% W0 r
        {6 ^' t, [% r5 F" `% R- w4 a
                printf("a is %d\n", pshreRAM->a);0 m1 O. w, E2 l" C7 n
                printf("b is %d\n", pshreRAM->b);
) q! z  M: Q. j3 b3 C                printf("count is %d\n", pshreRAM->packet_cout);/ D3 y  }+ _, j" K% @4 E
                count_copy = pshreRAM->packet_cout;, G/ ]- v+ j, p: w3 M& R
        }, v( x0 ^: z, c) H
        else
6 J# }- T, m  i        {1 @  v9 ~8 ^4 k5 h5 _0 B
                printf("No effective message!\n");
: j! w) N+ ~1 M% U) G7 w& m        }
4 d: m2 N* ^3 q}
' d" u" i. b* L$ k( O
  Y4 Z- E( B% f1 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! M% ^8 O! D0 k. `) q9 q+ m* Z/ S

: h4 A* w8 }7 U, S6 Z
- O# \! q/ k! W5 X6 s
, x0 R6 `9 g0 Z! `$ s# Y
' n4 l) R1 ^1 U, X. x6 h




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