嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* J0 i) o  x1 O, t) [
: H+ {1 n) R: h. c2 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# k# }7 v: l/ n! j#include <unistd.h>4 U, ~+ k+ d  H1 S( L4 |. d
#include <sys/mman.h>
7 r; ]/ `( p$ r  l) G#include <sys/types.h>  F* w$ |# Z  E0 z
#include <fcntl.h>
' M& U0 B2 Q3 F' B1 i/ {( _$ S+ N+ N# r/ t* d2 D; w
#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 d! E, X; }9 l' l. [, [% ]* h

* d1 f/ I6 ?  T( |, I4 `% y6 atypedef struct$ {5 C5 A; m1 t; C# J
{2 \; {! K9 `* D0 o7 I' ?
        unsigned int a;$ P5 N9 V! T( S3 N9 u
        unsigned int b;" x8 r9 L5 k$ q) y: t3 P( m
        unsigned int packet_cout;
6 ]! o, c9 |; f2 Z. }! k' u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* |' _2 _8 s9 j+ D7 Y+ W) }& I/ o% F4 g2 H3 _5 E$ C( B/ u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' U, A7 Y4 P2 l0 ^
unsigned int count_copy = 0;$ u9 i  A& K; G$ J" I. C
/ G3 Q3 P1 D% {' J, h2 n

+ v( R8 K7 l( H! y; i8 B; wint main()# |4 ^! E  ^8 B6 N" O2 f" _
{( b5 ?: }5 X+ K8 o8 x  O; _# L! Z3 r
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ @+ w, C0 I6 n: W2 z8 P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# _: Q% F. f$ F2 o9 b9 }7 W

3 ^& a5 @8 V3 C( E2 h        while(1)1 X3 K. V6 m. {$ X. Z
        {2 K' B: w8 I' \. G# E' M
                read_MSG_buffer(pshreRAM);
8 C' I0 L' z# m/ G        }                # [" n' m! F& S( ?
}
  v* z0 q7 Z7 ?
3 [3 i3 V4 s5 q5 R. uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- |5 L/ z4 ~3 ]: ]. p{( j3 E4 G  Z! w, q5 v* i! A6 t
        RX_MSG_PROTOCOL buf;
# @: `, P* W4 h, _% }: G        
2 v5 A; v5 d9 j2 ]        buf.a = pshreRAM->a;' m: x7 n7 G$ P/ G' t* v
        buf.b = pshreRAM->b;! O  N0 a' N6 K, X9 G; n
        buf.packet_cout = pshreRAM->packet_cout;
4 m3 C0 e4 H, |# {+ f9 j6 U        
% U) g+ b0 g& n        if(buf.packet_cout != count_copy)
: i) n8 J. U! K) H        {
8 Y: s" y) v/ w$ Y& A" p" p5 a                printf("a is %d\n", buf.a);2 T% s. n- K& j, H! V
                printf("b is %d\n", buf.b);5 _5 y( Z5 A7 s- d1 D
                printf("count is %d\n", buf.packet_cout);
' ]8 G2 s. ?0 i# ]+ y                count_copy = buf.packet_cout;: F3 U( u+ U" E5 }7 r( u( `. U- _
        }
- d( O- A. n2 P& B1 S        else! @* ?5 c8 p$ N' M
        {
! {) J# @! x' n% ^1 {/ J0 j4 d                printf("No effective message!");; I- c0 q2 k3 v- A6 w
        }
) A7 \" [% |% J; a4 j* T}
0 E/ B$ p) X* {9 d9 F) W
5 i. P% Q( r3 G2 w: n' I/ l6 \& `# \9 a$ o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 ]. a1 ~) r/ h
使用下面代码,对内存使用了mmap函数后:
+ f7 O$ {+ ?- M2 j6 z9 Z#include <stdio.h>2 Y, ]3 E# m( H2 Q% U$ |
#include <unistd.h>% v; Q% q+ X4 E  _. {
#include <sys/mman.h>4 z8 Z$ q( [2 }' `8 x+ Q5 r
#include <sys/types.h>
$ a' u) W) }$ D) A7 `2 r0 {0 C5 R#include <fcntl.h>+ I: C# A; b1 T3 N
) c* h& ?. [0 l& U
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 s$ y) D5 [* u1 Y* w% k  T
#define SHAER_RAM_SIZE         (0x20000)   3 v" |+ N, u, s. l& C, ?: E* f

: i0 d: i: X" Vtypedef struct; l4 x1 W- f5 k! B/ t; Y
{: e( H9 C4 a3 y4 U" G
        unsigned int a;
. @% Q' X% d: {! |        unsigned int b;
; \4 y5 E  Y6 H5 n; G- Z( Z1 w8 R        unsigned int packet_cout;4 ~2 G! ~" J; `8 S' h8 b+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 q; t9 V* L6 Y% i$ S4 C! i% v0 j0 v$ D) I+ C* l3 V
void read_MSG_buffer(int *baseaddr);
( `6 b7 x( h0 N; J3 m$ ~unsigned int count_copy = 0;8 ^: q! J( j' I: j/ b  [& W

+ _6 K% s! Z. y/ }8 V2 \0 s: G3 F* |int main()
0 a4 F" g4 P: J# O1 a$ Z0 @: ]{% ^- O7 h! j: P; _1 g! O
        int fd;
+ n# Y$ _1 q; ^$ K5 {. f        int *mem = NULL;
; G" C! n& |/ M+ f( ?) T; s/ q6 ^2 B) c9 h
        if((fd = open("/dev/mem", O_RDWR)) <0)  `6 T* m! n( `4 Z( p# R& E
        {
8 I7 T8 @% j7 ~9 u7 ^* q( p7 {                perror("open error");8 z1 p) d4 W, @4 p  h
                return -1;
) o8 _' v/ _* ]/ A/ I        }3 T. x! S9 ]2 f9 l& R
        " ]1 F& ]% t! @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 H) b2 p1 U% r9 z
& u! [! M: u( p) U4 {0 ^
        while(1)
3 Z3 h" X  h$ y$ R( Y        {# D* A1 ]$ i9 u$ q5 Q# r
                read_MSG_buffer(mem);
9 E0 u; _* f+ n& f  ?" R        }               
8 O  S; W5 ^" G8 A1 B& x}, Y+ k! C" r1 E2 K3 l

5 H6 O( r$ @1 }4 ivoid read_MSG_buffer(int *baseaddr)4 C7 q5 z" j9 C" Y" M
{; x# \4 P  p/ W4 j, m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- D1 \6 z3 V. C/ |; w/ [' L% b- f% w
; J8 `! i, z1 @% V. j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: X8 Q% S2 T" d" t* ^# \7 G& h
% e2 s6 d7 x& ^; c6 W1 ~; s( z8 K5 W        if(pshreRAM->packet_cout != count_copy)
  B  `' R; r' v2 T3 q8 `/ P        {# H8 h& u1 R1 z9 D- K% ~7 l
                printf("a is %d\n", pshreRAM->a);* v5 s" b3 ^! v3 f8 J. I
                printf("b is %d\n", pshreRAM->b);
0 a2 {. t' U  u+ q; f. V1 g  t                printf("count is %d\n", pshreRAM->packet_cout);
7 W6 Q8 v- g# T3 U                count_copy = pshreRAM->packet_cout;. f, {" R9 o; o7 c" \7 j: J
        }
1 M/ C4 h. T. C5 R3 ~; P        else9 p2 L( C" Y/ o9 ?2 c9 z
        {
9 c  I% y6 ?% x: f- T6 Y                printf("No effective message!\n");/ p" I" e6 r2 P8 |
        }% _: L: U$ Q1 [
}; o# g. H. S  t  n
0 ]4 m6 c/ g  z) M' _+ Y) D' ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% p% F- P4 o/ }
: s: c# h( M- i0 \- z6 [2 e+ i8 ~2 Q  S8 |
- \8 H$ L/ j1 }6 Z3 B

6 W5 H) Q# N8 n) q




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