嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' ]' v' r; ^# n; m: Y: h* @

7 U: T$ K* X5 n3 v5 r$ e* {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# V8 H8 i5 [3 C$ `6 c+ d#include <unistd.h>" {0 O6 h3 ~- e# w) n
#include <sys/mman.h>7 V) B5 K# `8 C$ F, v% |9 m
#include <sys/types.h>
  u& \8 C3 M3 d; ^/ `#include <fcntl.h>
3 Q3 [. W# |+ c
: V# A7 }( X% ?  a0 d/ D. j, }#define SHAER_RAM_BASE_ADDR    (0x80000000)   # g3 `! P' K* Y4 w

5 P$ e9 Z9 e% j: T- l  j/ stypedef struct  A5 ^8 F1 j1 T" Y( c
{
. B# |. U) n1 _% t9 g        unsigned int a;5 c! X3 h2 V2 o( d5 N- F2 |" S
        unsigned int b;$ c# g- w! ]! [% A: ^
        unsigned int packet_cout;) {6 r9 K8 ~5 B3 E( V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  C( w' `1 b5 Z. l+ q, F
, l/ T7 `- Q; O) X$ Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) L* F" f/ s5 _" x8 N7 j/ r
unsigned int count_copy = 0;' k+ H- b; R( d; i6 H

0 P' p( L" v' S! ~5 x# O1 ~& A  y7 O$ D* n6 Q
int main()
0 }7 t8 q: Y; F4 n& n5 X: h9 x{' s6 I" x8 `7 N+ B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  Q; }1 \0 G( [2 U9 f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) F3 [. A3 q0 `2 W  k1 h
4 i# q1 ?" `' p' c: x& P' X3 U) `- S        while(1)& |6 }4 e6 }! t  _4 l4 j
        {
' b7 s/ v$ ]7 G' g% {5 }+ t                read_MSG_buffer(pshreRAM);6 g5 v& \" Z5 \' v
        }                2 B( D/ {& |2 |& |4 M
}4 u3 L5 W" I, v
5 S+ D1 U) J) M8 b# @) e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: x& ?4 k8 a- @9 _( S! [& s{
& R  g3 {. D0 f  l, }5 A# c        RX_MSG_PROTOCOL buf;! ?1 d) `0 Y) o
        
+ k" O" c  W# _: [4 T9 B        buf.a = pshreRAM->a;; n+ O, s+ C  h! o, r
        buf.b = pshreRAM->b;
) B# {* R  S, j5 T        buf.packet_cout = pshreRAM->packet_cout;/ T9 y  q! @, i) S- \5 `5 S: J) h
        
' ^+ R6 N: ?8 p! }3 B3 a) Z& `7 k        if(buf.packet_cout != count_copy)
9 p" R8 A2 B/ C7 E- k- P7 J: Y        {; Y3 f& e: V/ ]/ i8 [  v& h
                printf("a is %d\n", buf.a);9 j, \0 Y$ A# W% P2 w2 I7 X; `* e
                printf("b is %d\n", buf.b);
% x" O8 N9 C5 H  Y1 ]                printf("count is %d\n", buf.packet_cout);
3 `/ A9 E* J3 R                count_copy = buf.packet_cout;9 u1 y6 o" v% a  n" L+ f
        }
7 t) ~* y3 A. I3 {        else
" O9 R. m9 J5 b6 R" {4 r" K        {9 h2 u& v) A9 q+ M+ I1 b
                printf("No effective message!");
& q7 D* ^3 R+ z. W6 ^        }
1 e3 b! l1 e" c. I; d2 R}
8 C  f& q9 ^/ S- a6 u5 ~5 b/ j1 \; O
6 {! f) L) Q- O4 n& t0 h4 {0 Z0 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 |- r( P$ O* \4 f' O) J, G8 r! E
使用下面代码,对内存使用了mmap函数后:
0 P$ n8 N4 B) @3 x#include <stdio.h>
$ ?; R7 R$ r& e4 W8 F7 ~#include <unistd.h>" M0 @% }" W' `
#include <sys/mman.h>
/ e, \1 v" D' W6 Z0 z; l#include <sys/types.h>) U) y% S! ~: [8 b! `0 j) a8 D
#include <fcntl.h>
' O* Y6 r( ?: P3 Q+ W
8 F3 @8 Y: [1 A+ j& m+ L1 f. f#define SHAER_RAM_BASE_ADDR    (0x80000000)& \9 G8 \0 w7 q8 q0 u; `1 J/ F9 ?
#define SHAER_RAM_SIZE         (0x20000)   
$ s* h% j$ C  H$ C* B# k6 F/ ~, S
' Q; ^: S" _0 ctypedef struct
( D( Y  i; `% e" d7 |( [" v{8 K- ?2 h( U. @0 J( [
        unsigned int a;
8 `# d. q. `& U  w: O. ?" z" t3 l( S        unsigned int b;
: g9 }$ u  [" l/ E/ n; F+ h5 X        unsigned int packet_cout;8 N# k4 U8 K: A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- d# C$ L0 S- ?& E( e

1 g% U' \, ]  {1 Svoid read_MSG_buffer(int *baseaddr);
1 W3 W2 n/ D! ~  }/ Qunsigned int count_copy = 0;+ G- t1 f2 e7 v4 i; F  r( P; M
2 |) K- E' h2 Q
int main()
) K4 M  O* O% y* n* _{0 i# p; W: ^' z2 I3 L1 c. m3 ~
        int fd;2 Y) _+ v2 X5 L/ z: t8 r
        int *mem = NULL;
. N! ?; |; h7 _& t( z2 E& M, k  j5 w
        if((fd = open("/dev/mem", O_RDWR)) <0), A/ r9 f! z/ q$ c
        {
/ u' V( q! Y+ R$ e. J% f                perror("open error");% g. ~7 Z5 e! _0 [
                return -1;0 L2 k8 ?8 g- f7 l
        }9 }( X- }* l* F$ b  L8 L" m! O
        8 ^  v2 {8 Z2 B7 Q1 s, ^" `
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 I* O8 K; E1 `) o. Q3 j
  i- _0 _+ I8 }: [, g' ^- o        while(1)
3 j# t( w; B2 O' Q+ B; p        {
7 d9 R/ Z/ I6 L, a# q* l                read_MSG_buffer(mem);
) }7 X0 B4 ^# [/ H        }                # L2 s# p1 Y* Y: v* l1 J* N" E1 C
}
$ e5 w0 v' ?3 ?, h- s, o) A- ?; C" W6 E# G0 t1 [/ d  C& O  C
void read_MSG_buffer(int *baseaddr)$ w/ C$ }7 z, _7 D, J4 t) t
{- v9 o1 u. G2 @, o( I5 B4 W5 A2 X: U
        pRX_MSG_PROTOCOL pshreRAM = NULL;" r! j2 C( k1 T, B2 D) c  C

# k. B7 O8 Y1 Z' ]. X- O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  ?7 K1 Z0 l+ b: V; m; ]1 `$ l. Z0 n$ t. D0 a/ v5 p
        if(pshreRAM->packet_cout != count_copy)# H7 M$ _' y9 t* C+ s
        {
/ _; Z8 W/ r* g9 }" D+ B$ a                printf("a is %d\n", pshreRAM->a);
8 z5 y+ ]. X/ M8 ^$ o& R& G$ A                printf("b is %d\n", pshreRAM->b);  j# r6 U! n# v) q9 j! K0 u  @
                printf("count is %d\n", pshreRAM->packet_cout);
- B. X# v6 b- m  R                count_copy = pshreRAM->packet_cout;0 p% s4 e, Y$ _' ?, Y1 I& R
        }
" i4 k, v4 u4 V* o$ l0 \5 z1 \" O( q        else
; O) C& p( G5 y3 g' ~/ o        {* Y) K* I5 Q1 [' N7 H0 i
                printf("No effective message!\n");
) g+ [% @3 x- G( j, A        }  {8 i! V: M9 U/ K
}) F3 Q# a( C& K1 W

5 K/ U) q$ @! q7 n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ m* \# U: t6 A8 B' Z
' `4 d' e; w% D2 }+ l& U% s6 D
/ z5 D$ w- D7 _; F; C% n. z* R  p  [
5 Z/ `) y9 B" y5 L" q4 t





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