嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 Z! N2 j# ~5 B7 I1 T, W1 m; S

9 P9 g1 Y. S+ M3 J5 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ Z& v# v: |$ l9 u2 W) f& V6 K  S#include <unistd.h>  g* T/ S' X: t* Z. ~" ^
#include <sys/mman.h>
  M# v( E( O) I* f6 \3 t. {0 x#include <sys/types.h>  B  Q; `7 E) i& p9 u3 K
#include <fcntl.h>3 w- ]2 G) I. j. t7 u4 V

% P2 Z. d) q: g8 K5 r#define SHAER_RAM_BASE_ADDR    (0x80000000)   % Y* p2 w/ S  b) U, E+ D

9 Q+ M4 A  V% [& X" P# ctypedef struct
% G/ L1 H6 b2 I, J7 J8 O: h& n! l{
3 f3 j% {6 K% \& D        unsigned int a;
6 ?0 z* j- O! n- I        unsigned int b;/ [& F. N5 B/ s! Y
        unsigned int packet_cout;$ X! g7 s& e% c+ x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 l: Z% X- V. l" I
3 g) |- z; V8 f/ x* Y& }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 p5 `) p# h7 D4 I3 X* r0 y
unsigned int count_copy = 0;% c5 a$ X9 ^$ _; [+ i
  c4 r' d' Q4 v% F. @# Y( e
# A+ a; Z) z. y4 q* f1 e: F/ v
int main()$ \; R0 F$ o4 V9 v
{: p% |8 P) [% P& L1 v8 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ D0 ?5 z/ {5 j7 x: m1 ?# X
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 j; }$ O" \, q9 G! r4 ^6 Z8 \
% B' B8 A: G. @! f. B& l        while(1)  p, t. Y' o) [8 Z# u( w+ j
        {6 {* f% z2 Z! n" I+ e4 Z" c
                read_MSG_buffer(pshreRAM);
) O2 _  m7 i; n& y1 P* d        }                7 b1 f  K" Z) H9 V3 u
}
: ^  x9 m" v9 q2 w; s9 i, p+ Q8 i" i7 E  ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 M6 C5 [1 \8 n/ f* j& q{% A* W/ r3 D' a, ?3 N
        RX_MSG_PROTOCOL buf;( P( ]3 K) B2 L- Z6 f0 `1 m; o# X& c4 e
        * Z# [2 D6 [$ C2 [
        buf.a = pshreRAM->a;+ s( w0 p' `# q3 k. d& n
        buf.b = pshreRAM->b;; E! S2 |3 R! N1 _
        buf.packet_cout = pshreRAM->packet_cout;% S0 P% `) k; A9 N- J
        
6 k8 c" x7 u3 d% i* M$ i7 G        if(buf.packet_cout != count_copy)
3 A* q9 y( w; z. V8 ]        {: z/ X1 S# ?, y. A+ e
                printf("a is %d\n", buf.a);3 _  M2 R. q1 T; r
                printf("b is %d\n", buf.b);- |8 `8 q2 i1 |1 u) V
                printf("count is %d\n", buf.packet_cout);6 M; u  ~  B6 Z7 s# _1 Q8 q! I
                count_copy = buf.packet_cout;$ l, J& f' \1 {- t
        }
* H0 e+ M+ @& F7 }' A        else
# i: w% i. a/ j& u5 ^& o! s! A        {4 H4 e$ h; J! o9 P
                printf("No effective message!");6 U6 B) f2 s+ R8 `5 x6 d$ v
        }
2 e+ t9 w. n/ M; [! K}$ x7 ~/ j( t* e6 k7 g7 f

5 g2 l1 [; \2 |( K& t6 U4 \$ B4 R4 q( r+ m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! l" x% Y+ @" n" r3 g; C* f使用下面代码,对内存使用了mmap函数后:( ?$ T3 t) m1 ]
#include <stdio.h>
4 w  l0 C4 i0 w1 k/ w#include <unistd.h>! g8 U8 U; J5 l9 S2 L
#include <sys/mman.h>" l5 C/ s6 o* @" E! p9 U6 P
#include <sys/types.h>
! G& V$ }8 k' y+ M#include <fcntl.h>  ?; z0 n, B: k7 \' n( D

. D9 m8 ^( k1 U) _" {; I. G+ v#define SHAER_RAM_BASE_ADDR    (0x80000000)# \: T( Y" ^: ?& j$ R+ [- f, |
#define SHAER_RAM_SIZE         (0x20000)   , p! `3 \" y% I! I, q; m

8 _: W7 X! d2 H2 ~0 S7 A" Y1 U" ktypedef struct2 |  d0 ]& G6 [2 f
{2 H) ^2 {- M6 v9 b# n; o
        unsigned int a;7 R6 t+ f1 ?) `$ p' ^
        unsigned int b;
* ~! N# C0 d/ v4 U% E: e        unsigned int packet_cout;  I( S" U9 X# a  x, P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  I+ e7 Q, F# W8 I3 }0 E
3 k% r( s" P; O- uvoid read_MSG_buffer(int *baseaddr);
- |; u& {: r& z* i8 Gunsigned int count_copy = 0;5 r; s" `+ k$ R9 M+ i

4 O6 W3 }  r/ A  O0 Wint main()
/ d- ~$ E% V1 Z/ @1 p{( W! v( y5 M# s' R. k
        int fd;
5 y0 J+ J- T# q6 C        int *mem = NULL;9 C# B6 H5 l( K: m2 M* r! ?

; x  K+ ]4 y1 B, n        if((fd = open("/dev/mem", O_RDWR)) <0)+ Q( O9 I$ y1 S! @: a
        {7 C7 e( |: ~, T) V' @
                perror("open error");
# q8 ~; S/ z6 E6 T6 b- ^6 d& e0 d1 ]                return -1;6 b" `" k# q8 Z* L8 V' F
        }
0 O* m$ A. ?( u' m0 ~' o        
+ i8 n" u& h1 R, ]3 t7 W( w( C) s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ d/ y" S+ M* k3 `9 w3 j% t/ W( G0 n8 P3 P5 [: t$ U% u
        while(1)
6 t6 K& ]& Z; m  h% r; v        {
$ D( _/ Q3 [  p: O& U                read_MSG_buffer(mem);
! Z/ O- Z' O* x! w        }               
9 I' r, P) _# b2 c9 N2 G% c}
- x/ |# x4 ?$ g7 k
; w- d) J  f0 l% ~1 k4 [void read_MSG_buffer(int *baseaddr)( S( X$ H1 J* q# _$ p$ p
{; R# p+ g) D/ g2 l2 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! Z" D/ w5 e6 w+ W  k. t# P  I5 G( {& \' P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# n# Q4 [: s) V( e1 T  _: F: ?+ S( U- f6 n
        if(pshreRAM->packet_cout != count_copy)
" F5 N+ E% g8 z  R5 I        {2 x4 q+ U: a& U: N5 r" B3 n) d
                printf("a is %d\n", pshreRAM->a);
+ `3 {4 Y) k. |& [5 Q7 _                printf("b is %d\n", pshreRAM->b);
0 S; [: ?" r2 ~, W6 N/ c) P. p                printf("count is %d\n", pshreRAM->packet_cout);
6 S8 z9 I/ x# l4 W' Q  f                count_copy = pshreRAM->packet_cout;
/ j# C8 l+ n% b9 `        }9 Z+ A# R. J8 V& v) k
        else
  g( r  G& x) y3 ]9 f( ~& e" c+ @        {
( r+ @& t( M: i                printf("No effective message!\n");! H; |) k# v2 ~. h% I+ \' I+ g
        }' e. L9 w) p/ ~& d5 |1 ~2 q0 ^) ~
}
( @8 I8 u+ T3 s/ O% L' X; F1 J4 [/ X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 Y, D3 U& C( R

( a# @4 e5 i! L3 U9 b$ e% o
  d& c8 d- I: _- l: O
+ L# r( ~* n7 d9 L8 n( S2 o6 K" w# Z, T0 }( u





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