嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; n$ u8 p1 j- `& E$ M& Z* @
2 A$ F! E0 ?( X! u; R: FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 g( j2 I" Y4 i. E' ?: l
#include <unistd.h>; q) M5 `* G. S* l1 \) J
#include <sys/mman.h>4 [' h6 Q* m$ d
#include <sys/types.h>' c; W5 j5 C+ t2 N
#include <fcntl.h>
% _6 F% u: u( U( _2 W2 T0 R/ R6 [( M/ z; q& d+ E9 d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) @2 `: [: u# N2 F' h8 ~
8 ~" A: r1 i" U8 Otypedef struct6 p- ~3 M( f- x; e
{8 L9 t6 u' G& }6 R
        unsigned int a;
5 v+ V% ?! Q% z6 }* k6 |) g/ z" N        unsigned int b;
, y& @1 _: d" f9 U        unsigned int packet_cout;) |' R) E! J; y+ d( y' j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; S: M7 v9 F+ Q0 }. N6 v4 ^- c1 W2 n5 b3 n$ S& Z5 E6 W& ]# u' P8 y2 t8 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 Z3 e- [( T' j% G7 t- e& U
unsigned int count_copy = 0;
3 t5 ]' S' T2 I* ?1 t' e
( Q" U) I" H- e
$ D% a3 G, B1 l  }' d! {; g" I9 oint main()+ ~1 w; m9 u" u5 q$ e
{
- g/ ^# K- _0 c, p5 k. u) e        pRX_MSG_PROTOCOL pshreRAM = NULL;0 j  z2 D3 ?# b7 \: X
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 \3 I3 T/ _! }7 P  r

" p2 l0 N. y6 l6 r0 P        while(1)/ j, a7 B. b% ]0 d  m4 n# c
        {
4 e3 l  w! M  T! H                read_MSG_buffer(pshreRAM);5 f0 h, X/ [5 m6 T4 B/ l# w) L, c
        }                / o- d  }9 L3 J* {& [0 z% Y
}
+ n' b0 o, z8 K& ~( \8 ^
( G& J' C4 I- k+ O1 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 V/ f+ k2 K8 W0 j' @! Z
{/ ?7 Q/ R2 O8 ^! `1 y  b! m% W
        RX_MSG_PROTOCOL buf;! ]7 f& W: w2 g. p( S) }( K# J
        % T& B) i7 L. K; O! z4 h
        buf.a = pshreRAM->a;
/ c# H) _! S( w( |1 T! X9 D        buf.b = pshreRAM->b;! ?: `9 Q) n9 V9 p5 i2 l
        buf.packet_cout = pshreRAM->packet_cout;
! Y2 ~$ ^. p$ o6 \3 ~        , h3 p4 d( f( r( k* o' O7 g
        if(buf.packet_cout != count_copy)
+ v- d' o" @6 w# D9 c" p/ _% a' e        {
$ s0 C" N* {" d5 d8 u5 e& t                printf("a is %d\n", buf.a);
- M. t! R$ C$ q, s8 Q- \                printf("b is %d\n", buf.b);& m( K9 o, v) A( J( O7 ~: [
                printf("count is %d\n", buf.packet_cout);
% ~2 A1 ^, |2 z+ B/ M                count_copy = buf.packet_cout;% Y* Z% _1 p; `" T8 `
        }
+ L1 Q0 ~/ E# P        else
% G' K7 A. I) e. S) B6 {5 p$ k% c4 v/ ?! f        {
0 K3 F5 y  x/ O: l# H, W                printf("No effective message!");
$ z( R; n# D" M5 j  C* Q        }
# ?3 E) b" a' I}
2 r) J7 m; F( s/ `1 u! k! M# q, f0 C8 V* m" b

% w/ U. p  v8 u- ^! r# {+ b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, {1 Y2 H0 w( a9 ~( z  |* Z
使用下面代码,对内存使用了mmap函数后:' U0 A# \+ J1 F0 t: i0 q
#include <stdio.h>
% ~6 y7 B5 \4 Q7 v. v#include <unistd.h>" |* z( `6 }0 L1 J! t
#include <sys/mman.h>! |& m+ C- I" ~- ^# G3 \' Z
#include <sys/types.h>
' B% [- p6 a9 D2 W8 U& p& v) i#include <fcntl.h># p8 B$ O  g1 \) \
4 r6 G8 @, M- N. `/ \8 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 z8 A1 r/ b  o
#define SHAER_RAM_SIZE         (0x20000)   
0 Q8 A. G& d" o& Q# l
1 `( ^  Z% ^7 k3 O$ M% {typedef struct
# }  j( l+ {1 [# C+ e- _) Q, C{
! {3 J& q" @5 x" `7 g6 w        unsigned int a;1 N! K( b% T  u$ b. q+ V
        unsigned int b;' L) {' [: F. r# X# D' R
        unsigned int packet_cout;
, X6 N8 k9 }9 P& E3 p; @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! t9 \! e4 G+ ~: ?. {! Q6 G% P) D

) p8 `( k: e- X6 m# `! E7 ?void read_MSG_buffer(int *baseaddr);
: L+ U8 A4 N5 }) G8 s7 tunsigned int count_copy = 0;, u" q7 m" m+ O, J. G3 F

% K& k  ^, I2 [/ ~' Sint main()" ~( A% x0 p$ }5 d/ T
{$ `' a6 i1 \; m
        int fd;5 V7 _8 t+ L/ q& b' d+ u
        int *mem = NULL;
! q7 }; X2 K& d" ]3 e9 ]5 K1 J
3 J; ]6 q+ b; p, h5 L" @7 L+ ^2 l        if((fd = open("/dev/mem", O_RDWR)) <0): r7 G& Y8 O1 {7 r
        {
$ g. h; W4 `+ Z9 ]2 x5 l                perror("open error");
2 t; I( L8 I, ^4 g- [. t; ~                return -1;! _3 `2 Y. a5 D  ~6 Z
        }
) y& N0 b" j. R9 _2 g        7 v2 z4 w: C; m- A+ {' @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: d7 D- t' O5 \, C, M$ p+ w) p: D3 E8 Q1 \
        while(1)
5 ~; Z8 w6 f4 |0 b# O        {
* h; ]6 q/ c! f" w+ Q4 {                read_MSG_buffer(mem);' Z8 d9 B7 \; c0 H
        }               
( b- V7 E2 R; m5 k& j% z9 j3 _% [}
. l& C3 s& Y. r0 }: ^$ _7 ~
) `* ^  m# d% U/ y/ Svoid read_MSG_buffer(int *baseaddr)
% g- R1 G3 m; F/ o  U{% q8 d: h0 S- r
        pRX_MSG_PROTOCOL pshreRAM = NULL;% t, I$ G9 D3 g- m

7 X" O2 N) j) \" u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% V- q4 N- ~! h6 X  o

. m% e: N( J; y/ F        if(pshreRAM->packet_cout != count_copy)" a) u+ q: j! O+ ~3 t" w2 C
        {
7 i- `0 S# \8 ?) T5 j, l* {                printf("a is %d\n", pshreRAM->a);
: ?# |/ o# V# X* y                printf("b is %d\n", pshreRAM->b);
8 s3 y1 ?5 b5 a                printf("count is %d\n", pshreRAM->packet_cout);- I$ ?" W0 D( ?. x; K5 z; J
                count_copy = pshreRAM->packet_cout;
& J% B% s$ }& s. a5 R4 }        }
: k- X0 x' X8 W+ P4 Q( Y9 ^        else9 Z  e  |. L: c1 l. L
        {
" u0 v4 R, `% `9 L1 e                printf("No effective message!\n");$ u8 d. Z7 l5 `0 a7 P$ {, Z
        }/ L% d: x1 p6 D# q
}/ r$ P4 d, P  p9 f' d. B
( E+ U! `1 k  |0 \8 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; `/ Q2 U  _3 O, s3 z* G# H
! A. `# r  ?/ ~) ?- m

% c8 g! v0 D! P5 r, o& V  O  ?6 u3 H

1 b% d: b; l* u' C




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