嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 K: q6 e& j2 e4 _7 J1 D% z: h2 h& I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) f2 `5 e( ~4 p  D; r6 [* W3 }#include <unistd.h>; E+ I; s/ t  G
#include <sys/mman.h>
+ T8 G- k: m- J1 n0 ^) F#include <sys/types.h>
* S4 P& f& \( E- @4 X8 g#include <fcntl.h>
7 y4 R4 i5 M0 o" a7 ?$ p4 a! ]/ v# V
. Z3 P5 V9 H7 N; N, E) ^: c# r#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 Q/ u1 C% v8 e( j$ v4 ?  y1 q
) _5 |/ A; W0 M$ r- j3 d; ~typedef struct* y# g/ g- z6 ?
{; G: L5 @5 V* U
        unsigned int a;7 V, u+ U' Y1 e! S* c# w
        unsigned int b;
8 _& f; E. I9 X9 _, b$ m/ c: t        unsigned int packet_cout;
0 z. I8 |  }7 `" o9 W$ L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 g( r( M' Y! ?/ X3 ?% u
& X6 S$ E& }2 \2 a9 N: Y' `$ Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" y$ |1 [3 ~2 U0 r" uunsigned int count_copy = 0;0 v  A+ W" Z' v% O. T5 l0 z& ^" A

) v, a5 Q$ s! z- o: g' Q$ h9 g, m( S, o+ C- C9 X  W. u- e
int main()6 Q& q8 Q$ Z% h% e. b( k- f
{. z9 z* Z! S' H5 g
        pRX_MSG_PROTOCOL pshreRAM = NULL;( o: C0 J5 S7 {# c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" s7 n- U/ d- M5 `, v/ ^$ \
4 p& I) v* k4 K        while(1)
7 l; Y: P* ~) d1 g        {* ?. s7 j. J; m% R+ k3 Y
                read_MSG_buffer(pshreRAM);9 }" Q) c" w$ R8 @5 x0 J
        }               
9 A" l# P4 [5 k3 s& s}' |. {8 Y" \+ L! E3 Z2 H

; L' C- E( w: W/ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 o4 u3 o% q, y6 h& m  [9 a3 x% j6 N{
6 p# s, P% y9 J/ k+ G; T6 Q! S1 ~        RX_MSG_PROTOCOL buf;
! V6 e! g( j2 v! `  z* u        + e+ [1 h( V3 b8 d. D
        buf.a = pshreRAM->a;
7 u" x: z* L4 h$ `: X) J        buf.b = pshreRAM->b;
  ^( {" z7 H% {) j" n        buf.packet_cout = pshreRAM->packet_cout;0 V+ P2 a( U& ^; @6 C+ r  Y/ t
        
" d$ ]" j4 `7 Z/ R        if(buf.packet_cout != count_copy)& ]- g% l1 R% k
        {" V; K, @5 b0 G
                printf("a is %d\n", buf.a);
. o0 O' v  X! o& B6 _8 c                printf("b is %d\n", buf.b);6 r3 M! ?: n+ `* W6 ?
                printf("count is %d\n", buf.packet_cout);$ K) B' ]: m1 |' G1 Q& L
                count_copy = buf.packet_cout;# m$ I7 g! q  J/ H7 t
        }9 R+ S9 M4 F# l) G
        else
3 m% m" _/ o4 q/ A8 C# O% {        {' u/ N3 V2 w1 L
                printf("No effective message!");
/ m! v  I$ G% B% K2 j        }
# Z5 q( A" z& K  \% g0 \/ U}' ]. |' T) S' U' s

" ]! }1 U3 z7 f" x. G. t$ i' r! w! J# O0 y: r) M. x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- }3 w& W0 P, |5 [, x1 H6 p* a
使用下面代码,对内存使用了mmap函数后:) \  w% @3 q  Q( v
#include <stdio.h>
- L" U+ j( c' q3 i#include <unistd.h>+ V( d2 H  u$ p4 g( d. x. |, K1 l
#include <sys/mman.h>, Q. M) R  p" {
#include <sys/types.h>
; w; Y/ q" I" Q/ T/ w4 X#include <fcntl.h>
4 q8 r8 U: B+ G# V) R' w0 _1 H! K$ l: j, |% C3 ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, w$ v' {: C8 |# i/ W- `! w% x#define SHAER_RAM_SIZE         (0x20000)   2 X- v3 K6 j( C4 k

2 ~2 B$ v6 _9 [$ |# p- vtypedef struct
, r5 s& B5 v+ K, q) M& }{/ c. s9 H! p0 G6 O8 y* f5 Q
        unsigned int a;. D" y& U6 u7 X0 q7 N0 {
        unsigned int b;% u4 V" y: p* g/ ?
        unsigned int packet_cout;
/ I9 w5 Y' ~/ A) N. N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: _. l; a, k  w
: o" Y3 w" S& M. v
void read_MSG_buffer(int *baseaddr);
. P% s3 e9 w0 Dunsigned int count_copy = 0;
/ P2 G% ?# ?3 ~* Y1 d( J: u1 }7 k4 n; o5 {
int main()
8 |4 M$ k7 ]1 \; f2 H# b2 S! D{
* u7 A9 B) r4 V        int fd;
' n1 u; A- [, }        int *mem = NULL;5 L% D/ p( }: E* B+ f, [* o, u
1 X6 M& b3 ~1 I- e/ i3 }+ \2 I$ E
        if((fd = open("/dev/mem", O_RDWR)) <0)
* d7 \! z8 t6 }1 J        {
7 F( H$ K" Z9 u" T0 `& G: F: n                perror("open error");
4 c: i6 n4 ]5 f# z3 t! V2 s+ S                return -1;! q5 S& C# `8 ^1 Y: q, ^1 f0 a4 X
        }
& [1 f- p" p# i/ v0 t' G5 n- i        7 i/ h2 [: y1 ?: V1 g1 Y. X& u( s" x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! n8 y8 i! p1 M% p1 |- }2 t+ T) O

. l( O, I+ ?0 L- I+ s& k        while(1). i5 V! V4 c% z( X3 X3 @$ b
        {
* D9 S& C# G9 z) m                read_MSG_buffer(mem);
, {- i& N/ x; L  z! w        }                $ Z4 I7 s) p2 W5 I* K. I
}6 c$ s- D! h& V5 M

6 U3 L& k, o2 r, M; ~# Q0 P3 r: dvoid read_MSG_buffer(int *baseaddr)! }( M! \0 i# V' z! S
{
5 F/ j6 q# N8 N0 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;- a2 S( [5 H1 ?3 y( w/ b
9 W1 X+ r- a2 G6 M/ {0 d/ d3 Z. q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 D" X7 k% w5 K* d
+ S7 q! B  {# ]# R        if(pshreRAM->packet_cout != count_copy)3 a* L5 O  o6 S1 V' V
        {
. ~& ^9 a" @7 u. T% {                printf("a is %d\n", pshreRAM->a);
" f( A8 x8 }( D9 U! h                printf("b is %d\n", pshreRAM->b);
4 y5 K! m4 c: s6 D* I                printf("count is %d\n", pshreRAM->packet_cout);; \4 s7 |; W7 o+ `
                count_copy = pshreRAM->packet_cout;4 b. n% r: [1 x- f
        }0 |' @4 {  h& h. _1 z* Y. ~
        else
: @9 o0 i7 {7 I        {( u. m  d5 u. s) U5 z$ k' v
                printf("No effective message!\n");7 G) J5 R, W, \  r' j0 s
        }
+ A: ?4 E+ V$ w: ~$ i: v; w, b. M* `}
: l/ Y6 p5 \, @9 D. u6 U* F; D0 U2 n3 p8 N( c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 v  g! }4 I. y2 Y# P4 a
+ `  m$ A& a" X+ E% Y( ?' G" \2 w, a$ Z7 y/ F
3 @2 e' s! y; d. @# ?
- X3 F4 U- w, w1 G) l





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