嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ k9 q$ v8 v( \. D( w
* A4 |8 z' f, W: b- c9 w0 k* X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 K/ G1 ]: J( Z5 X- v" k' s6 q
#include <unistd.h>
+ F/ L6 q: |; Z  W/ L#include <sys/mman.h>% |2 x/ f. e1 s2 _
#include <sys/types.h>; }9 ]7 V7 }& U# y( |: E
#include <fcntl.h>- E% }; R+ ]* y/ ~+ C( [7 F
, u) }" f  D$ @7 }% i) E2 _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 A: [( W( C; S8 P0 I8 @! |# `: a
typedef struct
2 m6 I/ ~( p" j) A6 b7 u{
5 `: e/ ?9 L$ |; I- S' R- K  ]        unsigned int a;
# I$ n7 Z1 v6 z, l- U$ S+ P        unsigned int b;8 J5 |8 [6 Y1 S# N" Q) U; B
        unsigned int packet_cout;7 Q9 n/ m+ _- g: Q8 w" h* z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% N# P/ S8 k2 T1 S7 B( b5 c! l! y9 A1 O7 H2 q1 o. O6 U1 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 M2 b5 G- q# p, z& e: hunsigned int count_copy = 0;
0 o& h, u& @+ `' [: ?% ]$ R3 n
1 z2 {( d+ P7 B/ e7 f1 t6 R8 A- r$ ?) ?+ Q3 n
int main()
* o5 s* z  y. e# M$ \. f* L{* `+ ~" {0 ^% _3 i6 g) M
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ R9 L. K* F9 L0 I( ], Y# k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ I9 Y- {8 Q: f1 h

5 B* C4 d  e. [+ b% H- @0 @        while(1)
* W6 I5 b2 f* e7 a2 g( e' y        {8 _5 A6 v) W% D
                read_MSG_buffer(pshreRAM);
' J% K1 s& j' R; W1 w. ?        }               
7 |8 E7 C: U0 x- x}
  _6 }6 `' s2 I) c( N- X* x$ X; x2 ?: `2 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: \2 R2 ?1 f7 m. o8 [- u{7 i1 d" {- |& c& u+ t+ W
        RX_MSG_PROTOCOL buf;. s) U) A  ]4 R
        8 X7 |1 {8 S- W0 K, w! f
        buf.a = pshreRAM->a;( s) e- C' `: B1 z. q# x
        buf.b = pshreRAM->b;
1 Y2 q. ]2 K: j- e% i        buf.packet_cout = pshreRAM->packet_cout;+ {! n& r; t: `, ^& ?
        
5 n* N6 Z+ W; b' c        if(buf.packet_cout != count_copy)! J' g' S( z/ t, E; s' d
        {
0 w& u$ T! o0 x, V. h  L                printf("a is %d\n", buf.a);" A5 }7 Z$ w& k
                printf("b is %d\n", buf.b);
6 ?) G( n% I) b: i3 f                printf("count is %d\n", buf.packet_cout);
+ g; W2 ^6 ^9 r& @' N                count_copy = buf.packet_cout;2 A* u* O! f  m- K, h" @' V1 g# F
        }( `0 A/ R( l* q8 S* V$ `1 T
        else
) L: M1 D% G6 g4 p( X        {
/ o0 @8 h+ e! k" F' v                printf("No effective message!");2 E5 ^7 \# H$ ?- Q3 r2 ]5 ]( e1 X4 g
        }2 Z1 h* D2 i! h7 ^
}
  h! a4 o* j% U9 g, @' N+ O$ O! y; i: ?2 P8 X' k3 {7 ]4 ]6 r  i) D
6 X9 v2 ]3 ]+ J! h/ d. y; x8 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( y$ v& L8 }' D. x+ J; l3 X使用下面代码,对内存使用了mmap函数后:. \9 J: l6 ]/ S. I- w5 n) u
#include <stdio.h>
/ M$ V" ]3 F* ]- J& Z1 k. [#include <unistd.h>
+ G2 ~5 O0 p7 u4 x5 m" P#include <sys/mman.h>8 h; ^' c0 a1 Z; L8 U9 M+ B
#include <sys/types.h>
) p) r, Y, H# Y3 X; c#include <fcntl.h>
* c7 `0 K9 z( P2 D* D3 K* Q9 m! |" _  D
#define SHAER_RAM_BASE_ADDR    (0x80000000)' V9 P- L* p+ y9 v; j& |+ F
#define SHAER_RAM_SIZE         (0x20000)   
1 P- e* i+ j7 H* }' X$ W4 M& V% @
! @# h6 y9 O) ~typedef struct
# T; I' E2 y( S: D+ k2 O{  y; K$ \0 t, A' f2 R* ]
        unsigned int a;4 y! s* n( m/ v; n" b
        unsigned int b;" @' P2 O  G  f% S8 j& ]
        unsigned int packet_cout;
! ]) M& i! S9 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ J- v" [" i+ _4 _( m6 k! z0 ]
1 c+ W, v8 l+ u( V
void read_MSG_buffer(int *baseaddr);
' n1 S1 t: o# zunsigned int count_copy = 0;' x  E( r' n$ w- W1 |
# R1 ]* w7 X7 J9 F0 H! k" @) _
int main()
! N! u$ O& }4 @{
6 n: ^' i- i' U9 o        int fd;9 F; C7 C. ]$ K1 D
        int *mem = NULL;
1 U, Y7 j1 a3 L5 h2 q
. F) y% X4 g: g# Q9 }        if((fd = open("/dev/mem", O_RDWR)) <0)! ?( j& s) v5 ~& T3 a; O3 M1 h
        {
! m4 P& z) X1 {4 X                perror("open error");
: j: A6 v( U8 _                return -1;
: `% o# l: s5 h9 x( _/ H        }% E+ H. T) v, s) A) O3 s( d
        , A8 u# Q4 o5 k) l$ j$ M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, \" F+ }- @6 w) p5 X  W0 B) y3 E( l- H% K, w0 l% u8 w  d
        while(1)9 s: F* T5 w; n/ _
        {
! |2 C3 J' H5 y% E' t7 z  K                read_MSG_buffer(mem);) x1 ?% Q/ h# t1 M1 V" W% k
        }               
' L; e" \  x9 V}
9 Y+ |" N  t0 f1 I
, K' x/ B5 C% ~  _1 ^- w4 ]; X  Ovoid read_MSG_buffer(int *baseaddr). K2 _( W- c; N
{% O" Z: w1 E2 F4 ]/ O" y# R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 D) p) I1 f1 f. z' I4 N. g. @" t
+ M  ?6 w- A1 ]7 K3 l) e0 N) o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% u# l1 H! V7 G5 V0 O$ q; J, U- k; U# B# [+ J
        if(pshreRAM->packet_cout != count_copy)6 j/ O3 M( S7 h4 w5 r
        {1 g4 I/ \% r6 A2 m4 B. S7 P' G6 @
                printf("a is %d\n", pshreRAM->a);7 ]0 r4 [0 S& |4 |7 B
                printf("b is %d\n", pshreRAM->b);, O& u3 W4 y* K1 d! C( I: C0 W5 ]
                printf("count is %d\n", pshreRAM->packet_cout);
$ }+ e' Q  J* O, C0 u( E! H                count_copy = pshreRAM->packet_cout;7 g9 P- e, x3 q- Y" B7 `  r
        }
+ \6 L5 q& O( F( y3 [  ]        else/ g8 o7 c1 ~. |9 O
        {( @( b" u6 p! {; R( z
                printf("No effective message!\n");. q$ J5 H6 |* J( d& g6 n& r2 k
        }! ~. k( D' n( p- B: |& _
}
# Z% c. W% B9 m# M/ m2 o2 y
) c0 c1 P1 x# M# R没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 A* D" p! o2 Y; Q0 _3 t

/ I: L' t; z# W% s5 `2 j( w" v) ]- k+ ^, t& H" B

4 |2 w9 V  M" v) `0 o
+ d. G* n8 p$ U# f6 N0 o




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