嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   q' O4 p8 \* a! E) f' [

2 U+ k5 |* z5 s' cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 i! }  M$ O0 B& A- P
#include <unistd.h>+ B$ L2 J, R- N, W/ l
#include <sys/mman.h>
; [7 e/ A0 S* w: F, F0 E& S( I#include <sys/types.h>" p. z! Z; @* p  g5 H; l
#include <fcntl.h>: N( ], \3 Z0 D1 K& i& x
$ V' l: h8 a# G" [9 z7 ]# N1 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 I' z8 n$ K! l, N  G5 k" P& _/ f1 i. a1 }2 x, ^. d% M9 P' T
typedef struct
8 _/ A6 m7 E0 H# m( s4 f{9 s' j1 N2 u) L& ?1 V+ v- V
        unsigned int a;
* G' n9 y2 b* w4 w! V  O5 B        unsigned int b;# R( t+ x. Y8 B* l
        unsigned int packet_cout;
8 z; c9 R+ e7 Y, c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( ?7 |' M2 @8 ^! H- w: P  r
4 u+ y$ p8 I! _7 a+ G; A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 h, V! }+ g; m" t/ x7 p
unsigned int count_copy = 0;( x2 A7 y$ Y$ D& K- M' _3 r5 [

+ v& m! L/ h& @, q# x2 q
& ^9 Q% m) K0 Y+ rint main()
7 P8 o: P* D* C1 q. E% P) n1 U{
! k- o4 {: I/ W# ]& d        pRX_MSG_PROTOCOL pshreRAM = NULL;* F' |) y. E  {. }4 W4 s8 H6 z' N
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  h/ L  S7 |2 M
- o7 g& z4 F) o- {% ^        while(1)& S6 d5 U+ n* [: x# v0 h% e$ g8 G
        {
2 ~: a! U' X9 m1 A7 K% m. ?( O                read_MSG_buffer(pshreRAM);
, I& w/ f2 ]0 j0 _: m( B        }                4 s  U) v) e% C9 c; k2 ~
}& ]3 }; c6 Z4 x  N

9 p: ^& c) W1 _2 v: V* k5 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 b3 e' k5 t  V, c/ ]
{
( ^9 [2 b, A* T, t) O        RX_MSG_PROTOCOL buf;
7 L3 _7 G, s. Q; i- y, v        5 t* @' `! K  k& G/ g" f
        buf.a = pshreRAM->a;
+ q2 h  \  R9 \. k( ~  |. M        buf.b = pshreRAM->b;
# [" \; _; X) j% t$ a2 L2 n        buf.packet_cout = pshreRAM->packet_cout;$ ?& B: s$ m2 q
        
! ]" X- o& {  F  [        if(buf.packet_cout != count_copy), M1 n0 R& k+ c5 A+ f
        {3 ^8 O& \& E, W/ G2 f
                printf("a is %d\n", buf.a);. ~4 S! H( J0 X& N
                printf("b is %d\n", buf.b);4 V3 h1 x! Q* X
                printf("count is %d\n", buf.packet_cout);' R- [3 c8 E; r: t
                count_copy = buf.packet_cout;
5 d4 z/ D. a6 F        }8 c9 Y+ A& t# T: _
        else
$ J; ~4 g2 _1 k1 k" E( i        {/ w0 T% F  e9 u1 p) y8 c. n2 u
                printf("No effective message!");1 B, A1 O" \3 b( \
        }* i) t5 Z9 F& ^% q. ~! G
}
8 `( _! @& S8 n
' `" N2 h9 U. {8 w. W: U2 u
( W: |& Y. c0 m& y; s  n0 u! j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: D) J; \0 ?3 `$ R8 F# k
使用下面代码,对内存使用了mmap函数后:
8 y% {. i0 y. \0 h& v7 a& S#include <stdio.h>
! ~" U, j; L- ^2 s! f, @#include <unistd.h>
& V8 F% B5 v+ G0 {#include <sys/mman.h>
# `$ h( s7 ~2 ~! q& L4 A#include <sys/types.h>
# {) J$ d: P0 x' w7 \. K#include <fcntl.h>
9 C; |( `, k2 w- b- G6 V& m) z: J5 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" f5 k4 {* K( d#define SHAER_RAM_SIZE         (0x20000)   8 i- V7 U0 ~) J* x7 l. |
2 w4 v1 g2 l: G* {) h  y6 x5 i
typedef struct
  z) I* |8 D; n% f& `- w6 a1 |{. \+ Z3 g. l& q: R" _9 Z  G3 O
        unsigned int a;/ @% E! G( [+ D3 S; P4 @0 @# v" b
        unsigned int b;  P' s' ^% g' y7 F& _
        unsigned int packet_cout;
! H; X. J: N4 F0 z1 S& q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# k# U/ R3 X+ \3 X9 h- B
! X0 H2 D( d" u0 m
void read_MSG_buffer(int *baseaddr);
- C1 z6 V0 Q* j% S3 eunsigned int count_copy = 0;
9 F0 \: p, G- q9 b
$ `( Y( h: N' S3 N2 A4 c1 p0 Lint main()$ I) O2 U% E% m. g9 f
{7 t+ z. S* n- ~  Z0 R" M
        int fd;( `/ l% f9 Q, ~/ D+ s
        int *mem = NULL;
( `: M; ~% {4 X7 [: n1 p! V" L
) W# y7 J' ~  g) n6 `        if((fd = open("/dev/mem", O_RDWR)) <0)
* V& ?$ p6 Q+ \$ z" O/ u( F        {5 F4 Q' ]/ p$ B) n
                perror("open error");& t" L, b+ w% y1 T: @0 K* t/ ^
                return -1;
/ I" W) D9 E; s! j0 o        }
+ E4 m1 p! b# L0 h$ e4 X        / F# I4 |7 y0 d1 y5 _! N) z" [$ n
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) [, ^( O7 u+ r7 K  _2 q
) M' ~+ X4 i* i# n
        while(1)2 M3 p3 y9 }5 y! |% V
        {
9 E1 X) ^* T5 Y; g7 e* |. q                read_MSG_buffer(mem);  b. l! Q7 H2 g7 Q% @- O5 Z( l
        }               
( l  h3 \7 ~+ J/ A6 \0 a}
. Z, `9 ?- x1 n6 u& g# v+ s, N% Z( l& |2 N: ^% i
void read_MSG_buffer(int *baseaddr)! y; I/ i4 \" |% @0 J7 B
{4 s9 B$ z* p6 n/ j
        pRX_MSG_PROTOCOL pshreRAM = NULL;# t2 s  q! h$ W* P& C4 Y/ s

* ~( l: v% N5 b0 C/ R/ O. _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* k! e% l5 {9 o6 U- T9 T$ j' v: h" {; p. z$ e% M5 I: U& i& W. O- |
        if(pshreRAM->packet_cout != count_copy)4 j' w. w  C- J2 A/ X4 i
        {  E- t+ _% B0 e) Y+ J$ M4 k
                printf("a is %d\n", pshreRAM->a);: W+ C0 b' x: v: Q2 c
                printf("b is %d\n", pshreRAM->b);3 t( ^. g1 ^  Z: M& T6 k
                printf("count is %d\n", pshreRAM->packet_cout);
1 r% J+ f' [4 j* S$ Y3 C! R                count_copy = pshreRAM->packet_cout;9 p6 ^8 B9 Y. I7 e: ]; Y: s4 F& [
        }
: ]! `  l6 _/ h2 M# Y2 r        else
) g2 B- R6 Z! @1 c+ S        {4 E3 ?# R" p7 R5 J, b: J4 G  l
                printf("No effective message!\n");2 g- f. R' r, D0 @& s
        }
: ~0 A0 N. p! D4 i' M' ]3 f9 I}
! A( M4 k( ^) T' ~" T
! b) R; `! u: ?9 K( A3 C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, {. s* j# u' c5 V5 R
. a' x/ r1 E% a& `: U: W. H

7 h# {( e+ {; O  z+ F* r/ }9 B- E% {6 q# k5 U+ u$ F  u: R; r
. N6 u5 i9 Q( w: f2 I





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