嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 Z' x6 z5 i' [+ U8 j
% ^2 `1 W( c# j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 y- g' s$ o! ]) L: E" }
#include <unistd.h>! s/ z9 \* Y3 v# h. o" Z
#include <sys/mman.h>
/ {$ w/ v6 c5 `2 _' `' X2 S#include <sys/types.h># ?# \( F2 u1 t
#include <fcntl.h>
# O/ y3 H& h0 _9 ?  C: D9 i5 e. A2 G" \. b5 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + L7 U+ N% T1 x7 q2 ]1 w. w; l
/ C2 |8 s1 h, y1 _3 Z
typedef struct5 {- c# |( Q: R* _: ^% ~; ?
{
4 h, e. K+ A# _) l$ G        unsigned int a;0 g9 t. V1 K/ {/ @6 _; \3 v
        unsigned int b;
# t! F( k0 @' d0 |# m        unsigned int packet_cout;2 P. i3 j5 B$ x  v" I; ^, V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 {$ ?, b0 A& x1 t; y: K8 Q% L
  \" m  L$ h6 j) evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# c% G) I3 `5 |) m% K, j
unsigned int count_copy = 0;
' d; ?" x- i# [/ E  \2 v9 L, {% z# Q8 ]2 h: V

$ @5 G8 {3 ~/ a) Nint main()
4 s& R$ g; ?* g7 m6 L" [{9 N0 x( u% \- U  {, H1 _: F' X7 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;! p* i6 N6 p; N6 y6 u2 z# J
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 E; O# |- \# {$ @4 t7 E* _

4 B* n& @% }) x5 h        while(1)4 S8 m) k& d' Y1 U0 m5 f& q5 @# d  X
        {# X0 u! A8 z& d" J, r: M: c
                read_MSG_buffer(pshreRAM);8 x/ [1 l, V% G" k
        }                5 o% t( q: M& ?
}- u: Y  o; `3 V. [
, u# ^# C- u' L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 o  f0 H( F6 [' e! c+ J. h
{
) L. ^$ m$ R! d: k/ c; }; k! G- [        RX_MSG_PROTOCOL buf;" V0 d$ K( I7 \/ ~) u' ~# R
        3 O( O. H2 K. ]$ ~$ o
        buf.a = pshreRAM->a;
0 V& i( f* c% E( q5 q" P* f' V        buf.b = pshreRAM->b;
, k3 y, ^" Y( i% ?8 n3 b- n& C9 I        buf.packet_cout = pshreRAM->packet_cout;; u. @( w' u$ f2 l$ L" Y
        
3 d2 L- `; S: \+ f0 ]& Z, }, z        if(buf.packet_cout != count_copy)
, b. j# K3 ^7 W        {
, S: {( q$ A- T% ?, `7 ]/ ]$ p( R                printf("a is %d\n", buf.a);
% q6 y) K: D3 q4 E" `# e2 C+ Q                printf("b is %d\n", buf.b);5 V! |% u; v8 s; d% g
                printf("count is %d\n", buf.packet_cout);
) M8 s' c, ~$ O  j3 T, D  q                count_copy = buf.packet_cout;$ M$ @( P2 a3 k8 ?, m9 j6 K
        }0 T/ a' p2 T* e# {: R
        else8 J0 D' Z( J, ~/ ~* F$ U: F( u' d
        {' {) e# W$ U% @5 t
                printf("No effective message!");# E+ B& v9 N4 B
        }
( t  l6 w# w- D6 U}
& h. }& X, D3 L- M% x- l/ J( K/ I7 e0 j3 B
+ S5 v4 N: Z; }8 s/ y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" D; n1 l; T# j
使用下面代码,对内存使用了mmap函数后:; ]; e. M( C3 y9 x% W
#include <stdio.h># U6 U: ?7 ~: U+ ]1 q5 ?9 h
#include <unistd.h>
1 j% q" ]2 P* d8 k. ~! x- g6 B/ U#include <sys/mman.h>
/ q: O$ W9 u) w/ b# c3 I$ W#include <sys/types.h>* W* o8 @( }: j$ r
#include <fcntl.h>
* h; n3 \6 ~2 t) M' C# L4 I  o8 H( q8 U' @7 f# K8 T- e
#define SHAER_RAM_BASE_ADDR    (0x80000000)& @9 x4 k& B# u
#define SHAER_RAM_SIZE         (0x20000)     ?/ x% g, R& p7 Q- \$ Z
. s( o3 t; Q" O7 c  \; z5 S
typedef struct$ w# Z# ~7 ~5 d) @' t
{! v$ k8 B: q7 f: W% k4 @
        unsigned int a;9 G0 L* X( _0 C! G! q
        unsigned int b;
: A! }9 M4 ^& G  H9 M6 q        unsigned int packet_cout;
/ W1 J: p* |( Z) Y; t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ e( D( t& r! s' R' H) S2 @
# V/ y4 D: i+ O4 c- r6 c) \void read_MSG_buffer(int *baseaddr);
+ `. L' B9 }4 l& aunsigned int count_copy = 0;
* @& @' K, s# Q# e8 u
3 O' ?7 p+ r" E9 @3 Gint main()
! \4 k/ [* m/ O% o, C; h) I; S{4 M  @( m" Z- [9 }  j
        int fd;
' d9 n1 G1 }" m7 y* w4 H        int *mem = NULL;5 a/ w2 j! s$ l9 Q
: y& M' p4 z6 R7 W
        if((fd = open("/dev/mem", O_RDWR)) <0)/ e+ M, R/ w9 b1 n+ W2 |$ H& f: S
        {( `, s" J3 C5 h+ k9 w8 I
                perror("open error");
3 V7 @9 X" ~  i6 \; K  z3 U                return -1;
& W) H- x8 N! V' c1 E* c+ Z* Z7 v        }
& S4 V1 S: q2 u) P5 q        
% e$ s6 P3 |* t' R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ P8 H/ n5 v: \, L; k" G& {: O: p  i$ O. d( J
        while(1)* \' _7 p- P9 R/ o$ J
        {
  I5 v" x4 T. l0 I: O; j# M9 n                read_MSG_buffer(mem);; V' _8 |% m, H; c5 K5 B- ]) {8 U8 p
        }               
# m% z4 {  ^% J" W  X) ~}& y5 g. R9 Q( u2 q7 g
- s1 K; m; Z' |+ w! f8 k+ o7 c8 @
void read_MSG_buffer(int *baseaddr)% v# o7 n0 F: h$ h8 h
{7 M+ q( q; e3 w3 Z6 l9 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 y0 J( D* n" @( m

/ Q# P; q1 o5 Z) p& C+ F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 u' T2 t2 |* |. p! z9 |" j# C: K! ]9 M' w( D0 W
        if(pshreRAM->packet_cout != count_copy)
8 L' t) }9 N' ^$ [. a        {* d  y' \. ^$ D9 B  E
                printf("a is %d\n", pshreRAM->a);' @% z6 I0 ]. ~$ R7 C& v7 B
                printf("b is %d\n", pshreRAM->b);4 f2 `$ x% ?( l& i- v
                printf("count is %d\n", pshreRAM->packet_cout);, O9 A% g1 p  t
                count_copy = pshreRAM->packet_cout;, b0 _4 q# l% c5 }- j5 d
        }
9 W- n( v$ m$ o5 u) g  t" @        else
% d2 t6 U  e# [3 D( f- M# E        {# _3 `- |; U$ g# g% C  P
                printf("No effective message!\n");& l+ A, }7 n# |1 e
        }
) Z7 o7 O; S( @) `}* j( X7 {- N) Y
# c: l+ ^0 I8 G$ T9 J9 Y- s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 q! }1 ]: ~& H) r- y. K0 {# I: m% N8 k; x- g1 I$ e

7 ~0 O  F! g$ k
7 ?! K  E/ s- v) M2 P: \0 K5 E
7 m8 U& @/ @# k$ o




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