嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& a% {* L2 e5 ^0 c6 J. r7 Z  x( u5 O0 _, f/ M' ]6 N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 M4 s9 x. T0 A/ y' p- S) H$ ]3 h#include <unistd.h>
( j0 U7 h5 i0 g5 O4 H; M#include <sys/mman.h># @; f9 V  ]% T$ I: L: h6 f% ]
#include <sys/types.h>+ Y- Y/ v) o' ?: j3 _( O
#include <fcntl.h>
8 u* p  J8 y4 v" X& ~' I% ?2 m5 f& ?- T: X( B# v9 i/ p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 U5 a8 r0 W. C
. h* [) w( `  H
typedef struct
0 u# n- \. p) @$ W, t% p% [{2 L7 c' u7 P# X$ f- g# a; T* b5 Q
        unsigned int a;$ ~+ `! E" L9 j% d8 \' F: ?* K
        unsigned int b;% v( u( f3 Z: i: U
        unsigned int packet_cout;
: v* d; a4 U% w" V! h# B1 l# m/ i8 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) W( r& a4 r, X1 B
$ o9 k% B" V0 U+ F/ evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ I% }1 G+ V$ L* `2 Z* |3 U6 ]unsigned int count_copy = 0;' F9 Z& N* w; \" r" T1 [7 o

% d$ _6 k5 k& r! {- n$ X7 Q1 w6 o6 ?; L+ r
int main(). S7 v+ g5 A/ r- j' p# f7 w
{- R3 H! N% y3 y: d% g# f0 M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* u4 b8 T0 h( U6 y5 ]2 \6 i1 D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: E$ x. a% j# N& \9 L5 p7 l/ ^* o+ R! o$ g, B/ g' w2 E
        while(1)
: s$ _3 L0 a7 I+ Y        {( ^3 B% q6 q" p: C( J
                read_MSG_buffer(pshreRAM);
. G/ ?, W0 O$ q# a. z5 n        }               
3 m# H. H1 M8 r}: m4 K# ?8 `+ g( v' K

* A& O7 i; [+ h5 |* A& C3 E- zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- }( R# ~% ^) H2 f
{
  c: S6 _! ?" s% y3 S2 o        RX_MSG_PROTOCOL buf;7 |% r: ^) i) Y3 g4 \' S
        ( K1 E6 R0 o; `6 G  |0 L7 l
        buf.a = pshreRAM->a;
) X7 J) y6 e/ A, U. A. C; u& T        buf.b = pshreRAM->b;
3 W7 L! w  U5 m% l  P        buf.packet_cout = pshreRAM->packet_cout;: e8 D* ^& h2 \* B( C- i& k
        4 L) ^, |* N+ K
        if(buf.packet_cout != count_copy)
$ r1 R. [  ^- R. _        {
* f% e! B4 ], j  f: N2 x$ U                printf("a is %d\n", buf.a);  ?- C1 i  \5 C3 n9 t8 n0 R
                printf("b is %d\n", buf.b);) O9 K9 A: ?9 U3 [5 P, d# h
                printf("count is %d\n", buf.packet_cout);2 `8 N" H( A0 g2 j+ j& B2 {
                count_copy = buf.packet_cout;
3 ]# S( U" E: A8 N        }
/ m  J& o; M- k4 |        else* i9 g4 |& Z* ?
        {
. c7 T6 c5 |. q0 C9 ?3 d1 `( Z                printf("No effective message!");( ^8 ?9 O1 {& U4 z
        }0 i8 a0 \$ j4 Y* G: F$ n
}
8 C+ w( ~  S) F7 |" Y" |4 a. z$ H8 y  c
5 s  ]8 j/ T  B1 F( j6 h: K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ v7 x$ x) ?; ~
使用下面代码,对内存使用了mmap函数后:
  H/ S; X2 n- {, W8 i3 x#include <stdio.h>% E5 s( |0 b' C& b# O7 z- f
#include <unistd.h>
( e) b2 q. G! c# x4 O#include <sys/mman.h>7 `3 _- u2 _0 x# H0 ]4 @
#include <sys/types.h>5 Z6 N" n6 {+ w$ F9 [# M
#include <fcntl.h>
$ ~4 r2 P; x7 \' f
( S7 `: L+ r5 J9 t#define SHAER_RAM_BASE_ADDR    (0x80000000)1 ]  N. t# s8 d: c3 }
#define SHAER_RAM_SIZE         (0x20000)   
9 O, l. I$ T) A
' s+ q  ]# ?  Qtypedef struct
" S' j9 M) b# Z/ h. }1 X& V. E. B6 h{% `( s2 L, e* X1 Q& S3 ^9 j9 r4 q
        unsigned int a;: J' i0 X' V& T2 D
        unsigned int b;
, c, ^0 h# _. i! L        unsigned int packet_cout;6 F. |' c5 k& t3 t0 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) }7 N; x# L4 u) F# ~- k
4 b% S1 k5 ?6 r- P( e: l( o7 svoid read_MSG_buffer(int *baseaddr);
# X! d& {' F; i5 @  ^unsigned int count_copy = 0;8 \* k* K, e6 t* M7 p. c4 m6 f
5 W/ Q! z! S+ ^/ q+ K9 F$ w
int main(): ?4 e6 e' |- _2 B- b+ N& F- u
{
5 h' ?- p9 r: I8 p4 @. y/ B/ `        int fd;
* `  x( c5 E7 U; |- w8 n. H        int *mem = NULL;
' W% E4 G. t+ k7 `1 d, u: h% L% x$ L( H
        if((fd = open("/dev/mem", O_RDWR)) <0)
- U/ }2 G1 C& @# `5 p& l; b- Q        {9 [* n( T0 m8 T- _
                perror("open error");" ]: S2 T% `2 [# a& q: C
                return -1;7 h3 Z) f$ e4 O% y
        }
! Y' }2 w2 R! K7 b" ?1 k$ k        
) d6 o- h! x( _/ X9 b: h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 \7 j3 Y& N4 U6 k6 m# E9 j) S" H. T6 `: ^4 r6 g/ t- P
        while(1)' T$ t. D: Y9 c/ C0 F
        {
1 f  G! H& ^; B5 U5 n8 A) y                read_MSG_buffer(mem);! }( A% V; J8 S" `$ U0 q' i
        }                4 @6 c4 I( q; U: w1 \& n3 t  {
}
/ q' {) N5 E4 O4 s& y  y# a9 P0 b( d# B# z& \$ ?& {
void read_MSG_buffer(int *baseaddr)( D4 w/ T3 P5 L. V; n% `" B
{( ^* z/ E$ x4 \' x
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ q5 h/ k0 D" L6 z9 O) P" h5 h
  c2 F" e. D7 c% A' C( i) m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; \+ k- }* J$ E' m" ^' M. p1 Q1 r
        if(pshreRAM->packet_cout != count_copy)8 [3 |* U7 `1 m0 x
        {
$ E4 I. W- i- i0 E; F                printf("a is %d\n", pshreRAM->a);
( U" F7 i) l6 |( h$ v- k& Y                printf("b is %d\n", pshreRAM->b);6 l7 t' J/ H0 }& r: p2 }
                printf("count is %d\n", pshreRAM->packet_cout);
; x5 {0 E/ v+ S- w4 T& }                count_copy = pshreRAM->packet_cout;
& ^4 e9 m0 {6 k& d        }
, O2 L- N) ?) `& T$ y$ ?        else& D1 V- ~$ ^, K/ A# B$ R
        {5 v: j) w+ i' w% Y
                printf("No effective message!\n");" }1 U! }5 X* j/ W
        }
" G0 {  }( `& S0 F: |4 y# G% d}
, W. T# _( W: a# k/ k3 V2 P- \+ B& J! |) ]7 g- Y3 S( W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, }' N2 L' O: M. W+ N8 d
  X$ N: `) T) K3 w1 ]/ Y
3 t9 f  l& S6 F% ~% O! E; f" z

' g. W6 q3 D) n# {, _2 M
9 E& \" i8 G) R( y1 m




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