嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 F  I& J7 w  z/ g7 j- c. U3 o1 H8 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 _& k8 M% ^: L  e2 |$ L# \
#include <unistd.h>8 W9 }2 a3 B9 G" \; s$ x
#include <sys/mman.h>' f5 h1 W$ u! s
#include <sys/types.h>
; A' C7 m+ v3 [  X' S#include <fcntl.h>
) T" H+ F8 J2 J+ a! a4 U+ [
- K2 T4 \  N0 I- m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 ~" W, q7 X1 Z
7 H3 q% T7 U9 }' O1 c1 Jtypedef struct- K! |7 d8 r( |& a9 G
{- N. t1 {( f/ c, S; I
        unsigned int a;
; k% R8 ?! |* e. k& W        unsigned int b;& J- K# R  k  g( o. g- B  X
        unsigned int packet_cout;& V9 B0 j/ E. u. m6 A# I% g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" X/ J: C7 H+ D+ f  n  O# A* D

  m8 C& t/ v- g8 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 U! w: ~# P. z7 f) }unsigned int count_copy = 0;6 q' }  m* }  s' _6 C& R- n

) X  ~+ S1 {( ?4 i+ P0 f: @
: ]9 U- x) P* N5 gint main()
  t) T0 Y$ B% d{& X) z/ R: [* L( s
        pRX_MSG_PROTOCOL pshreRAM = NULL;& `5 X; E/ M6 B- }, w3 i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  ^, I+ }# k' R% y! v3 M
. H& Z2 y0 T3 c" E0 w
        while(1)
: t# l- \. l5 J5 w+ `        {4 K2 T, T2 F) b: [; ?* l
                read_MSG_buffer(pshreRAM);! K1 G- ]; E+ _  Z& F6 \
        }               
2 K0 @; `, p' T* q7 e# z}
  d4 {! C1 ~; e# u! }! i
6 Q, L3 y! ~9 G6 H, x9 G! mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: n7 I* h$ U4 H: D# Y{
6 L4 ]. F; x5 n, u& F% w2 [        RX_MSG_PROTOCOL buf;
1 `( r4 y& n" g5 i        ( Z7 f, R, c: z3 E% L* f
        buf.a = pshreRAM->a;8 F4 }- U1 c! a1 N; M; ?
        buf.b = pshreRAM->b;
9 m2 o& I: b5 p; {* m) K        buf.packet_cout = pshreRAM->packet_cout;
: Z! V6 j) X4 u( A        
6 T+ ?3 @, l$ T        if(buf.packet_cout != count_copy)" u( i+ c8 s0 t' r* ~
        {
  P9 |9 k* V% [. [7 y& t/ O5 T; \                printf("a is %d\n", buf.a);( S. a# J* \) O: a/ |& Q
                printf("b is %d\n", buf.b);
) x+ s, K# N, K) i6 K' K- g                printf("count is %d\n", buf.packet_cout);
3 M; Y9 Q" ]6 C  M4 k                count_copy = buf.packet_cout;1 l' R5 y  I4 X( c  \
        }- `- G- r; g3 |
        else
) q: D* N; T5 Z4 _9 D7 V        {* G) w! G1 E0 H- o4 |5 N. a& M: T' k, |
                printf("No effective message!");; y0 w6 P( Q5 F
        }" Q/ |' h% \8 i9 z( ^, W6 b
}
3 h7 W+ `8 o' g& d5 t! P
4 U3 _# m) d8 {  P
2 V4 L& o* [, _8 @# h  L! L) j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' B' n- n- ^9 W' k" H9 Q使用下面代码,对内存使用了mmap函数后:
: g3 U! X9 [5 \7 J" ^: k#include <stdio.h>) z8 ]) [6 I4 _+ c. h6 A
#include <unistd.h>1 p, z) H  G4 I/ H0 L
#include <sys/mman.h>
' n; C( J+ f8 g6 H#include <sys/types.h>
/ ]* [# {. l( W8 |% L. S#include <fcntl.h>
! R$ A+ r7 Y5 E$ E" r! c( c3 ^' C. |$ c9 `7 p) O2 m9 ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ a% Q4 ?6 H% W
#define SHAER_RAM_SIZE         (0x20000)   9 m$ Q. K1 Z( z7 g& d# F; g
) r; E# E5 u+ i  L8 {
typedef struct
2 f# o' f$ [% |% X+ m{+ q' s5 i2 g7 T5 }  k( I
        unsigned int a;
- q; [4 e, N3 K        unsigned int b;5 V8 s; {3 U1 p6 L. Z
        unsigned int packet_cout;
; C0 O' N8 y8 J6 G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ J, Y/ F9 y: J$ F3 t; n7 k& R, g  a7 R7 N; I+ k- I5 Q
void read_MSG_buffer(int *baseaddr);
! {$ q; j+ h/ ~6 H$ `4 G1 Gunsigned int count_copy = 0;
8 T1 ~# @% t, k0 d1 d2 D3 E/ V
% j2 a; Y; p3 cint main()0 P7 Y6 T6 S. e  t1 g+ ~
{
0 U: D' E* @( t5 p8 N4 I4 z3 w        int fd;, k& P+ h# x6 r3 F
        int *mem = NULL;' ]+ d: D* a4 M) h
" B) ?. Q0 _( }, Z) b6 @
        if((fd = open("/dev/mem", O_RDWR)) <0)
, ?9 ]% d& P4 ~$ y$ _# |' U% I) u9 `+ P        {
! _" o7 l3 B' t5 H$ E                perror("open error");
9 n7 Q) q6 A. B* h4 j- ^4 r                return -1;( H5 b, M% N4 R5 Q: C7 b3 p  v
        }
( j& ?- A* |# [% }4 p( Z        
/ C1 n0 U/ q) x1 }$ k& M! Y! @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 N" T1 W" W% A$ J
: |* I+ j2 C. ^4 K: n  }, Y
        while(1)
0 j. _  d4 `. {8 ]# j$ d        {. O- |9 Z8 ?: P8 r
                read_MSG_buffer(mem);! Z$ }- m: ]0 a
        }               
3 j2 F* }5 v1 r3 m3 m1 S}; x2 g, I# F9 @3 P1 P  ~

. [: v  O. V+ A2 Y, avoid read_MSG_buffer(int *baseaddr)1 e5 F! f/ }: h, j" y0 Z# a
{* V5 o, V5 L4 D, P4 w- A( v+ J
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 b* U0 u* B& F% x% N# N$ m5 G# @& n
7 k' o+ D: {; C3 z( S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( m8 Y, p( |# I9 f( N- g
0 v" Z3 F) S; g8 ~" I        if(pshreRAM->packet_cout != count_copy)1 `0 J; H/ O- C
        {* b' j2 y* s4 X% F- a$ w, T  F5 b
                printf("a is %d\n", pshreRAM->a);
4 e/ K. D" I, G                printf("b is %d\n", pshreRAM->b);
* Y. u. y9 I: O8 Q% K                printf("count is %d\n", pshreRAM->packet_cout);( ?5 p+ Q, @$ Q" H/ c
                count_copy = pshreRAM->packet_cout;1 @: i0 C- K1 T
        }
  p  A- Y8 a% L        else) x1 `( B$ {1 D
        {
  z8 \  ]. y- Z+ a$ M                printf("No effective message!\n");
/ [2 k; w2 r; f        }6 i/ e/ ~8 k$ i9 r& o4 r
}7 K( [( e- ^8 Q, H1 r

: q  u: L" J  j2 k0 E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' o' c9 z/ }. G5 V' l4 K  }; |# x

+ S0 h! ^' F, O3 @& \" \/ }5 {2 e7 |# ]- i  \8 `

1 X4 v) Y3 f: r# \




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