嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . o3 ?! F$ U# `: M, n9 G

6 C  W' q! M9 z5 v5 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% K7 _- Z1 X6 P1 V1 G
#include <unistd.h>
( S0 m4 Q0 t! ^+ j#include <sys/mman.h>6 \4 ^& H6 b0 J4 H1 X3 _. z
#include <sys/types.h>
5 i/ P5 w/ d7 ^2 \5 L" a#include <fcntl.h>- j: G8 U/ B2 L% i

7 D3 v: K8 a% h' \2 i  j% B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% ~6 D7 P& h# _5 N- y2 j( q$ j3 ?) f! Q: L) r: A4 B
typedef struct
1 _. p+ O3 G, ]. h6 z6 F{4 m9 v; z- W( {' A7 f
        unsigned int a;" j/ ]2 S  A' |- q' k- c3 M0 i
        unsigned int b;
- I0 Y% ^$ Z7 r  _" ]. Z/ m# ^        unsigned int packet_cout;
3 d- S+ M7 f) X- [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 C0 _3 T8 D1 J) _8 Y
# z8 ]( B, [+ V0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& ~  q/ n8 o! D; p& r
unsigned int count_copy = 0;# O" H. b5 g6 J( e# @2 ?5 M" ~
' a+ v4 d4 V. o# N- i& _, Z: P

8 `5 F0 C" _$ i7 {' k& ^int main()4 c" Q- T) H' h, m& x& P
{/ s) N$ A/ y( _7 N1 v* i
        pRX_MSG_PROTOCOL pshreRAM = NULL;- J+ \& o; E8 Y2 C" x
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: ]- V& E8 M; N
" y! J1 k+ L6 H' J+ d4 |. t        while(1)
" _8 Q# v: y' f2 `. ]        {
0 l5 ]8 b0 @  N% f# \% R& i) i3 C                read_MSG_buffer(pshreRAM);: h* H. w4 d7 @' z  a
        }                / C/ Y# ?& V6 \' f% F" t
}4 i& \4 z7 ?" w
. o- ^' r" f, Z4 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 g" x. L: f( t' m- G2 p
{
2 [  v4 T# Y/ a6 s3 l+ q6 n6 J# |- Y        RX_MSG_PROTOCOL buf;
- @2 i) F/ R4 S! ?        
7 A/ D* W3 ~; s; c" y; R+ \        buf.a = pshreRAM->a;
5 G- h7 x: y% ~9 w3 L  w2 A3 v. ]        buf.b = pshreRAM->b;" X3 ]7 C, l. g! S/ D/ C
        buf.packet_cout = pshreRAM->packet_cout;
. f3 x- E. m! L/ J; Q3 Q+ _3 j. _6 W        $ L8 [/ Y# o$ v+ M  ]9 K5 H/ C
        if(buf.packet_cout != count_copy)
' T$ @* T$ b) |: L) r9 u  }        {+ f  }, {! W5 D2 C7 |, C( y4 J
                printf("a is %d\n", buf.a);
4 k7 {( p: y* I1 ~                printf("b is %d\n", buf.b);+ S' b( E, K! x* ~. I
                printf("count is %d\n", buf.packet_cout);2 l( f  ^8 c+ Q5 Z3 G
                count_copy = buf.packet_cout;4 q7 e" @# B6 u% W# s
        }
9 p/ A$ c( B# d- W        else8 K% V8 @5 G2 b" `: |
        {: |5 L# m4 g. ?/ g# G6 `6 ]
                printf("No effective message!");
( @! g: ?: W' o        }
* p' n; G" c7 _}
( I8 X8 w( l) `6 T* ~* E" \, ]2 z& ?3 y: _  G* @/ i

' N" U! Y( x: r4 `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 r3 X8 T) D5 E2 q/ D" V) W
使用下面代码,对内存使用了mmap函数后:
7 K/ t1 U5 F3 x#include <stdio.h>7 f* ]9 U& j' ]) x
#include <unistd.h>) x. W  d$ n: r$ S" S) M3 p
#include <sys/mman.h>- K, y: J! o2 `& N7 k
#include <sys/types.h>. r+ R5 L5 G+ J( Z/ A2 D
#include <fcntl.h>6 v( P" G& @) H% t- i

9 z# U$ F5 b7 P#define SHAER_RAM_BASE_ADDR    (0x80000000)9 ~6 N) t2 S6 u4 v- k
#define SHAER_RAM_SIZE         (0x20000)   5 C. ~; a- \" |$ E1 `+ b

2 ~8 s$ i& W; I; J5 J) F& ]typedef struct4 H: q6 }0 o, Z/ ~( [9 ~: n
{4 F! `/ f1 A# y) I- o
        unsigned int a;
( J7 @- u- _7 w- o        unsigned int b;
: S& _% W, w8 A" [6 E. |        unsigned int packet_cout;
4 C0 y- |  ?& p  N/ s: Y8 c1 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. [' o5 s4 G- O& `: e% J" v) r* T9 P& C
void read_MSG_buffer(int *baseaddr);# F' F$ O) c6 G" N0 Z9 n1 _
unsigned int count_copy = 0;. N( L1 _7 U" y* M$ ?; o, ]7 q8 k

+ J/ T9 ~/ ~; }- R/ [1 Qint main()
- i# ]1 C6 F/ z{
% a- H# V5 n; G9 Z        int fd;
# y3 C8 a7 F+ Z$ f) y' E. c        int *mem = NULL;! l$ p" ^* G4 F" {/ ~, ]. h& g
, I0 _2 i/ h. B/ I9 E- v# L
        if((fd = open("/dev/mem", O_RDWR)) <0)
- Q3 y( v- Z' U! t5 s# b1 N3 V        {0 A, B# a) _; C7 U9 y
                perror("open error");
$ C: d0 Q& c0 g* S6 Q3 K                return -1;
  F# X& p; u" h3 L& Y        }
  y, h1 B9 E: S' V- v        
0 y2 M1 _/ ?7 E- ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( X) g# E2 A& F$ o

- a" z  ?+ N/ L1 F5 y$ [2 Q        while(1)
) D1 D7 U& b. B1 c        {
7 v- H% j1 r4 m8 y/ g0 G                read_MSG_buffer(mem);
$ c6 n& T9 d- q% s0 q2 _' l; [        }               
1 p* Q$ N8 R  G( V" H}
) N% Z( @' {( N; L, J& E0 d7 y& d5 N2 D6 w! f
void read_MSG_buffer(int *baseaddr)
( i8 R  y( d- A# K3 E1 q( @{
& @4 @) J. |) {% G9 W; N        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ G& f$ ?. R+ P5 Y% h
1 s7 s/ b) F: l# X. x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ h$ |  \. g/ `" Y% b# Y+ X
; f! S+ k# P/ Z9 s' l        if(pshreRAM->packet_cout != count_copy)
  @% i5 N8 {( a6 @        {
( r  Q1 {" [* L! T5 F; D8 ]                printf("a is %d\n", pshreRAM->a);
& O1 w3 d& e! |1 T; s6 ~6 t/ ~3 k0 |/ `                printf("b is %d\n", pshreRAM->b);
2 U2 j" u( t6 @/ Z! X                printf("count is %d\n", pshreRAM->packet_cout);
& u3 P! P. `) F* t* M& ]1 i( d                count_copy = pshreRAM->packet_cout;8 d( L6 T, N+ T/ j9 U" l
        }
, w. _+ e9 c6 S3 i: g) p        else1 t* |, ~" B$ v3 ?
        {
1 }: z! S) A. {# P% ^8 I# U                printf("No effective message!\n");/ f$ h* y+ p. L% E- U5 K4 E
        }
4 {3 b* r8 E/ E! v}
: c, {; `" z3 v; L7 e9 c) P- k
; q& v" z$ j- B' V* [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. r- ?2 l( g3 P% |5 f
# |" m3 @0 R/ S! R# u+ A  I7 V/ J% u; z& P. r

$ C3 u5 v$ S  V. q, I* z" W. l% h3 o7 z: k5 b( L$ h% b





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