嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# E6 Y2 J( |1 l2 `
7 K! h, ?7 a( m0 `/ ]  g. P3 z9 `. FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( m$ q- L( X* G+ o( B# O#include <unistd.h>, X3 b4 I! `- A) `& ?
#include <sys/mman.h>
% k+ ]; y8 f" B% G( ]3 I#include <sys/types.h>
6 ]/ p2 E( T' ]8 N2 W. `) M+ a#include <fcntl.h>6 }: l9 w$ N3 D0 E

. _& y, I7 d( C#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ z+ y, w7 P# T6 ]. P8 m) L4 @: r
5 ?8 R) y. d# W: o* L, l$ |& itypedef struct
& ^, Y4 R4 Q$ C5 @{
2 G# H, [/ R) ~; Y# b4 L        unsigned int a;- v/ f7 h5 |1 M6 H$ M. c
        unsigned int b;0 }! D4 W& Q6 N9 ~
        unsigned int packet_cout;
4 I' G7 f; b; {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' j3 ]9 }. t3 U3 W1 p; }- F' m! N7 p) S- a6 S: v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ [/ O" L$ o+ f" c3 |0 funsigned int count_copy = 0;
; n& n5 }1 B# M; ]4 I2 I
' ~  Y& r) {0 ]- U. z8 P9 D: p$ u' s4 k3 ?  k+ V3 m1 z
int main(), V8 d/ q' U4 n2 A$ v3 Z  Y4 r5 d1 I
{+ [1 X' X2 c: o( f+ ^; E
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 S9 Z! s0 B3 q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' P9 t9 M2 |; p, }( ^; g) }
6 S" _" K2 ~3 q2 I. G
        while(1)
1 w7 X5 K+ ^9 l. d+ X2 W+ {+ J- u; U        {
# j& D4 f. k/ }                read_MSG_buffer(pshreRAM);. w: S4 u2 q+ _" ]( |
        }               
; j2 {* ]3 a8 V) B7 x2 Z}- ~) K0 h" D" g0 B5 M
- G6 w5 Y( J% u5 ?. j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) W& |, l9 N/ J# Q' C
{* _8 Z' n, ~8 r7 q5 H) [8 p
        RX_MSG_PROTOCOL buf;) U0 z2 [& C* H5 f) A/ s
        1 }9 _4 X1 {9 i% C# R# `& L
        buf.a = pshreRAM->a;
* w3 B* {3 T: ?        buf.b = pshreRAM->b;4 ~7 |& `# a4 [( g- C' Y
        buf.packet_cout = pshreRAM->packet_cout;% v# `0 j1 }  [/ L. K
        4 f( p% L2 i! x! q' ?' n' l- Z* J$ S3 U/ p
        if(buf.packet_cout != count_copy)9 `/ m; Q; k& {8 C
        {' L) `2 A+ V! M! y9 ~0 q$ V
                printf("a is %d\n", buf.a);
# @) F, Q4 D4 y) Z$ l  G8 k                printf("b is %d\n", buf.b);: R* T  S" ^" M) ]% v1 W* V1 F
                printf("count is %d\n", buf.packet_cout);1 i& S+ B, ^! V* u' ~( z8 G
                count_copy = buf.packet_cout;* y, o! T# V. J  N
        }" f) ~* G/ _: d3 S( N6 [
        else
: V- n% H7 H7 R' k0 b, y0 X        {7 d$ ?! }' ~6 i5 H- ?
                printf("No effective message!");! Z  k* x; c/ f( y, M( h% G
        }
; _, M- e) X- n. h}9 A# U+ r5 s9 [% P. x( l

/ r, F3 `& }6 u1 ]1 r& Y1 z/ \% ?; J$ w8 V# `4 L- f' a( R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ V0 b7 c8 \# m) Q- l
使用下面代码,对内存使用了mmap函数后:4 n6 l7 n9 k% J( c
#include <stdio.h>1 B3 }" g$ G( X" ^2 |
#include <unistd.h>  A6 E9 t) V$ j# c
#include <sys/mman.h>  T5 ^# W  m5 l, D& l! Q
#include <sys/types.h>
* @$ w$ y6 q+ Z6 m2 J" a- E. E- }#include <fcntl.h>
+ c7 `6 I$ F4 R% H# C. B
. I" e+ A) Q' P( b7 D+ y#define SHAER_RAM_BASE_ADDR    (0x80000000)
" w) B% P8 {' f. ~#define SHAER_RAM_SIZE         (0x20000)   ! M: r- n& O7 r7 ]/ @
1 j$ s' }0 E+ O
typedef struct
! Y% f) r/ M7 y$ X4 f{' U3 O; W& |- Z. B
        unsigned int a;
2 I% S/ [" A$ s        unsigned int b;" W+ k/ e' n; c! {9 o: D
        unsigned int packet_cout;
5 L$ d% b0 y) Y5 D- r: N0 ]# E% e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& g7 d) c" N3 A
8 ~* w  `9 u- [% @0 {7 X. T
void read_MSG_buffer(int *baseaddr);
+ q9 U2 }5 T( @# s% h) Xunsigned int count_copy = 0;; ?( f; q" o, J8 M5 d1 i

  _  d* ^# b$ |- |int main()
& A! c$ c6 B3 ^& T7 i{/ T* h  S' x/ }1 r. M, s
        int fd;8 l2 W7 |8 t, C' M6 d/ l* [/ r6 q
        int *mem = NULL;
0 y- h9 T2 E5 Q, h! D0 k% B
: F4 U; v  J" X4 H3 i4 q        if((fd = open("/dev/mem", O_RDWR)) <0)
* z9 X4 `3 z. D- J, {6 v! P% N        {
; Z* `# s+ \& f                perror("open error");
' N  i8 `3 w7 I/ J9 t* q* C8 O/ a6 X                return -1;
; b6 {( \8 s3 z        }
6 C4 @4 V* c0 ~  i1 _! }        
! f$ h' j% o; B( [, c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; l: x1 I9 F1 N* A- N  C- m3 K
) f8 F, D2 j8 V" o) A. p" w1 U
        while(1)
; U% v# M+ ^: K0 p. n0 [- z        {! l+ a: J3 h  C- a- u
                read_MSG_buffer(mem);; t# h! ]% Y$ f6 u9 m2 M6 y; {
        }               
  X( I1 _: i+ s7 J# [8 ~}4 I% Z8 X* {+ @$ B* T
, B& _2 G/ f7 w6 u5 o: Y
void read_MSG_buffer(int *baseaddr): S( m" |0 L- s( V& ?
{% ^: Y6 h: U; @, k/ ~+ x% h
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 N2 N8 X, h1 E, @' t6 c
: V9 d! k: G- v5 L- W; B6 q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! E% l) h' y# g2 K  ?. [, v3 c2 U0 N# {6 X7 i( C8 b
        if(pshreRAM->packet_cout != count_copy)
% g3 |. O, s9 Z        {0 W  _! q" H2 V$ j8 E' Y$ R6 r* _* M
                printf("a is %d\n", pshreRAM->a);4 x$ _' r) J& t2 q* o( m3 d7 c
                printf("b is %d\n", pshreRAM->b);
5 v! U5 E- h1 G' G* i4 E                printf("count is %d\n", pshreRAM->packet_cout);% K2 g4 Z0 V& Q2 T$ Z
                count_copy = pshreRAM->packet_cout;
# `8 \. h7 ~9 L        }
( N3 D- O3 M1 b- x, G  B        else
7 R3 Y3 v* T/ k: m        {' Q& h4 `' F8 l- }- N5 P
                printf("No effective message!\n");5 U5 K8 h- T. E% o& F
        }
( O3 W( V3 I& f, i* j}$ H7 f9 N) d" b% C
! h* k: U/ \  ]3 z6 t9 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' \/ I& t3 q% d  ?" t* _

$ w( T) Z1 C# M) C% w  L; ?1 v8 @# x) n4 }+ L7 r8 D' _! Y

- o/ n: F' ~+ U, B% p& G
( ?' b6 H$ w, s2 l% ?1 k- n# E




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