嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, f+ ]7 u. H4 @: f6 {4 H/ Q7 L8 R7 t/ B3 r' C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 S* z! M6 g8 t- L2 G$ G
#include <unistd.h>
/ d6 m) t) Y9 }2 d: a1 [1 f#include <sys/mman.h>6 |& l$ b- m& f$ J  J8 {
#include <sys/types.h>: L3 I$ V5 ?  Q* N. C* l9 C
#include <fcntl.h>2 |! N  R: a4 U7 M3 A( W7 ~

8 N0 R: `6 }4 c: a) w& t" @9 F#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ X3 A& s9 d9 v6 C
) H- C( w. k1 D6 g$ \) T
typedef struct
! W  n$ x& m" L* R% M2 n# S( Z{. h7 M& R, s7 W* a  A. C0 x
        unsigned int a;
  o& u, n2 n  i" x  {; V        unsigned int b;
' m" W5 [- E* p0 w, C        unsigned int packet_cout;
2 Y% }. R- l3 f  q% z! y3 W6 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# G  C- h1 j# X/ j  T  L% B9 K. f- q8 m. Z$ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& T" k$ y1 Q9 I6 L" {8 w
unsigned int count_copy = 0;7 C: p5 w/ Q$ s; q/ `* l
+ W. K+ u  T1 W% O8 |  ~, h
: \9 o& B8 I, J1 k; ^
int main()4 }3 K7 f& \6 e' W) J: i1 h
{" d" G& E9 U, j- e* L5 {& B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 V$ |  j4 |$ P2 g! _( {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 B0 d0 `# d  {0 R; [& i: U. R. |$ A3 v- e9 C! a
        while(1)
( z! p9 _$ X7 W        {' D3 ^2 N) ]) r: u. c* H# i
                read_MSG_buffer(pshreRAM);
1 q# f2 S" r7 B        }                / l  h& T: W2 e; D9 |3 g4 o
}" B+ e6 Z2 {, x5 I
7 R1 _  m7 s; I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ ~: A+ x1 S1 h* W
{
( ]0 w$ K' t2 R( ]$ x% C  s1 a        RX_MSG_PROTOCOL buf;
9 z7 }% j; J& B% L& n4 r2 y3 N        ' j0 r# o/ |5 K$ v6 L7 m$ {. O
        buf.a = pshreRAM->a;6 [; W0 ^( Y( T+ ^" }
        buf.b = pshreRAM->b;
" ]7 b6 Q/ t* `' ?        buf.packet_cout = pshreRAM->packet_cout;3 ~( H/ u; V$ W$ K9 H* N
        8 P- D4 q; q- Y8 q+ C8 P4 l
        if(buf.packet_cout != count_copy)
3 [9 c' ?$ f- A        {8 t8 v" P7 V, c$ p" n
                printf("a is %d\n", buf.a);) I; W% Q, ]6 [% A6 j, C
                printf("b is %d\n", buf.b);( J2 O0 \* b3 T2 w4 ~4 F1 W
                printf("count is %d\n", buf.packet_cout);
; E2 u/ S: [8 m: r9 z5 R6 ]+ O                count_copy = buf.packet_cout;
- ^: E9 g" u: Q+ |! P) ^9 x/ M1 ?        }
2 ]& {6 c5 j* g" i# k1 ^& M        else. o! u* {3 ^" [5 m, I
        {
) K8 p3 o, _( m: h4 d" r; T% {                printf("No effective message!");
1 k2 m) G6 K4 i$ r3 p6 f        }
- |& R1 `! _- y}7 q- k/ E# }0 l4 I7 ~% k
* T# [& F2 p: {" x5 v* r* q' u

, W/ O* D) R/ z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! c5 F7 I! g% @4 [使用下面代码,对内存使用了mmap函数后:) v: c% K$ y  Q
#include <stdio.h>  E9 r( o* n7 c/ l7 i
#include <unistd.h>
9 v  G# z/ O. G. f; W+ k#include <sys/mman.h>' l( m" e4 Q- d: q' ]# M
#include <sys/types.h>  ^- ?8 y# T) [$ f
#include <fcntl.h>
) x  n' C/ J& f& y* ]
+ c: n0 \) O$ g, [8 {7 w% O#define SHAER_RAM_BASE_ADDR    (0x80000000)3 ~6 s& }' S% c* ^1 o8 B
#define SHAER_RAM_SIZE         (0x20000)   9 P6 I% Z* t* ]* a2 s

2 o. C/ a+ F4 Q; H# P9 ftypedef struct
; h, C! K1 T3 V{
! w6 ~/ s0 A. i6 y) E) Z- J. q        unsigned int a;
7 @/ y. r6 j, b9 W3 K        unsigned int b;
7 R: w+ W- @% Z1 p        unsigned int packet_cout;
$ e2 D5 U+ U. J9 E5 U2 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ S+ [! Y2 n/ l( o' H" m7 g

) j; `, H, {' }. H2 dvoid read_MSG_buffer(int *baseaddr);
) M( z+ L# c! q! p  W& qunsigned int count_copy = 0;
" L  `' R  _! J3 E  j% a
9 P$ i' i7 m9 sint main()% Z3 v0 E# u" T$ {
{
7 o9 `- D0 s) h4 J5 ?9 B  I        int fd;
( |6 o3 u# z% l3 @9 Z        int *mem = NULL;
5 z) @: W/ X6 H8 W" L) w: M9 m9 G" B/ p' Y% l
        if((fd = open("/dev/mem", O_RDWR)) <0)# M# f7 n- T6 I% I; P  R
        {7 I! M; a+ E# b3 K9 W1 K/ C
                perror("open error");# G+ R$ V( @& c. w& I! K
                return -1;4 F  }, d$ ?  A! T
        }
6 r& o0 A, t8 u        8 m- d, D- y$ `0 }/ h) s
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' G8 J* V/ ^0 t, [
2 i" |/ e5 v$ V! Z1 p        while(1)" r" C6 M% z* V% @- V
        {
- o+ |4 i. u/ S# M: X- C+ V                read_MSG_buffer(mem);1 N; s# [0 Q: a% U2 F! R5 A0 d  U8 X; I
        }                & R# A3 I3 S  o4 Z
}
  s+ _8 m9 F% S  c3 J) I$ |- j2 \
9 Z! v: B# H. u% R: A5 c, Y/ `void read_MSG_buffer(int *baseaddr)0 O7 ?7 P3 B3 b! K/ B' g6 I
{
5 @9 \7 G& M1 ?9 x        pRX_MSG_PROTOCOL pshreRAM = NULL;
: M! e! O; m/ ^: p, P* B* h" s0 O" W; W7 E9 U' f' A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ^6 Q# m) r' X- ^/ e8 H6 j, W% L& m' i' n& y
        if(pshreRAM->packet_cout != count_copy)
6 Z. ^4 l( c- G        {
3 _/ t: }2 k$ `2 r                printf("a is %d\n", pshreRAM->a);
* P, J. w: a% x0 P$ _                printf("b is %d\n", pshreRAM->b);  h) T2 R& C! C9 Z0 ]; \, d
                printf("count is %d\n", pshreRAM->packet_cout);4 x' F7 [# [: \8 u; I
                count_copy = pshreRAM->packet_cout;
1 P! N* l$ [" @' t/ J0 Y        }
3 P3 V& M0 ]  b0 K" |        else
" Q- ^6 E6 ?; a& h( B, x# p        {6 e% z! U, `2 Z4 z! T! t
                printf("No effective message!\n");
: |2 i) B! q; {. J        }
/ s% u: J2 q0 F& w6 |}
7 U' f- g+ t/ S! A; P9 ^) @9 P& h" j. j6 [3 q) v( C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 B8 W5 t7 y$ H$ R  k7 Q! N5 X2 _
  Z% S( s: u& |: I" E/ V* i

: V5 Q9 t( [% {) G5 a$ {
; w( s* F+ Q5 Z5 j( z& I- O/ W! u% p) f( y! J4 c





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