嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 v- _4 ]% \2 T, u

! y$ Y1 n: B$ q8 d7 m- SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) E8 l/ f1 m3 ~; x; G9 b
#include <unistd.h>7 H5 S0 z+ {1 Q4 a
#include <sys/mman.h>
" W9 b" Y7 @7 k) B: \% H#include <sys/types.h>6 L5 `+ A( t1 H* f# y" z1 k1 W
#include <fcntl.h>" {6 J, e. a# j0 i+ I
8 Z( E: d9 c0 V& d0 X# b( d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. ^8 M: W6 D4 h9 H! }
* T" s  G2 z9 ]0 T. dtypedef struct
/ z$ u/ U- K. Y{8 p: e2 i$ {: D- r, [2 f
        unsigned int a;
$ ~" M, S2 ^* ?. Y$ u3 U- g        unsigned int b;" P5 j( ~# J+ x& M1 T% M( Q. S
        unsigned int packet_cout;1 G% r& |2 `+ H% B9 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- v7 y8 t1 w" w2 m' N

' S/ g. _( }. H, h( I' G3 nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ j/ D6 t( _9 a9 U2 N  R$ `1 n
unsigned int count_copy = 0;9 v; n2 A2 R5 o# l# k
: b. F1 R# N  B' i0 r$ [

; g" f' J8 v# Iint main()
2 ^+ O. Q) ^( {) ?+ O; i6 e8 [, I4 g{  g6 S3 u1 K. P1 k1 N! Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;; D! Q8 D, d! x# c. {/ q' b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, s+ t: V! \$ t! g/ @: V( }

7 n* z1 {% R1 K( X& L        while(1)/ Z" Q  y# L! @
        {
" d% Z" Q' Z/ ?% X% X  z7 m9 G7 u                read_MSG_buffer(pshreRAM);8 Y) g& b" g- l
        }                ; c/ W  N/ X  R
}: x3 [' Q3 k. J8 S0 J3 O

7 O6 A0 k! o+ y9 {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 p# C+ b# }# j( ]{
& ^( a. V/ f5 f' k- x% A$ n        RX_MSG_PROTOCOL buf;8 v7 Y6 r: p2 x4 U! g6 [: r
        " s. _3 i3 f% p* C  ]; z
        buf.a = pshreRAM->a;
" q) O. S& L9 l6 Y$ \        buf.b = pshreRAM->b;+ w. f# _( T" c. Y" `% E
        buf.packet_cout = pshreRAM->packet_cout;% Y& @! h; F  e+ v% _
        
( Y+ F4 F) s" i. v, t  C: Q        if(buf.packet_cout != count_copy), g2 B5 z; W! @: f
        {+ k6 r  g# `- q2 F+ x0 e6 m
                printf("a is %d\n", buf.a);8 ~6 J+ B4 ~# _+ F8 ]
                printf("b is %d\n", buf.b);( |+ ~; m2 v+ N" {) g. n. O
                printf("count is %d\n", buf.packet_cout);
% R8 J8 ]6 k) s! T                count_copy = buf.packet_cout;9 [$ R' k- F9 H' [3 V1 e: H
        }2 I7 e$ V- I% }1 H- G! c
        else) y1 G1 V( x$ ~# D8 S  A& ]; ?
        {
- v8 Y  C  {, G! [# p                printf("No effective message!");
( {8 r: {4 P& @! A+ _  ?# ]) A5 ]        }# O1 R# c+ V- V* e; f' Z  Q9 P1 Y
}
1 b! P& V0 B: ^8 L! ~, P0 F: ~* c2 F$ G: v% _

, k0 G( @; v5 V- q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( y# \# D5 m! Q4 R" L- Z- p) u
使用下面代码,对内存使用了mmap函数后:
5 M7 ~: T9 Z0 H* ?! d) v6 [% p#include <stdio.h>
' y! E# u1 M+ o2 u+ [% J#include <unistd.h>* O& o5 t; p* I% i
#include <sys/mman.h>' E4 r+ r; F+ S) @  |) n
#include <sys/types.h>  \9 @0 t& L) z2 {, M" U" g% Q0 y
#include <fcntl.h>
! T% h4 J3 \) J% `; Q3 R3 m: K
5 c4 e/ _" W& Y* D#define SHAER_RAM_BASE_ADDR    (0x80000000)% h& B+ _: a7 L4 _" @9 a% S
#define SHAER_RAM_SIZE         (0x20000)   
6 v! I6 {8 d7 n
( ~8 o: ^8 @( O! ]% x9 xtypedef struct
$ L2 U0 L' b* ^. J! H* ^{4 l( I' @5 h) U+ i- |
        unsigned int a;6 V0 O2 C& C/ a: R2 ?  f/ Y
        unsigned int b;
' w7 l; \2 S- d0 Z' I& x5 f        unsigned int packet_cout;3 N' {  x* P" ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# B% Y  ]. V3 _5 u- M5 K+ z" I
) q7 ?$ n/ @2 V2 s$ T' ivoid read_MSG_buffer(int *baseaddr);
; M+ |3 y3 e) m) D0 d8 ^unsigned int count_copy = 0;4 V3 n4 N; t$ d, K/ f8 J: d+ X

, }! Y* i0 U. Hint main()$ I  ^( H+ c! s5 t1 P/ D
{
! r3 ?' j) i3 {' B/ q+ h        int fd;
% H+ _* i8 ^; ^        int *mem = NULL;( O: L. x$ e5 Q

! p& I; m, D) ]9 U7 O; Z1 `        if((fd = open("/dev/mem", O_RDWR)) <0)
+ k5 [8 G% _2 j( `( P# w        {
, I4 ]. D1 D/ p5 p2 c' R                perror("open error");$ ~& `# }  E, ]0 |- ]
                return -1;( c9 k; |. x) E. z" u6 c1 Y
        }
. S: G: R# S* \8 \+ V! c        
* V& ~: ]5 I, A3 Z0 T1 b8 V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" v# V. d  C1 X0 z  L2 ]4 G  h% M% _+ y$ s- D7 l/ J
        while(1)
7 q& i$ o7 `3 r5 c% H1 z        {
) I, w1 n- E. q                read_MSG_buffer(mem);
+ M! k2 W; J" j0 Y        }                ; S+ K% {+ `5 H: _
}& `; r9 Q. g  t6 c: ~0 _" K" C

$ m2 m! e, o) X- V& J7 ivoid read_MSG_buffer(int *baseaddr). u9 K2 I2 C; e, z5 O
{! M4 T' j# u% V9 ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;% z9 [: @1 S$ n9 t  v* f
" n+ I% z5 }# _5 L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; F. l2 ?* y$ V, k: A# l% ^2 \% X# {! m* R% o& \
        if(pshreRAM->packet_cout != count_copy)
6 j8 n6 ~: Z* e        {% N- E" M4 }9 C9 i- l
                printf("a is %d\n", pshreRAM->a);
" o: j4 F$ x: j; V* [                printf("b is %d\n", pshreRAM->b);( [, }' H1 P) F! }" u/ G
                printf("count is %d\n", pshreRAM->packet_cout);
. ]* R( T& [  s& O- |( n                count_copy = pshreRAM->packet_cout;2 {. Y5 S; [" R: m; L
        }% w( }2 W0 K( H) l7 a, B
        else' _, g+ D6 p5 H& u
        {9 E# q' t5 `2 F  c) T. Q, V8 w9 d
                printf("No effective message!\n");  B& O( o8 H# Q1 L8 ?
        }
1 c  j% [: h# k. q3 q}
1 g5 J. C! u& A  o. o
% ]. w4 w: K! G" H- {  j0 b! V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- e  i4 ~5 R6 E3 c8 }  k, x# {

8 l$ ?, ]: H6 i- O  |1 W* G/ Y# [# s1 S8 ~
) f/ L6 P$ {( J3 i9 P7 O. d/ k4 ?

' P+ Q3 T. M# j. t




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