嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , w2 ^- \' P3 W+ R4 `7 Q, Y
: g  o4 N. L) {1 ?5 b" y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ i& b) n$ g  t; V( S
#include <unistd.h>
3 H; k- O# x& d' D- a* h$ v#include <sys/mman.h>$ E4 i9 T$ v7 ~; Q* f4 C4 H% L/ v
#include <sys/types.h>2 q( D% C: v% D1 I  |; i
#include <fcntl.h>
" h2 S8 A. a/ `# `6 J" P" k" B3 R0 V2 |7 F( G* W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# M& Y3 a  _4 q4 J7 G. U- S0 L, ^
  z+ K$ G: n: D; `! [4 Ttypedef struct" X! b5 t; Q; ?1 R; I
{
3 X- M4 ^: k( f2 Q, R2 g        unsigned int a;
% Z! o2 S3 s1 A4 a% t; t2 _        unsigned int b;
& o# Y0 F5 s7 U1 Z/ R        unsigned int packet_cout;
8 F7 z9 c. S9 R( a% P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! s! D- p& f" C' z) {+ ~* F- r1 V: w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- ^7 w! v' R; R6 e
unsigned int count_copy = 0;7 e9 {& Q( a, f; U, a" h& E

2 o' d  `0 M" _3 n8 H( a' k: T; M0 D  T% I
int main()
' `5 ?% I/ i4 o4 \  Z% e{
% ^, A) M5 _$ G) \8 S2 Z        pRX_MSG_PROTOCOL pshreRAM = NULL;( d6 l( \( K; \* t3 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 L( z$ C5 s1 |6 C
* _$ C0 _* p/ k0 ^  S  g. s! e! }' x: a        while(1), ^1 q  E* U! a& L6 r/ J
        {7 n/ I$ y1 J" \+ V
                read_MSG_buffer(pshreRAM);
2 h& O) W7 j1 _0 ]        }               
, V& K: O' V1 I" u}
2 R% t2 P/ e2 x
7 A1 l- g' D: a4 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ o# q% C# U! h! x7 U! |1 h5 R  m{1 B/ l( G% i( `$ l9 |& |# G
        RX_MSG_PROTOCOL buf;
% R2 L. _, I5 c        : H9 Y! [  h0 P& q6 G8 E' G
        buf.a = pshreRAM->a;
, o8 Q8 ?! ?5 d0 F4 j' [% J/ T        buf.b = pshreRAM->b;6 o0 K9 t/ ^$ h$ l# s
        buf.packet_cout = pshreRAM->packet_cout;" d/ o  ?) U, \+ |
        
2 }$ W1 U2 d4 l. K        if(buf.packet_cout != count_copy): [1 P/ d3 e+ Y6 Z+ h
        {
$ K- d% b: Q5 M7 ^- D7 L5 g                printf("a is %d\n", buf.a);
) F, O/ H& ~; A" M$ x7 k( O                printf("b is %d\n", buf.b);% T1 G0 Y3 {6 F
                printf("count is %d\n", buf.packet_cout);
% N) I; F5 L+ v( q! d! L+ q# z5 h% A$ O                count_copy = buf.packet_cout;
7 C: G8 Q9 T  M3 ~" }, o# v        }
) S  f& Z, B9 _! ^        else
& D: ~3 i4 a1 E) @        {
. o9 v1 G' ^# K                printf("No effective message!");
+ R+ m. @, k* n9 w- }( D        }6 S: f2 R7 ~7 {, X0 }
}) \4 _0 U+ Y, Y' g: A

  X; K9 \/ ?9 F" u8 j% q' \  ?+ p5 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  C; q5 T" K5 g* I6 t, ?- @使用下面代码,对内存使用了mmap函数后:6 w; }7 \4 L: v
#include <stdio.h>- S' V' v& t. N& V- c
#include <unistd.h>
/ w2 W' d$ W9 d' d+ \8 l#include <sys/mman.h>
" Z- c& x% [3 U" v#include <sys/types.h>1 J7 }* [* s7 H; o' |  S
#include <fcntl.h>9 l1 z  o/ ?* y' @& o
5 |8 F  M& c. x* |+ X; }9 I5 M8 X; c$ P
#define SHAER_RAM_BASE_ADDR    (0x80000000)
' t3 |% j! }& p% ~1 t5 r" t#define SHAER_RAM_SIZE         (0x20000)   $ p$ Z3 O9 l! d5 l  c

  q1 q* A2 S  a% B) Y: X# Utypedef struct
  |3 L: D% P) `' Y3 N8 m7 ^{: ^( I( S  m6 [7 J. O4 g+ V( T; b
        unsigned int a;
& u/ f  L3 k" q, C4 E$ Z        unsigned int b;3 e7 o) z7 _% `% h: N* I  e& N
        unsigned int packet_cout;  L, Q3 H, F) ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A  T; T3 o% p; e7 g1 T8 H+ L% g
) u4 \4 H$ U& l- R/ c- u. V& vvoid read_MSG_buffer(int *baseaddr);' b# Y2 k1 c7 {9 F
unsigned int count_copy = 0;
8 A1 r! R1 c  G( V# j- m
6 v" s; s- m' F' I: a" [# \int main()
# C6 S9 }1 l1 T* v# g) m{
7 j2 B6 r  ~7 X* W2 E% H. C        int fd;( c7 C  a( f8 }: u! R. N1 `8 i( k. D
        int *mem = NULL;
' k! S9 G! l( a9 p
4 f8 d% P  _! V" c, p4 }        if((fd = open("/dev/mem", O_RDWR)) <0)
0 n* G% Z1 c0 f6 r$ d6 M9 c        {( ^* G, M* |- O/ \# w: {' h! _, w/ i
                perror("open error");$ d) f! m0 v# z0 C' J2 y- E! }
                return -1;
. d# v' u/ H* m; ^  K2 _2 S. A" ?! r        }# \% @! x* P0 B& ~( I( P( T
        + f; }0 d: o1 s. |+ Z9 U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 u% q8 A: s8 o. s$ Q" U) d( c, @
        while(1)
! o3 U* Q- O! t# y6 T4 d  L0 D        {- x2 E5 Q$ j* A8 i' q# @; a6 A
                read_MSG_buffer(mem);: `  K& n, D+ K( f" B6 x
        }                . a2 \6 e( K) [+ J4 [
}
! k0 X  j* @9 u
( p0 i: n4 f( Dvoid read_MSG_buffer(int *baseaddr)" h# Y- i8 L* }
{
$ k$ j; ]3 A  D" i* P        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 j/ @7 Q9 T; K4 U. N$ i: R2 i$ q8 N2 ~8 p0 R+ B2 w; t- E# ~! i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. F: @- ~" j4 M; Y7 h" X5 [5 q: H8 i* G
        if(pshreRAM->packet_cout != count_copy)
& v$ `6 m% o- f+ D        {+ T1 E4 |3 p7 ~  `
                printf("a is %d\n", pshreRAM->a);
( D  \& Q% p1 E4 d$ W0 g                printf("b is %d\n", pshreRAM->b);
% a) n) S% q! z7 a5 D: j                printf("count is %d\n", pshreRAM->packet_cout);
2 u: Q& R9 J$ G1 ]4 {- x                count_copy = pshreRAM->packet_cout;" L* _5 g, d  f# j( o8 d
        }
( P# V. b) [, f% U, h' F        else6 \  ^: N2 X" w/ z- m4 Q
        {+ g0 x; B8 n# n" a. q1 M3 n: v2 ^
                printf("No effective message!\n");
% e) y1 e7 b/ n3 z* v4 _( O        }; ?  V, }2 `8 s
}8 o/ o# u; o2 d" q* X; B7 ^
& z! Q5 S& |( O( F; e0 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' v3 l! P" I. J6 T  _, L7 {6 a
8 h0 N# V# |  i9 M+ r

/ @5 x+ D/ R( r1 {
0 C/ B! [- F( `; v# g9 j
' l" ?( S4 a  }




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