嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% H7 P; E( d. O
' c" I, T* o" D) m( R& u1 K' FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; _: y9 \+ M- m6 h$ m6 \3 l$ R
#include <unistd.h>
6 {/ H0 l7 u+ l, h3 l+ E+ w#include <sys/mman.h>
# u( c# J+ Q6 _1 X1 j$ X1 `#include <sys/types.h>
; s. h# {& c/ p#include <fcntl.h>" A, m# g& r2 w1 E
) n$ Y' n* P! D9 H$ C
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " `. g2 K7 y! k+ m6 ?5 l6 R
5 G3 I- f; z! j! w- G9 p
typedef struct
' r: n* ~9 V  B3 z  R8 I{% y6 X; ?0 `: l/ I4 e
        unsigned int a;
5 G7 e! @% n3 S8 U. O8 ?  s; X        unsigned int b;
. V6 |% q4 K; Q$ x& E2 E8 |        unsigned int packet_cout;( r2 Z0 N# K, ?' E( Z/ P; G- f2 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 x6 l0 ^+ b9 o# T  R- j" J
" x9 M6 N5 x9 a; @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 G& [7 b" H) t+ J
unsigned int count_copy = 0;; m( Q; [& ?4 C% c. Q

7 z: J" I) \" u  q$ {( h: ?6 R) n  S- v4 c
int main()$ w% ^% s; I, V5 e7 l( r$ x$ J, A5 o
{" i) D& c: s1 w8 Q( x% m1 a( n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 p& y" L4 S+ w! J0 e. F7 [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 ]0 G& M: Y6 [! v7 I
1 i' y* M  C7 H
        while(1)
4 d4 D5 b7 g+ a# u/ s0 q        {8 E1 ~3 [9 x4 a% L* l6 m3 y4 l. C
                read_MSG_buffer(pshreRAM);9 T2 _. d3 z- j! o- p! [8 U* e
        }                6 S$ }0 g2 ?) D7 H# _
}6 K/ |* C9 f3 M/ T# _

1 K. ?* X4 K+ g7 h5 [, V1 T# m* nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# u4 U% D# f/ ?' S{
/ y/ i' }; ^. K9 {        RX_MSG_PROTOCOL buf;6 V9 i6 K8 _; e  p
        
# u, N8 r3 u$ @" w' j8 h        buf.a = pshreRAM->a;1 \; m$ [' g! o; s# t* d
        buf.b = pshreRAM->b;  ~7 v3 e! d& a1 Y
        buf.packet_cout = pshreRAM->packet_cout;0 n* y5 I& B: v4 u$ {& v
        ! _3 M9 |8 z( W+ x* ]
        if(buf.packet_cout != count_copy)
" i, w: G. Y% K8 e        {
! \4 x; Z9 c( {% p+ g$ `                printf("a is %d\n", buf.a);
' x' f$ c) o; {) N" M3 `                printf("b is %d\n", buf.b);
6 D! v# r. m" Z                printf("count is %d\n", buf.packet_cout);
- ^5 n( E% t1 r                count_copy = buf.packet_cout;
6 g- o4 J; C0 @7 c) \# D        }
) P  ]" ~7 {9 T( {. z9 X, ~        else
. P! O( t9 I- c. A6 W+ }7 _        {2 r6 e& s7 A* S/ `: `
                printf("No effective message!");) |3 m: ?' o) @+ T: h- c5 h; l
        }
  f4 n, I- e; D6 T( `# @1 z}: ^; b5 b6 w7 k4 C

5 Y! F$ ^% Z/ O1 e' ^' g& }: v* C7 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 z4 B7 A" D; }+ i# E: ]使用下面代码,对内存使用了mmap函数后:) f6 K9 n# @9 U& a
#include <stdio.h>0 S. j0 u/ ~+ l( S$ C( i
#include <unistd.h>
8 V( f/ K5 k+ l, r2 z0 g  r#include <sys/mman.h>9 ?  M, V1 T) |/ E; ~/ P
#include <sys/types.h>
) J. O- g) _  C8 P( X#include <fcntl.h>, `* n" j' R6 v+ A( j$ W
1 i; j: o, }' h$ h. }
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. e  y; `1 p2 |/ V#define SHAER_RAM_SIZE         (0x20000)   
/ I2 {% S/ E" s9 U# `3 }0 b$ g# Y& B5 E1 p' H
typedef struct
. P4 T% \. u, R( h% C" P{
. p& J6 L' M/ P9 W2 h: c- e        unsigned int a;
1 e% T' w- ?) |- E# o" `        unsigned int b;
! H& U) W8 a) a+ W. x' h6 L/ O        unsigned int packet_cout;; r' b" P) ^/ s# W7 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, f; U5 ]+ d1 N+ P/ f
; x( r+ q7 }0 a6 p  A. s
void read_MSG_buffer(int *baseaddr);9 l  _& W4 s  T+ O0 i0 e
unsigned int count_copy = 0;
8 ~2 d- Z) D' a" M, U3 N) A0 @/ c9 @9 j: }7 r: N- I8 Y1 O1 C
int main()
$ T$ v; J" R; I  `! T! R{  |" e9 z( X/ c
        int fd;
) b4 T$ ^% i7 ?9 S& `( g        int *mem = NULL;: @) k% B) A9 k. W4 j
6 f2 ?; p* Y$ n$ g3 Z+ S
        if((fd = open("/dev/mem", O_RDWR)) <0)
) B. U. c  W# f3 O# m/ B& G        {) Z, \5 }+ t8 f
                perror("open error");" x3 h3 ?* h, F
                return -1;; m; H' @& A7 A9 n! b
        }
  l( h+ S( r/ t9 _( s6 M/ H- \        
" q+ ~7 C7 g; U        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 D  C. J' ?8 r% \, `( F5 c
' v, u, y2 w) X) N6 T- N  d: |
        while(1)& ]3 A7 k/ P  h, D6 S
        {7 M3 c6 N5 n& x+ ~0 h# C9 K# I% K
                read_MSG_buffer(mem);) n, i" g( H3 h# P$ `$ q+ b* H
        }               
- O% O, C5 v4 o6 `2 W  K8 Z5 s, J}- Z7 ^* D! H, l5 w4 x1 F. T/ e
  [0 ^  |9 h; x7 J, b/ [
void read_MSG_buffer(int *baseaddr)
8 m, P1 X7 A0 ^$ ^4 H5 h1 j( O{' H$ K$ b& u; k# n5 \- D8 z" e+ K, X! n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 d/ \$ z1 M$ m. A8 c9 x, m9 ^7 \' z
# Y( M0 T$ L' Z. E9 k/ Q6 s' Q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 _" N1 |% C; k2 n% R2 @% ~+ S( D- A& ]; a! v
        if(pshreRAM->packet_cout != count_copy)
" L+ ^! G$ m6 `/ y& A2 K, j1 {1 l        {
' q% M- w. d2 C! x- M3 E                printf("a is %d\n", pshreRAM->a);- x3 n4 x: k, g& P3 U! h7 Q8 ]
                printf("b is %d\n", pshreRAM->b);
1 }: F2 p& ~. |/ J: O& Q1 w! |                printf("count is %d\n", pshreRAM->packet_cout);% r6 w3 B( Z0 T
                count_copy = pshreRAM->packet_cout;
4 Q- N( x( {7 S! x+ j        }; |% @( w8 R% W6 |5 R
        else- t! m9 r9 i) K( E6 L
        {# N: c& q0 U# F$ J1 d# T6 P8 ^
                printf("No effective message!\n");) V* L7 e8 W- Q, |4 h
        }
7 X  [: X: e9 V/ ]. J3 H$ s4 o& P}+ z* W: |& O$ }* r( M+ c, m) \: @, D
% L4 m: |$ Q' Z1 U% {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 Y: n% o- A( t7 ^" D7 @- Y, V4 [

/ _9 R' V6 ?7 W# h0 Y; C  M- x/ I1 e8 c1 b* _" A
, K! \2 B2 c1 q- Y8 N0 J

2 p* g( n+ d; t* a0 b) {' S




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