嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 L0 f, D6 Y( f/ H
& r4 R: A! E+ g0 w/ d* ^9 tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  U( D" T' z( ^" e7 j  X4 C) V0 u# q
#include <unistd.h>
- K: l$ O" D' t& V#include <sys/mman.h>
& g4 p& R2 @$ A#include <sys/types.h>
8 b1 k% I% z7 w; B#include <fcntl.h>
. @  T, I+ n: D' Z0 _7 A  F7 e+ p/ g/ H( ]% S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; \9 o, q* L# P: P+ _8 ^) }

" S% j5 t& e# k% i1 qtypedef struct
  J9 y, g, F" j8 F- m4 G1 @! N0 U{7 q* Y, w, W, D1 O' c% h3 }9 G
        unsigned int a;; A8 S' S0 _. E/ T2 H
        unsigned int b;
# w8 t$ E; s4 g7 N7 e- W        unsigned int packet_cout;
2 M! V* H( q) S( {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# K7 P2 [! q2 C9 J6 W" }
$ Q( z. ^5 Z% J4 I1 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! v' n  U: Y0 ?, _( s) |
unsigned int count_copy = 0;- g/ M; [! S* M) f8 m/ y6 F" r

( w1 y0 B; ?7 _! h2 h; w' K& y
% g/ D  S4 w9 lint main()
7 |6 t. A- Q" @+ B1 o+ p{
! b( N  X5 X) l( `        pRX_MSG_PROTOCOL pshreRAM = NULL;+ v/ I: }- s0 _5 W1 b  }& f8 s( i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ C$ Z+ B. U6 o% a  {+ G8 m0 z4 m( e) B9 a% A8 ^$ h: ~
        while(1)
% N5 T5 p% m' _7 K+ D        {3 U1 V+ c7 S4 h* q) r* w
                read_MSG_buffer(pshreRAM);3 B. b3 Y2 R/ J6 N, P  q  ~
        }                5 ]* V+ k5 P% @; _- S
}5 i; x0 V% ~- H* q7 D/ H, A8 N
. y  U/ G6 p2 z) d1 E+ r, Y' T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( D4 m5 H# B) Q
{+ q# {# l* l# k, ^5 A" f
        RX_MSG_PROTOCOL buf;
: K% u6 n4 }, E9 b        
( [# ]% n- P; R+ a        buf.a = pshreRAM->a;2 N! j; w5 n1 ~  _5 h5 `3 u
        buf.b = pshreRAM->b;4 A- e4 f: w# s5 C1 \& ~% E
        buf.packet_cout = pshreRAM->packet_cout;: U: U6 ~. U. {2 _. F
        
: a5 [- {2 s# i0 U9 U$ x+ a        if(buf.packet_cout != count_copy)% G1 d4 s4 A7 X& T) |5 E
        {* T9 m+ P5 H3 g
                printf("a is %d\n", buf.a);
2 I4 [- w6 Z/ H( C$ R9 e; h4 v; j                printf("b is %d\n", buf.b);" K4 N4 |- w! Y& q! k
                printf("count is %d\n", buf.packet_cout);
( B+ P. A1 L! I1 T! O                count_copy = buf.packet_cout;
/ _2 r6 m! u' l        }
* W; q7 u( }- F* b        else
3 A0 E9 Y2 \, Q; }& ]        {4 ]8 n$ `7 d  |
                printf("No effective message!");& ?. S+ B# S0 [+ d7 v  i
        }
9 P( l  M: s0 U6 x+ M* C& x. m}2 l1 m# _* {9 |; T& c
$ J4 K: r1 m1 L6 y6 E/ W! g
) \4 [* f4 w) ^9 t% W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ~2 l5 I8 X2 e9 N) i2 v使用下面代码,对内存使用了mmap函数后:8 J. h  S1 s- W% R& Z/ f
#include <stdio.h>
( _1 p, Q/ w2 R' p$ n* Q/ o#include <unistd.h>
6 w( A: c) K( f7 C#include <sys/mman.h>
- A) K/ @. X: E4 V4 A; J#include <sys/types.h>
. v% ?" V7 ?7 W3 }' c#include <fcntl.h>: g0 W2 D% c( K/ D9 n. O
' l' \# S1 P4 A& |
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" O8 V' R% U% O#define SHAER_RAM_SIZE         (0x20000)   
: y- P2 L- Y+ n* m0 ^& d5 y- x8 q+ V: t% w7 }
typedef struct
: I; S9 ]% `$ x6 N{  ]: C9 {3 W3 r. ]& C  X$ S
        unsigned int a;' p5 |& F" n( L: Z; l6 n
        unsigned int b;) T" z6 d$ u4 X+ {8 w
        unsigned int packet_cout;
6 `& {% N# Y7 j2 W" R- O9 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 a" Q1 }& K: ~( p8 l$ J+ R- x
* r& z' K3 h! m7 S" Z' U2 X9 ~: ^$ E
void read_MSG_buffer(int *baseaddr);; ~% t/ D' q4 x% Q9 W: b
unsigned int count_copy = 0;
1 G& q& m; a+ o- n) z- i
. Y9 |& E6 h& @6 V  ~' Tint main()
/ r2 s" R% B7 E" R{/ a9 c  W# b3 l- Q$ R* `, {. F
        int fd;' U' b% z! k3 P3 b- ~2 z
        int *mem = NULL;! v+ \5 f! A  D" t- o% A
1 k6 P' \0 t- F/ C+ P6 I1 H# \: I
        if((fd = open("/dev/mem", O_RDWR)) <0)/ S* ]8 d& h2 M* `1 }+ f
        {
! D+ }& e2 K4 i                perror("open error");
. n/ v8 {; k9 [* p" G                return -1;
9 H2 ~  P- ^; j: j! o        }3 D0 L1 J7 x7 W
        8 e/ L8 G) ?8 H# Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 l# @" M  R% V! \6 x$ Q! I7 E* y& `+ Y' z
        while(1). ^' [/ z( t1 O0 e2 s7 ~$ z
        {9 k5 r9 `: K" ^
                read_MSG_buffer(mem);
) R3 z+ w) K0 G' d( N$ c        }               
  ~. E+ q. e! r& T* N}" i0 B" s5 H9 B

: W% u3 {, u& N% i. I6 s! Tvoid read_MSG_buffer(int *baseaddr)5 K, Z9 {3 O. e/ ~  b9 s3 j
{( y; }$ T, A/ K
        pRX_MSG_PROTOCOL pshreRAM = NULL;" q: R/ z6 [% ?% g$ ^& M

5 j5 P, R2 l5 T) m( V% s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ O3 ^7 o# z" D- E# [4 U
7 ~. I6 z* J* j/ x' e- I( k$ J
        if(pshreRAM->packet_cout != count_copy)
" B* c) r8 F$ _7 C& w* ^$ W7 R        {
+ E" ?7 J( m$ ^2 b                printf("a is %d\n", pshreRAM->a);
6 a2 s5 m8 k: P; |, r, a4 r                printf("b is %d\n", pshreRAM->b);8 k1 A; q+ u1 A8 g) F2 P
                printf("count is %d\n", pshreRAM->packet_cout);5 H( ]$ S& f; j7 z
                count_copy = pshreRAM->packet_cout;
7 [% y( M1 K6 |' j# }        }) M. z5 t  X1 a
        else3 U: |! H, T# ?. _/ N  ]: \& @
        {, l( H; ]- i0 z# o* i8 g9 t
                printf("No effective message!\n");
- w4 v; D6 R! q# s        }( q: A* d$ K: q4 D5 ~3 d
}
7 Z2 V* n; d, |& F; E- f
9 _* Q. S" c2 w( A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- _0 t, B2 V# {  X3 w2 O/ F  b' K* C( l+ E
; w' ?  y8 `- H& o" h* L& h

/ Z9 {+ |: y8 ]  L# N* W# D& e/ E9 M2 w* W9 t





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