嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 ]- E. F/ a: E0 H- ^' u6 S; S1 A& \8 f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  b- S  Q# B+ m) y
#include <unistd.h>
4 o, j( A5 R; \6 o* i#include <sys/mman.h>! E7 @( I$ z$ v
#include <sys/types.h>
+ V. P6 g% J$ `. x. y5 R; r' ?, B#include <fcntl.h>; M* \2 w' G3 N" r
- i5 j' h+ b3 B8 d3 o8 F7 a7 m  i
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 n. k3 f: H: U: w9 n' ?, p
4 r. q2 }1 t: `8 J( C1 U& Y) G& [8 mtypedef struct3 N1 d3 T, `) t8 f
{- w% l; ]" {9 w3 \
        unsigned int a;
% g: x0 b* L; U2 |" R5 s2 `, J        unsigned int b;+ m: S& Y* Y0 x: y
        unsigned int packet_cout;, a2 q& e- ^  a! f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 [, L' ]" v) c" s% Z
( S! Z6 M* d# `! F' x1 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 W5 l# Y+ V% k& _. o  ^1 W$ C
unsigned int count_copy = 0;
& U4 v& R2 }; j  L: x, F6 ?6 M9 M6 D$ ~, ^0 g

; b. f9 v" a  f: mint main()
# {$ U$ A1 w, u$ f- c! ^, q6 T{# G8 @5 S3 q- i5 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;" r( X( B. ]4 j* D( W. U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 z& E; g  ]; w& p7 S
+ @* T) E( x* |# r2 N
        while(1)' v& T2 k7 p8 R0 L  |
        {/ d1 y4 k- j" W% a, M
                read_MSG_buffer(pshreRAM);3 L. U9 C0 Y3 u
        }                ) i: i0 J+ {- U5 {9 N
}
. g9 i' F& S; l4 i/ f
4 T7 c! K$ \. C' I( q8 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& g& I( D* c4 v
{
9 f0 C. ^: p' a3 c        RX_MSG_PROTOCOL buf;
6 m. h, j1 I  z6 d& {% d        % y& m, W9 v, h
        buf.a = pshreRAM->a;
6 O9 b- ~% i8 {2 r: n        buf.b = pshreRAM->b;5 t$ h( r  ^  B% v2 }& Y  K
        buf.packet_cout = pshreRAM->packet_cout;" {) Q. u% z* E  m  L7 L
        
' F& o, }3 C5 O        if(buf.packet_cout != count_copy)8 b9 _: ?- F  q; F( y
        {
+ E- ^/ H9 q! ?2 E6 ~( c                printf("a is %d\n", buf.a);3 N* R' A8 O# u$ ~# O7 p0 {3 f
                printf("b is %d\n", buf.b);
: o9 A) @: Q- |/ @1 ]5 {                printf("count is %d\n", buf.packet_cout);
: L) `1 Y% S* w1 W. c2 }1 r                count_copy = buf.packet_cout;( e8 [9 u/ ~  |) w
        }  y, G5 I, C- l) K. x
        else7 u2 C% G" `  h2 d" I7 u% u9 f; S9 @# h
        {: D0 |) a. J: p0 q/ U, R
                printf("No effective message!");
, p) y$ M2 G4 S! }( b, S* u% t        }
6 L3 {6 l/ g: i  N}
/ U3 Q/ U. o$ J6 f- L. ~& A) x' ?8 v2 l, X$ ~# K2 J7 Z
  d7 q7 J6 H# i. V% e* K; C6 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 Q/ F4 d  g, m) W
使用下面代码,对内存使用了mmap函数后:
1 U4 v/ L( i, q7 o2 w#include <stdio.h>
) Q' @; F* e9 q* S) r! z#include <unistd.h>
" t, P) m1 s& c" ?3 W7 b9 e#include <sys/mman.h>0 w9 M# l6 l" H0 C  [
#include <sys/types.h>
  o+ _: L8 E2 L#include <fcntl.h>$ Y# ]: g6 M& L; L8 x

- F' x6 x9 L, D' o' R4 k#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 J8 {% V( }" B3 O! i#define SHAER_RAM_SIZE         (0x20000)   , |6 q9 z* I6 T$ M2 D- G+ z
) }4 }3 G+ L8 U# K; Q" ]
typedef struct
4 J. C6 c/ J2 o# ^! {1 h6 z6 x7 f/ t{
0 V* P1 L6 n0 W, l" ]9 Q4 {4 v) b3 E        unsigned int a;
$ ]( r' o. I! `) m4 \  X  D" P        unsigned int b;
4 q+ ^8 u7 l# j6 K        unsigned int packet_cout;
% l( e: ]! q. ^1 k9 Y- y& c2 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 P5 k8 {/ G2 q0 H6 @3 I  w
' N. G- s7 F; T; H$ D9 I$ L/ g2 o
void read_MSG_buffer(int *baseaddr);6 V  w" W0 X. J! a; A# [
unsigned int count_copy = 0;6 y& h! G) X% E' {7 n9 I* M; J$ U

& |( ?* C( |6 `' e8 hint main()% B) b( C* r7 k5 B: f) a
{$ E7 c7 P+ ^) c/ z! a! S0 \! w* x
        int fd;& U7 r! V4 I$ y; U, O0 a5 R9 t
        int *mem = NULL;9 S$ w- E2 _3 T% V+ M: R

1 u% n/ x3 H, g# k        if((fd = open("/dev/mem", O_RDWR)) <0)% y% h; T+ ]+ q+ w( v
        {
& G. T1 }( G' p: r5 S: q6 H                perror("open error");6 x0 N, X& s0 o- ?; p" ^2 B
                return -1;3 p" e5 L1 p0 P$ d5 u
        }( z2 r$ p- G( U4 l( o! U
        9 l* H) v7 Q4 i
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: E" p6 a7 k" H6 h5 l8 ~8 ], |) D3 V( }  @
        while(1)8 k- u  N# \4 P$ B% d4 a
        {6 H4 g% ^6 r5 K7 i' k
                read_MSG_buffer(mem);$ k1 w. J. |% t; @/ B
        }                0 b5 ]* x) U5 m, c* Y0 Z
}
) W' I& J- I! K/ T: d: {3 C( V2 y: A2 [* l7 P
void read_MSG_buffer(int *baseaddr)
/ l, M6 p: ?7 s3 F  d, B{# ^8 Z8 U) N3 p  U8 e& Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  a2 c0 M& B4 a) z. b" y" R- {  [$ B1 K4 I& h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, J, y8 e! X' C: O# }$ K$ L' b; o( y8 Z) l- J
        if(pshreRAM->packet_cout != count_copy)
7 d9 A  O, j4 g- ?4 O- a0 n% @        {: ^. }9 l. U  d# W: s% L. K4 q% t  Y
                printf("a is %d\n", pshreRAM->a);
! w( y/ z3 k8 h4 u$ M) I5 k                printf("b is %d\n", pshreRAM->b);
/ S2 J2 P! N# Y, _2 C; `                printf("count is %d\n", pshreRAM->packet_cout);
- i" S) l: P/ y0 X, b                count_copy = pshreRAM->packet_cout;$ r, c- r. E. W; o
        }
. L8 T. P2 l. n$ X/ S2 L        else
) N5 @+ G# B$ f        {* O! ]9 W! v. i
                printf("No effective message!\n");
# n: ^* r0 L, U: k        }' w; ?+ b7 L, x3 X
}) M7 ~; H  U8 K- L6 B$ s% z1 X

  l8 e* R- p& B) `, W, Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& b! g* P5 L% ~' M$ e6 D; \+ M/ n1 `- y

- x8 e( X. Z$ W" R' j" m& Q* p- R2 S+ {
0 N  F" L# z" b9 a/ T0 W$ w





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