嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # G" z4 z& f  {9 l
2 z# s3 s9 I! L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 W5 h% `5 C- c( E" t9 X#include <unistd.h>3 z% d6 P- J% e
#include <sys/mman.h>0 }* E/ w( ]% e; x, f
#include <sys/types.h>
  P- n9 p4 b9 b) H+ z% W#include <fcntl.h>1 z* f' t3 S. q8 E! U
5 p. y, r( c7 L$ E& r/ E9 w( n, n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" t) V8 y+ T! Q$ I" X% U$ V6 P5 L% Q
typedef struct
5 `' q* c7 L" u; A0 U% M{
, W  i0 B5 \: n) r' {        unsigned int a;  j- r0 z) r7 n5 ]* ]2 d8 W; `
        unsigned int b;
) p2 H: w$ {0 p+ |' G' N        unsigned int packet_cout;
2 _+ \; k* _6 Q; N* K, q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' Y$ H8 F0 y* k! u5 U$ D, B& R

$ y. v0 s% K2 O- avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 u. m7 ?6 E$ f2 X2 I8 o' q6 _unsigned int count_copy = 0;
: n- e6 g2 i7 I9 w+ A2 K4 ]6 j& }! Y5 x' \
% H& v8 W! U1 c" d' L0 f
int main()
) {5 a6 X7 B1 B+ i8 {{: C  R2 F1 l9 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( [& Y0 \- }# c7 ?/ {. ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 H5 ?. H- m( C) v% t0 j
( ~0 N# d$ F. C. M( {6 P
        while(1)5 ^: s6 C( g7 j$ r/ r8 H( a" S& Z+ O% W
        {
/ f( J  ]8 ]  d5 f                read_MSG_buffer(pshreRAM);& b4 r2 Z5 W+ ^
        }                ' p9 }, y0 g8 Z- F/ i
}' s1 i/ O7 n- `/ m

' O8 l+ V, i) a/ ?4 c+ _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& @# B, D, A' N1 q
{
% ^2 M" ?5 b9 o; O1 x% w3 r  ^        RX_MSG_PROTOCOL buf;: z6 f% x# h+ K  e( ^
        
9 ~, T2 ?' T$ {0 E  ~+ ?        buf.a = pshreRAM->a;( E0 U8 c1 t9 c( U9 K9 B# p* Q
        buf.b = pshreRAM->b;* P  [6 _6 u# u% ]) r' j
        buf.packet_cout = pshreRAM->packet_cout;/ S/ d* n# |; y, [
        9 g* I* L! }( B0 P
        if(buf.packet_cout != count_copy)
. r0 {( Y  e0 ]  `! ~; f- h" I        {
3 p! j* X* q% t- o. C                printf("a is %d\n", buf.a);4 T( j, S" B$ F) ?  b* H  o
                printf("b is %d\n", buf.b);
1 @* q! u4 }* O$ K/ o! ~                printf("count is %d\n", buf.packet_cout);
4 W. {0 i! a* B& H                count_copy = buf.packet_cout;
& ]6 S4 r- B" X5 Z( t3 u        }
. q) w4 [- \) B1 e/ s        else
6 Z2 `! j$ S3 I& A3 _3 N        {
) c. p7 W1 r: L/ S* I! @& b" h                printf("No effective message!");& X" E! b; M& |4 e0 V
        }
+ L4 C  }( L3 q) J& L: b}
, c! _; W6 ?3 s& L
1 j0 [$ t3 q5 u
! y$ [. N/ u1 }& l' ?但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! d7 O+ J  ^& h+ D0 L! }使用下面代码,对内存使用了mmap函数后:: N  h9 g& K* E5 B! s4 o
#include <stdio.h>
  E7 y( g3 O' ?* w( C/ D6 O#include <unistd.h>
/ a+ a3 E4 `' f5 w" s#include <sys/mman.h>! h! r/ Y, ^- A1 b3 ~
#include <sys/types.h>& Z' k& b, I5 b4 M6 T
#include <fcntl.h>$ J1 X$ U0 [5 |+ [; k/ }$ X( K& G

% `, a3 S9 o* U! Z2 y#define SHAER_RAM_BASE_ADDR    (0x80000000)
  U6 X" k# @9 j#define SHAER_RAM_SIZE         (0x20000)   
2 d7 n* @0 P5 u1 v9 g
0 \# L. I6 P; g% m2 Z! U8 U3 A) I$ ktypedef struct
) ~% o' e1 \& Y0 C{7 H0 ~* a  Z, L' r( f
        unsigned int a;2 z* h: F/ C* r$ c* i
        unsigned int b;
, N. ~6 H6 r% g* d. Q- a  v- I- N* W        unsigned int packet_cout;4 O. K1 `* }4 s6 d) w4 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ t' n: G) t% |8 w" W3 W! e! ]
- W( e- ]" l& u$ yvoid read_MSG_buffer(int *baseaddr);- E% d7 k5 b1 u" D/ C* l* j! U
unsigned int count_copy = 0;
. v8 W. r! k/ L7 N" ?6 z+ Q" g; p, J. G7 B! G$ `
int main()
3 W4 P- r7 V' q{; k) `8 ~) ?, I
        int fd;
3 Y" ^& z; H+ ]( l9 L        int *mem = NULL;
# y: t6 [  {7 @& p! V0 y& T+ d9 w1 L. G2 f' T2 B" z& z
        if((fd = open("/dev/mem", O_RDWR)) <0)6 i# R; ^% ?0 E) X
        {
( B) n" f7 I$ x. Z; \9 e  g) c; }' |                perror("open error");
( K" f  _4 p6 N0 d! q8 m- q' t9 B                return -1;
- T3 B/ j$ \+ c$ o8 e- {3 w& L        }1 Y( T1 e& p( a: s6 D' q& Z, f( S  e
        / I$ X/ t0 G. a% G9 @, h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; M; d/ E2 l+ q* W7 C) \. ~3 }5 [

* p# y/ q. D8 c/ y        while(1)" j, s" r# ?7 d7 x7 N; Z. T! L
        {8 {& V0 P/ M( u, U& v  e6 i" x1 B" a
                read_MSG_buffer(mem);
. n+ _) ?1 B) u& l' J) h# q        }               
' N* T- O* C  L6 x, L9 s( ^}
9 c9 C- s' w. u" M4 C+ k5 r7 i: I* ?1 v9 p9 U0 S7 Z
void read_MSG_buffer(int *baseaddr)% O- k7 [$ y1 ~, M) G' m* q8 _
{& Z% Q( p' V2 j9 J5 f* S7 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" s# z2 V; X+ o" ~) Q. A0 w
7 `/ v# t3 f+ r4 v% T% R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 b) g' S0 N* G3 q$ n6 l; ?

8 J: _  s2 J( x9 e8 g2 W% y! J        if(pshreRAM->packet_cout != count_copy)7 {& V# Q( y! D: }  e9 O
        {0 `9 _, A+ k0 c, R9 I' B( y
                printf("a is %d\n", pshreRAM->a);
: |! y7 F$ {% s" L$ s& ^( S                printf("b is %d\n", pshreRAM->b);. J; L0 v0 [/ Y* j8 _
                printf("count is %d\n", pshreRAM->packet_cout);
- e) E4 e! V) h+ {* w                count_copy = pshreRAM->packet_cout;
8 u1 F4 _) W5 H! \' M        }
$ H! s' v  Q6 M+ K1 Y        else
- f; ~  H+ ^; J8 @/ M        {; T& k1 o: K' I: t* r% r
                printf("No effective message!\n");
' s9 g+ _* {& L3 @5 p, g        }
; K; o$ R+ t. B  w9 r: b1 I}+ ^: W4 u/ r* K3 w! @

7 v2 |% _3 x1 `# W7 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 F4 Q) W9 N0 Z$ z3 w% C* d' ?& A

# K# `6 W9 I8 N! f. a, i+ Y
# E7 o4 G7 a, I
) _! c0 Y, x3 a




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