嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 A8 M+ N  o/ y# y, V# I1 _+ f( y5 e
0 k( p* i2 D4 G+ aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># E4 G8 `/ h9 _! q4 ]/ m7 Z4 R
#include <unistd.h>
% z, P7 y* k4 X#include <sys/mman.h>9 R9 B( o2 C$ |' G
#include <sys/types.h>
& a( ~$ P$ j" l  a. [, ~#include <fcntl.h>7 o. M8 f! G2 @' j: x$ [$ l

  f8 E+ i) J- G6 h: R) p#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* n* t. P( ~  m) W3 L4 N! Y
% K  Z0 b% a; w8 Otypedef struct, @% z1 r7 L- l. B' `
{5 u  f, D$ b6 X! t+ l- h! c# k
        unsigned int a;4 i$ L6 G4 ^. l0 _! b" J4 b
        unsigned int b;
  M3 J1 g1 e2 h+ G8 E9 {3 z9 y* K/ a        unsigned int packet_cout;
% J  G5 k" t3 J. R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 s$ D! _' e  `5 G) @8 a2 g4 c) Y6 a$ F) j, P0 U) b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# e# Z$ P2 l- Nunsigned int count_copy = 0;8 J( ]" P7 v$ v$ [
% P: |% A( T+ W6 V2 l

1 ?3 r& V$ g0 [0 s- B3 n' `int main()
$ m2 c: R, Z# W4 ^; I: f{
* t/ Q* s2 X. C% v0 ^/ ~! }8 ]5 C        pRX_MSG_PROTOCOL pshreRAM = NULL;
, A* u! {+ c! D0 ~( V+ |        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* j/ B3 K$ ]/ ]2 ^! K9 \
+ G1 |4 @8 Y* l        while(1)$ |) D, ^' x4 p  a/ L
        {6 ~+ t% o4 F' c) ]% _6 G- d2 {/ @8 k: Q
                read_MSG_buffer(pshreRAM);: V& n* f" Y- P/ q# o9 w) h2 G
        }               
$ L3 J2 {/ I8 K: s  \8 p}5 g0 Q& T+ ]2 w, Y# A, J$ S: p

% A4 Y5 r8 L3 \" z$ h2 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ }# j( r! z( _# b" R{9 W4 t1 K: ^# s  V0 o6 Q; i/ _
        RX_MSG_PROTOCOL buf;
3 A3 V: ?5 r8 a8 N( M        
( p5 n2 o* F' r* W) J        buf.a = pshreRAM->a;
: @) {8 R2 P) n1 q1 ]# o        buf.b = pshreRAM->b;
6 Q1 ]# c2 |2 |7 v3 @/ D3 h( k        buf.packet_cout = pshreRAM->packet_cout;9 n+ `: n) P6 o2 A9 a
        ; R6 i7 P) r  T) z. y$ L
        if(buf.packet_cout != count_copy)5 O: m8 N( o! Q  i: R0 K& ]& p* p) h
        {
; i- R4 C/ o% s$ \* }- F' [                printf("a is %d\n", buf.a);
5 ~; Q3 ~! e' }& f; j8 q" j                printf("b is %d\n", buf.b);
: m7 d, @& A1 K- g. v. G3 z                printf("count is %d\n", buf.packet_cout);  m% g+ K  U0 z0 {
                count_copy = buf.packet_cout;
) T' B, @& K8 M& X# [        }- O0 L" _5 \. R" E  @1 Z) f" W
        else" b5 A( ?8 }  i" ?
        {# e  l8 Q. `6 F9 o
                printf("No effective message!");
& `4 J$ ^1 U! U3 A& l        }) l! ^1 J7 w$ U1 F/ p8 E
}7 v  W$ |6 M9 y- s, n8 }! M

/ j+ z3 E+ ~. _# ?9 F! k3 f) {
4 @- W7 \  n6 w4 v: b: U3 ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ }2 g% _9 ?* Y/ k
使用下面代码,对内存使用了mmap函数后:
: G; s  l& w) K- n1 \- W6 Q+ H3 [#include <stdio.h>
* M# p6 f  J+ H2 P7 s  w#include <unistd.h>
0 U  H0 T: {, w#include <sys/mman.h>
) H, Q/ b% T* r. V& b#include <sys/types.h>  O+ \+ L( V' D) c# Q
#include <fcntl.h>
# O* K4 \# v. h. A$ S' I! S
) A" |7 }; W4 c6 f5 b9 _#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ x5 S" e8 d' O9 r7 u0 Z! K7 M% G#define SHAER_RAM_SIZE         (0x20000)     I) B9 w2 ~# Z$ W
% j$ t% W: j, G, p& `0 [5 y) \
typedef struct
8 z/ a' h" L, u6 k  T{$ r" V! h2 U* ]
        unsigned int a;: F- R  n3 n1 t" L
        unsigned int b;
% q2 X0 p! ^% m& e        unsigned int packet_cout;( @% j; ]$ j! b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& w; T: g3 @. e# p4 R/ H4 }+ S
* Y- L+ E/ ]- U% y& E
void read_MSG_buffer(int *baseaddr);" N. M- }! B+ i
unsigned int count_copy = 0;
" }) u, P# R$ h: p9 ?9 v7 c# v# Q$ C  @% D/ U
int main()$ _1 V8 W: }5 C
{
- {" K7 K+ ^; i3 K9 C        int fd;
* Z. B( w1 E6 h5 K) \/ J3 \7 N8 _        int *mem = NULL;
# p& {- c( Q- f- Y
' p/ S' C4 I- ^5 ?7 g6 I; c        if((fd = open("/dev/mem", O_RDWR)) <0)3 U: Q; `7 m4 q
        {! p  e) a- @' r8 _, J$ R' @6 i
                perror("open error");
) C; o; ]9 m" v* F. m1 r                return -1;; K( y5 ?- l" B9 v8 T# h  ~3 q
        }
* _3 ~/ N8 L6 B& `* v6 M* z. C3 I        
, k! n$ }; m/ s* {) v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# u$ `1 _+ g2 I& W8 N
( W7 O3 W  M0 g
        while(1)
5 \: Z5 L3 ~7 v; Y        {
8 Z: P/ @0 C- {; C                read_MSG_buffer(mem);5 o# @( d3 A! h$ I, b- S! s- o
        }                6 g4 {0 e6 [* @) p
}
9 M* {' Y* S0 U7 L( N$ S, W
2 ]; a" s- M5 I2 svoid read_MSG_buffer(int *baseaddr)* r  c7 J5 [" ^2 e* |
{- J1 ~" c, s) D! J+ b) \) L4 n/ X
        pRX_MSG_PROTOCOL pshreRAM = NULL;* x  j& _7 n% s% ~  S' s
- _: x' A2 @, I" K" N. ~4 @7 y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; n) S7 X( F2 R& _, x, k

3 w0 I) I' w- l        if(pshreRAM->packet_cout != count_copy)
2 E: j; P! U7 `        {4 W( B+ \- c# e# I
                printf("a is %d\n", pshreRAM->a);: f/ d" e* K& q  M5 h2 K7 c
                printf("b is %d\n", pshreRAM->b);
! |- E8 n& `3 g/ {9 \2 ?  ]                printf("count is %d\n", pshreRAM->packet_cout);
; l/ z0 N% z- s% A, |                count_copy = pshreRAM->packet_cout;
5 m! z* Y0 E5 L  r/ B        }2 [$ C1 ?* S7 |
        else
) ]9 X* U/ v+ n+ M' |' ]/ g        {/ g& f) N8 t. _. O0 b3 p. M
                printf("No effective message!\n");
# T: u1 Y  P7 A/ z, D5 S% E        }
3 ~& `# i6 n9 m+ [}$ Q6 i( ~2 X, o! b8 v
  ]  R, d5 h2 y. P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* [7 v3 K( z( i

" t# O& {1 B: j. j
- r0 H5 B- q2 U1 t9 d
" n4 A* I1 m+ P1 t: C* ?, X3 l. I' Y' Y8 R$ D" q% p& {7 O) }! r" U





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