嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # A: S" o: ~/ v4 I9 G# |2 j7 ~: x$ \

! ~! {3 [, H" F; D/ BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' @, k( N5 i* t# a  i#include <unistd.h>- K' d- R0 }; J& f1 x
#include <sys/mman.h>  ~, O2 _& ^6 L
#include <sys/types.h>" {8 n& d) V: R9 ]
#include <fcntl.h>( x' F5 T) B( r, _8 o' I
9 B: S  s6 X+ Y/ k# y" z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 @" z9 e! i) v

9 e9 h( d# k- a0 t9 Itypedef struct
+ _1 Q# d% G8 g- ?- [: D* v{! Q7 P$ V* i! ^) E& ?
        unsigned int a;
4 h! a# H+ @0 b        unsigned int b;
) |% _( t/ h6 {' X, K- J" ?( k% J" s        unsigned int packet_cout;% d2 i" O. O& E) \% J$ y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( d8 n' o5 {0 ~% E% K  I0 U
2 K! |7 V$ u5 W. ]- v9 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 y2 ?: I7 j& B  W" o, _" w* D/ l: U
unsigned int count_copy = 0;
3 }+ q1 `. P7 d4 o' k! ~- y* N- G; p$ l- L. r2 k$ U

$ ?5 y& F. e9 }int main()1 b& l! d2 c, j! A! Y% c6 W
{7 C. O4 u* B$ U% z  ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 G3 S0 m! l; j' i6 ^1 I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 e8 s) @" v3 Y7 ]8 _
8 U7 a1 R, E* Z: K5 X) t- M
        while(1)1 |& F: j9 u' F* m& b$ F% h4 B
        {
8 {( P) d8 M& j" I" M  [* p6 L                read_MSG_buffer(pshreRAM);
0 ]: ]- f1 z8 J        }                2 F! M- Y+ H/ S9 a" {" w
}( l' r: v/ F) }6 }5 W
" m( P6 D* {7 t) d5 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# M$ Q6 V6 H. q$ F2 N* _6 M
{* a# m! N5 F9 }4 ^% g6 T% c
        RX_MSG_PROTOCOL buf;
  P. y! E9 G4 ]( ~; E  _" O        
: {( |7 c: e; E% _7 q3 b0 U        buf.a = pshreRAM->a;
( L* ^: D) ^/ c4 ?0 b) s& j7 y/ Z        buf.b = pshreRAM->b;( O  I' b' ?7 i9 y7 H
        buf.packet_cout = pshreRAM->packet_cout;
9 T& ~* l) t' N        ( Q+ D" l% `6 W( m; q1 j* B
        if(buf.packet_cout != count_copy)
2 o  d- c# ^* W% m3 ?3 N' `  o5 I6 c        {
$ r9 @  ?* T& h$ K: P9 R2 g* W! O                printf("a is %d\n", buf.a);8 s1 R) m% X2 P2 G
                printf("b is %d\n", buf.b);
; A6 [! s* y# \7 M3 s                printf("count is %d\n", buf.packet_cout);
1 [; a) J- x7 |! ]                count_copy = buf.packet_cout;
2 \; t8 B9 \$ h7 @. T' t        }( a2 S' ?, Q1 K% s
        else
  k( z7 U* m/ k' ?) ]/ U5 }( ?        {
4 v7 k/ L0 F: {3 w. t+ s                printf("No effective message!");
. k% ?# E: c1 Y) B1 a" L        }
2 A* D+ L+ ~0 s& I/ W; b}
0 l$ Y1 ~5 e7 l; @; u6 x6 g+ \+ J0 x, _

3 u, c% f0 c6 L& [; F# L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ _5 r& ]% t: x; i3 O! x+ X
使用下面代码,对内存使用了mmap函数后:& n" W) K# P" Q5 I4 K8 q: G
#include <stdio.h>; O; x7 d: g1 a& G: L  ~8 t4 d
#include <unistd.h>
/ N9 m% [2 ^3 a, J/ Q! ^8 U#include <sys/mman.h>
. w! v, t% `+ I% T#include <sys/types.h>* G, t' V- u  E7 B- W& }2 u$ |
#include <fcntl.h>( I5 u% T9 d8 F3 o0 u

! }9 F1 g9 a0 k) H6 E! K#define SHAER_RAM_BASE_ADDR    (0x80000000), ]  g  K4 V: Z# A% m0 {
#define SHAER_RAM_SIZE         (0x20000)   
' j! O4 ^# _7 N1 C5 X- p! [3 I& m
typedef struct0 z9 a! z  e" W0 [9 v, b$ g* Z/ z
{5 O6 i" p6 j  W/ d6 \! A0 I) P
        unsigned int a;- f1 ?9 j: K' [4 `3 i5 N
        unsigned int b;
7 k# V# n& i+ `        unsigned int packet_cout;; s6 z+ G. k+ Z/ t+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 T" {! v; H% T1 w* X
8 _5 n; ~3 r' V/ U2 R1 s0 ~
void read_MSG_buffer(int *baseaddr);
# I' l5 j' y4 X/ P) \( gunsigned int count_copy = 0;
+ `7 {3 G% C* K7 p  O  w8 N4 W- [9 i( m8 L$ w$ a( w1 |5 p# n6 S
int main()
9 U, ]) g9 ~$ g) L. \- m( {{1 K* t- n. o5 n" t$ N% Z
        int fd;. b5 ^5 i9 q# _( D+ _& P3 Y& ?: N
        int *mem = NULL;) l! Q' F) Y3 C" f2 G4 k
$ L/ ~4 Q2 B  s+ h
        if((fd = open("/dev/mem", O_RDWR)) <0)
: R* R0 D9 b* f8 I3 ?& {        {* Z* l& p& ]# {+ ]8 r" M: }
                perror("open error");
- `4 s. {" W5 e( o& Z                return -1;7 o7 _- @; o) s6 E# U
        }
8 f/ [1 e2 ?( m# [  H3 K+ K  d( @        : u, M3 L' w- u+ X6 L) Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 S& x2 H) ~7 ]  F# ]& f- k$ E( y+ k, \8 r  A5 y# ?
        while(1): W' X  V5 ^* [7 D2 Z
        {: P  J% j' Y7 ^! m5 K
                read_MSG_buffer(mem);2 I: a' T2 ^* v& P
        }               
4 c1 j- K/ x- j( X: B) Y8 z}- r4 L& w. }4 J0 M' B' ^

: O4 w$ O* @5 F1 y" Rvoid read_MSG_buffer(int *baseaddr)( ~* y1 S5 J! E4 Z+ Q8 t
{3 r, i! I8 x: W+ M; B0 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;, [* o* i* e9 F# e; u

& A  l( l6 s# x! k2 R/ E$ ^$ T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 L8 z6 E: \8 x. s/ G0 E+ ~
+ |' w, }; Y) N1 |+ l
        if(pshreRAM->packet_cout != count_copy): h# m* ~9 o- z/ f9 C# }
        {2 h! j' S/ Y4 R  D# s
                printf("a is %d\n", pshreRAM->a);
7 |0 {2 |) G1 M' ], V% k+ ]                printf("b is %d\n", pshreRAM->b);2 a4 Y% ~' u9 w: `# ^
                printf("count is %d\n", pshreRAM->packet_cout);1 R6 \. l* a/ u$ ]0 G) S. x
                count_copy = pshreRAM->packet_cout;
* k* m( S7 j; x2 \7 m        }$ }% `4 s6 ]' F/ v) i: |$ [
        else- z+ I2 U3 k; |, O# C
        {
' i8 y$ J0 E* M' \# B! n6 r! y" [                printf("No effective message!\n");$ _4 Q& ~1 o% q1 n5 ]/ f
        }
, v' |, C( }$ `) C' R}. D, p4 l! \' q7 E! y" r6 W6 X- D
* ?& _- O" g" z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( l* a, |: ]! `% ]/ c) r; a' g5 O8 w! h) K

4 ^2 l% M, L2 F5 T" e- l  x! R# z1 Q* q! Y( z' q/ I

4 v( Q4 o9 D; |- B) o




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