嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 S; n" o8 G  g* P) Z3 A1 c! l. s' A: o' L% T7 ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. X' C1 u! F) k#include <unistd.h>1 s* W2 W! Z: x* F
#include <sys/mman.h>0 V% t2 O. D" t4 t+ R$ B' u
#include <sys/types.h>
. _# h2 x8 d, a2 F#include <fcntl.h>7 A% E& A. V4 X+ ]

$ B2 t/ m9 E) i) K' s#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: f6 ?, S" ]8 ]$ h& p
( t0 O9 v8 Z( C4 G2 ~typedef struct
0 ~4 d$ z3 t( Q4 D# ?  c{! \; O" l! W3 M3 n4 r( }
        unsigned int a;
1 L7 y3 v* z3 p; Q' ~/ X* \% F& x9 A  G        unsigned int b;
  X- R$ Y: W& r        unsigned int packet_cout;
! D6 o4 u# _. J7 C5 T% a% m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' U7 P  u7 K/ C2 A( p3 o
) g% E: f3 h' G: y' C" ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  }+ T0 K" |* ^0 G) Vunsigned int count_copy = 0;! f# X! q" I% S
+ @3 C: m2 _/ u9 S
8 _! l  d( K8 ?& {% u
int main()
$ M( H9 H6 L% }5 Q6 L) Z{
; ^- |. F( ^% n$ b3 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;) S4 m) b7 i6 U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# X# k0 n4 H% P$ V/ E0 l& j9 y
  P/ V, P# Y8 ^0 s+ w
        while(1)
9 v0 z' @; ~7 _- U; W        {
( J# q0 S( z6 ]' u: F; O; ~                read_MSG_buffer(pshreRAM);
. M3 ?3 N9 @0 @: g        }               
1 M+ G' }* Q. X% k}
# f; K" A0 ^: R- x' a& j$ f- o- C! y  R( Y) m. ]' I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 r. v- m( ~3 }0 M. p( \3 s6 ~$ {{: h  u: R1 N4 k/ d# C; u; L
        RX_MSG_PROTOCOL buf;5 R+ d" ]# t: G8 T# ?4 x: ^- Y
        
, N5 B4 ]8 e$ x6 J        buf.a = pshreRAM->a;
" z/ H& B0 s: U/ ~3 `        buf.b = pshreRAM->b;
3 V9 q+ L0 y& G7 }        buf.packet_cout = pshreRAM->packet_cout;
/ k  P  d. k3 S7 n" z        
3 m  ^9 Y2 S4 n2 g; G- D7 s        if(buf.packet_cout != count_copy)
$ M- _, z: l0 u9 z$ o        {; K& M2 I- w8 [4 x
                printf("a is %d\n", buf.a);  Y- I+ M2 `+ g: i
                printf("b is %d\n", buf.b);# ]0 b' f) {8 w4 u
                printf("count is %d\n", buf.packet_cout);
2 N1 i3 A+ M+ k: u1 p                count_copy = buf.packet_cout;
, F( z" U# u% C/ u# T/ O        }
+ Q2 F, C% ~9 ]# `/ K        else8 [+ P$ T% H1 [% [! j/ c) f
        {
/ r2 w8 L# \4 T/ [% @                printf("No effective message!");* N, s2 `/ [# i! d( Y
        }
9 w1 B% V% S1 P  t( m7 M: _9 `0 k) l}6 L* u! o8 _' \8 t" z0 ~
- {7 i7 Q1 J, x5 k/ S

" `2 }) Z9 ~$ m5 i  }. k9 o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 N# D! E0 }' f6 z
使用下面代码,对内存使用了mmap函数后:
2 f7 K+ `9 F" A  S#include <stdio.h>  t2 {% n5 p$ M' s  m1 _% k! \
#include <unistd.h>! }7 m6 ]  X8 X) L9 w
#include <sys/mman.h>  ?& n8 o6 v/ v/ X+ J8 Z
#include <sys/types.h>
  U4 k3 \$ M9 e8 u" R' A0 S#include <fcntl.h>
4 K* Z! u: k* m0 y! j
. V, ^% Z: k3 [0 D8 H  a: z#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ |  `" A" ~9 F1 U/ z5 M#define SHAER_RAM_SIZE         (0x20000)   
& e1 O$ a9 D2 q
( Q) J9 B2 b  X" e3 ktypedef struct
. `, Q) J- N& E# l{
2 w5 _9 L5 ?  f4 e+ P+ q; N        unsigned int a;% e# `# n# }% {- }8 y$ K+ |1 r& W
        unsigned int b;
: d/ x$ C& o! o  s. D  |        unsigned int packet_cout;$ t$ e1 I0 L0 t! P. K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* q% O$ l; S# D1 Y- B1 J4 S: p2 R, H, A# u5 I  X
void read_MSG_buffer(int *baseaddr);8 U  U" `1 x% G8 J) ~
unsigned int count_copy = 0;
: L1 ]) X1 B7 ?; P* e2 H( I) b4 ^" N
: v. f, s! W. l: x5 zint main()
0 C' L7 J9 R' ^9 B' b2 I: S% f4 [+ A, |{
2 H- ]" Y9 H; y! O* d8 |        int fd;
' b: d/ q0 Z( u- r8 A# ?        int *mem = NULL;
& J& t4 ?" m0 ^6 ]) J) c1 O2 }; ]' N1 u- O0 j; T; P
        if((fd = open("/dev/mem", O_RDWR)) <0)0 S% o4 q" J8 @& \9 Z/ K; ?
        {& L0 `9 O& g  C
                perror("open error");: G- m9 U1 B8 e) v( ]
                return -1;# b4 D4 E. C/ Y, \* N# G; k
        }" H/ X9 i, x$ U
        
' f& [2 f/ e- \8 Q: q! ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' o, c  W/ h# b
2 I6 k0 ]6 c2 u# d8 m$ p
        while(1)
+ }7 O- z) _% o3 U        {5 I7 K# }9 \; x9 l# q
                read_MSG_buffer(mem);6 c: A/ {1 G" C( h" ^
        }                * J, |% Q& v% \1 A( @+ `: |
}
  I/ A6 }0 E4 j# _' t4 t9 _* ?) d7 j0 I" h
void read_MSG_buffer(int *baseaddr)
, _4 l- z* A( r8 E; z' [# W{
% H2 m% l0 J1 f6 V9 X8 G        pRX_MSG_PROTOCOL pshreRAM = NULL;# G$ q4 v4 w) {

9 q' L" {% N; N! v1 _& }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ^" _( \" u8 [. U% X1 j; P% ]& r, @' R6 p' a( W
        if(pshreRAM->packet_cout != count_copy)8 H( f  J8 H+ d0 u
        {
7 k( T8 r6 _3 P' i                printf("a is %d\n", pshreRAM->a);
3 c: f2 r) n2 ~                printf("b is %d\n", pshreRAM->b);. M" J; n# e8 d  }9 o4 F" M6 |! I( B9 M
                printf("count is %d\n", pshreRAM->packet_cout);
0 b9 B1 s3 }% L) p( f                count_copy = pshreRAM->packet_cout;
( X9 M& L* |) d6 t) S1 ^4 e        }
0 k" j8 P" m4 ^) z        else: h! e/ Y3 r  J; k
        {
3 G6 T  m' q$ `" i; }5 X* F, Y                printf("No effective message!\n");
4 P) _9 l4 d7 R* U, |        }/ [( Q7 }9 p, O0 b  P9 m: j
}" n5 f+ S% l0 l

$ V" N; b: G- n/ d" I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& n- l5 r  ^5 Q$ U" O; y9 X7 f, j1 B0 E0 S/ D; P

7 k2 c$ n+ z( G8 W1 X' P$ l' o+ t% v* |' s6 S4 C4 N, d
( J. ]# b/ u* D9 ^: i





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