嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 [$ E/ f% B/ o+ H* l8 j" D; V
2 a& R0 i6 b, g$ B# R/ Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 @+ A' a0 ?! @4 ~2 e& h9 T
#include <unistd.h>7 O- b* ^) b6 o0 Z+ q, s
#include <sys/mman.h>
: _2 h+ S/ b/ a  b( i#include <sys/types.h>. E+ A& f$ B9 ^. Q( N2 M9 U0 ^
#include <fcntl.h>5 b1 J. z; d. F4 U
  Q5 v# U2 |1 Y4 \$ w2 J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * m/ ?) d. [' K* H1 o" n
9 `+ O* P$ ]9 v, R  Z9 x+ \1 L
typedef struct& K; l: u" J5 Y# c
{1 Q3 Y& x6 g' \! ^5 s6 Y
        unsigned int a;& }, ~0 Z' y6 i3 H5 U
        unsigned int b;9 {. y, w! O3 V" i
        unsigned int packet_cout;
( S4 v+ W6 h3 Q9 f, |8 m: x& X) [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% Y0 p) }0 A% e% T. F6 k: g+ u; M1 R( x- A1 V( H" w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 u1 W% Q% b; yunsigned int count_copy = 0;2 w' t# ^' d8 M, h3 f
5 T1 e( d8 L# z9 K" L
9 V/ d; ?5 R, i
int main()# D% ^, T7 k# T! X
{3 C5 B3 K. B; {" f
        pRX_MSG_PROTOCOL pshreRAM = NULL;# I( ?  W+ k4 ~! c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% x4 V- ^4 O7 x" l4 N$ x! Z( P2 U! a$ S9 M# i) w
        while(1)7 {6 h5 r, o- Y5 X5 H5 x
        {
- l. J1 h+ Z+ ]/ x                read_MSG_buffer(pshreRAM);9 y" {! F3 \. \# L6 I. u1 ?7 [) q
        }                0 g/ h0 v, q2 p& L/ {  Q
}
. G# k$ O3 O% f# _9 A+ m& a: O  }* D& n; s' `, x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  U1 z0 \: j% r0 W* }4 \" L
{7 e" R9 k) d* w( i
        RX_MSG_PROTOCOL buf;8 K. S3 q  q" f
        ) m( A0 T# |9 _% Q
        buf.a = pshreRAM->a;3 F$ o% Q5 d, g3 N, D$ `
        buf.b = pshreRAM->b;5 L+ u" x& J# [  o. }
        buf.packet_cout = pshreRAM->packet_cout;) E+ t. V, j% R
          t* L: Z2 F  @& u( t5 m
        if(buf.packet_cout != count_copy)
) ]6 D3 b4 }6 ]* ^& d7 }        {
7 H( _2 s( b* H5 ?7 s0 o+ L                printf("a is %d\n", buf.a);$ Q2 M  m5 k- h  ?; `; m' R. K- [$ E
                printf("b is %d\n", buf.b);5 s/ o. ?( O: k
                printf("count is %d\n", buf.packet_cout);0 |; S0 G( B' D/ n. d+ p' M
                count_copy = buf.packet_cout;
! D$ X0 p2 w: J# Y6 M0 J; r. M$ O        }
3 _# Y; z3 w- s2 n, c1 z) R        else% {) U2 w( C0 o5 p) r0 C$ m, D' O
        {* v( p- S6 n. z, f6 z$ k
                printf("No effective message!");
8 ]! @" P$ d" G. W, r# I, h3 c        }
4 v  A! L; E. t; M; j}
' t9 c8 r$ `4 ]( `  }
* \& [; B2 w) x& b6 x$ ~; S# l, K
) k$ r# S  j2 w% u' D6 R: n; q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 P2 _' K) I# Z1 V2 j
使用下面代码,对内存使用了mmap函数后:
  x8 T* Z* i* g  X6 C" i9 M0 g#include <stdio.h>. e+ [4 k7 U) F
#include <unistd.h>, O" `) z0 `- g+ b) c$ k. g3 Y
#include <sys/mman.h>% p/ r7 K( s7 w& ~! t) a5 S# C( O
#include <sys/types.h>
+ s5 }) w0 k. b#include <fcntl.h>
; u) C2 m6 t/ G& y, g% W
" C; {& r7 V) X' b5 X. \! M) K#define SHAER_RAM_BASE_ADDR    (0x80000000)
# w0 n( S+ _7 W+ J4 Y' E#define SHAER_RAM_SIZE         (0x20000)   ! G1 |2 u; a+ A. c
$ ~; j2 w0 I% y5 z" R, f: T
typedef struct
! X, ^: J. U) H/ m4 b{
  t5 M; Z8 E. {5 V6 \        unsigned int a;
: @8 J) R2 p. ]( f5 p' N4 }        unsigned int b;
( c' Q, N* Q0 n5 z% m        unsigned int packet_cout;# X( `& H: J9 f1 @) }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 n! I& O( B) v. C; t- D$ ^
$ ?+ e% I0 Q5 ~' a  Y+ l& B2 c$ O
void read_MSG_buffer(int *baseaddr);' ?* t  o  j4 I: z& U. ?1 q2 P
unsigned int count_copy = 0;- O9 W; N  r, g* \! @" r8 g

/ E# P% C% u$ n) sint main()4 c3 F% R$ e* ?0 W% J$ _, V4 q6 S
{
% g5 T+ H: g' D3 w! V/ S        int fd;) t" R0 j) X9 d7 {( G
        int *mem = NULL;4 q# a, {# G  N8 F$ C/ V

4 e3 W0 X- X7 ^: J: D        if((fd = open("/dev/mem", O_RDWR)) <0)" ]# [/ a) ^8 ^* _% I2 |9 o  h4 U
        {
8 Y! ?0 S6 B$ ^, f                perror("open error");' x9 e( U" Z, K& H2 ?- w
                return -1;
; |6 Q& \4 Y3 Z6 A- I0 Q9 u( v        }+ n. U$ v5 F& [3 E5 D4 h
        
3 j9 p7 l' Q  t0 z2 A3 q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 C  s! G0 K1 q& O" O3 W$ u
& l- h3 k6 O- x# V% Y' o+ S& e. h        while(1), e3 @! ^3 ]. `6 `8 c- Q& ?
        {) ^% F$ T" K, x$ Y+ H
                read_MSG_buffer(mem);+ o7 M/ k% g# Q" K4 p8 c' ?
        }                . _5 e% M" k: {* {% r
}3 w4 B' m0 \/ K9 J# T
  j: a1 M5 _2 u9 h5 _6 L8 ?6 p
void read_MSG_buffer(int *baseaddr)/ F, ]" K: R& }
{) F: F" |' l! v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% ]2 X' M* L' _8 S( W+ v0 l$ N, l4 y; m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) F0 t4 `  H& \) C( r8 S
) R7 P) I0 O6 d4 G# @1 p- `4 l        if(pshreRAM->packet_cout != count_copy)# M3 `" I6 b! B! K3 |
        {
% {. u( e. L: O( W# [2 t: ]                printf("a is %d\n", pshreRAM->a);
0 m. c6 G& e! G1 F- K                printf("b is %d\n", pshreRAM->b);8 I. J( d1 c) ?# g. a6 w
                printf("count is %d\n", pshreRAM->packet_cout);4 s1 A8 |# V- B8 P' {2 b
                count_copy = pshreRAM->packet_cout;
/ x7 b: `: b0 `        }
- W8 k* X/ s' L, ~& h9 [0 O. y        else
2 s! K  A' F: N        {) \2 j; z" N0 |2 @
                printf("No effective message!\n");) o6 n" z6 e: B; S  t" [
        }
* ?( c- @8 o  d$ n}
/ T, b0 _' X9 t& t
4 P. M  U0 d4 y9 i" q" r+ j- F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; G# M% z8 R  C: B
9 }6 N. g4 u! }/ F9 B# ^* x

$ J8 y! u% [/ Y9 n, C3 c5 e7 k0 S# z" ]+ i* h/ K1 X2 p4 P6 w
/ I1 q  w( {/ j2 n





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