嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 m% s' ?: t6 n7 l: ^
2 G- m2 ?, c6 A8 C. ^0 Z3 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ r/ T- D. @0 M7 b* o! K; `
#include <unistd.h>' w4 v& Q( b& I% H; i3 c
#include <sys/mman.h>: a5 E3 H9 Q2 ^, v4 Z. `
#include <sys/types.h>$ {7 I% c4 x1 h
#include <fcntl.h>
6 [! k: ]+ ]8 Z; h0 X" ~/ C
# [8 q  m9 P4 H" @; o5 o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& s1 |3 e) Q6 u- L5 e3 I; P# J* p# I; G0 }/ i* L6 u
typedef struct3 \" d+ B9 @+ K" H& k; O" x0 x# p
{
# W% a' Y! S0 w* N        unsigned int a;
5 Q* x" K: `1 c) y+ e: l4 E        unsigned int b;. |7 o" P$ N1 o% A$ t
        unsigned int packet_cout;5 }) [1 E( G' Y. W# m; S! I  l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 }) ~; r+ U4 {
) J- d9 p" F9 W( ?, l# x  zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: d$ ^' S  f3 q' U* c; O) i9 t4 _: j
unsigned int count_copy = 0;
3 j  \4 Q0 M9 D$ u$ C4 S0 B) b6 V) n! V0 c

, {/ B- B) N# N; f4 ]1 p4 c. sint main()5 {) d$ {- U3 T0 c* K
{6 L# T. \# m" w, D( L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" @% b; g8 R' W3 J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 `* Z2 M/ W- m/ J0 V
2 k6 v4 j0 ?; s- Q+ Y
        while(1)! [4 g) k" J; u/ w/ G! K
        {
* Q) S* c: e+ r. H' Q  s/ i                read_MSG_buffer(pshreRAM);$ h' Y- c( _* O4 u
        }                ; ~* _8 _& e8 m4 b- e$ W0 d
}$ c+ p$ n- t3 T8 b- K4 C* d

5 C3 a4 {- _& H! C: u8 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# Y1 o* j. W9 f- H  ^  A
{$ J& t. O" j! ?+ }* T
        RX_MSG_PROTOCOL buf;
5 i1 ?% U7 F5 p2 ~( e- A# E7 U        + O* H  R! j: L  F
        buf.a = pshreRAM->a;' G' k$ |. ]9 T9 i  k5 h4 j
        buf.b = pshreRAM->b;
8 X/ A# I6 Y2 B) a" y9 T% f        buf.packet_cout = pshreRAM->packet_cout;1 d6 R! p% f) A. p5 q% u+ U' a$ V% H
        
+ [  O; ?3 @& R        if(buf.packet_cout != count_copy)$ x* i- j1 U4 C# G% F2 t/ K0 ^
        {
+ X0 N. q# S8 }* T2 M8 H* P                printf("a is %d\n", buf.a);
5 n4 l: O  B/ A% x                printf("b is %d\n", buf.b);* E& w% U) Q1 {7 f: ]  z
                printf("count is %d\n", buf.packet_cout);
, P8 c5 e; ~: y8 r  o# b                count_copy = buf.packet_cout;
- i$ _6 V9 Z! z7 Y& m9 r        }
$ K+ J' h& g& L+ H        else+ ]: T8 ?$ Q  ^! v
        {1 ?! T/ `4 t9 K# S0 M
                printf("No effective message!");, n! Y( ?/ i" E+ A3 O( q
        }
" V6 B7 w! z- h1 }( F7 a; _}
4 k- R' n2 b1 {* E. |5 T/ K) ]$ K' d: _

! r4 L, P* n/ e" p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: G# a7 w2 d+ P4 H使用下面代码,对内存使用了mmap函数后:
1 L; _8 ?# i' |#include <stdio.h>
& Z/ S' m3 e* a3 l' ~* ~! c#include <unistd.h>2 _% t1 Q% G# \0 T, ], F8 ]
#include <sys/mman.h>
. q  |; s9 P: w% N" f#include <sys/types.h>
3 S0 z1 [$ n; `#include <fcntl.h>8 }- L; a* }2 S/ I( F; q( j

1 L( d. _$ C1 \, g" X#define SHAER_RAM_BASE_ADDR    (0x80000000)$ ?7 V$ Z; C, S: j* s: W
#define SHAER_RAM_SIZE         (0x20000)   
$ q' J: w  J! O; y8 |+ U
' j' L" ?7 K/ ~1 c8 S( d; n- Htypedef struct" M% w$ F" }/ I0 Y: P
{
: a3 Q# [  C9 T0 L3 U        unsigned int a;
; h8 j8 L4 T; A# G8 D% @5 z        unsigned int b;# P3 w1 ]) C- p4 I3 {
        unsigned int packet_cout;
* z0 I  u9 @# V6 ~& f, v5 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 Q9 P7 \$ X+ {! {
: W& J- o- m! }" O4 v
void read_MSG_buffer(int *baseaddr);/ U  X3 m) E( R( Q+ A
unsigned int count_copy = 0;0 l7 t$ c- i, O0 {- \
2 C2 G8 ?( T6 D5 [. J9 `
int main()
: c" `  i9 f, x- b{( V9 b3 i$ M2 ?* ^% ]5 \& k
        int fd;
! u4 @" m% G  X6 E% [5 J        int *mem = NULL;* d" [/ `3 w3 O: S: U+ Y

4 s: j. U, _9 V; C. ]        if((fd = open("/dev/mem", O_RDWR)) <0)
- [3 C6 O" H+ S        {
; m! d2 Z. t# H                perror("open error");
; a  |/ r7 P  Q& z6 D. C* r                return -1;& V) p8 V! _5 k4 y& N
        }+ z3 p9 t8 l% k- s" X  u& x* f
        1 J8 m. E8 y) E& |# G9 H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# `2 R0 F  h- x; `
, o1 J% d( e/ V        while(1): E' `' s& q1 M& J: L
        {) U' H, r; g: z. H3 X+ j/ z  [* L
                read_MSG_buffer(mem);
: H+ A- G8 ?* A, h9 C0 H        }               
0 L6 Q$ P* T6 h! S}
( }% X4 }0 M' a1 L6 J
( _/ z  _2 b: T) D) m: xvoid read_MSG_buffer(int *baseaddr)9 o! m3 c" V* F
{
8 z" ]- H9 a+ k$ y1 w        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ y2 R. I% L! [0 S% V8 h( A4 x8 v  o- Y, H0 ?' y+ j6 r* _
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& ]$ i/ Y, L: M! w  @$ z4 i/ i
: }8 W* r8 T- I+ ^1 @
        if(pshreRAM->packet_cout != count_copy)  {% i4 D! Y; Z6 W
        {
  i* ?# w. ?& `4 m% z                printf("a is %d\n", pshreRAM->a);2 ?& [/ I6 O" f! X$ x1 P  m
                printf("b is %d\n", pshreRAM->b);
; a6 W. ^' p% P  |0 ?7 G5 R                printf("count is %d\n", pshreRAM->packet_cout);7 i! S+ y4 F! j# g/ d
                count_copy = pshreRAM->packet_cout;4 |% t) b, a& T% M" z; }
        }* }% r" ?, Z# c& S2 W
        else
. S0 g6 V5 n% |) A, ~  L# Y2 b0 C% x        {
; K3 q6 C5 i7 Q6 P                printf("No effective message!\n");
' r  \+ F) X/ s. j/ z        }6 ]- z) L, O3 W+ K" ~
}. N- h- Z6 B8 m+ W! E3 K" |
$ a. V1 [4 G: j% e1 `4 L# V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ f) r. w! b$ q0 ?9 H% F
) w. ?! d4 q- \' Z2 j
: Q" v4 E* Q6 R4 h0 B

% Y3 D2 f5 y$ f* ^# \& i8 ^7 T7 d6 v+ n; k





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