嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 c4 t2 {- _! N) v" e8 f( u
" n& p4 g: Z+ Y2 U$ h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( t7 e0 e& [; z0 F
#include <unistd.h>
- J, s+ z4 c% Q) K% h# J#include <sys/mman.h>
- H( `0 J8 B, q" O( O+ U7 E0 n#include <sys/types.h>2 j' U% }% {& O  _# l# \2 m
#include <fcntl.h>
! V& X2 c5 j& o/ h
' A" x* j+ J; B5 G+ K; X#define SHAER_RAM_BASE_ADDR    (0x80000000)   : e6 {: F5 R  t

9 k- A1 R- G* H! Htypedef struct
& `0 g5 ]3 p; J' N" m{
% A$ L4 m5 X  B        unsigned int a;
" w, C6 y( A3 i  F& f+ @        unsigned int b;+ M5 X& k7 v0 O  x: r" m
        unsigned int packet_cout;% v5 y3 x# B5 ~; R. P+ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; ^8 C  R/ S5 `6 i( J; K5 j3 }

  ]2 L" K7 P+ ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. o3 }9 K, X' Q
unsigned int count_copy = 0;2 k' w3 t; O  V" s4 b, J* f7 ^! T# ?

: y' ~3 V2 z' _5 p" p- Y5 }$ s3 X2 O$ c  C, M
int main()
! s6 U9 J/ o0 |6 Q{
7 @# a- @! O2 n4 D. K/ y& c! p. T        pRX_MSG_PROTOCOL pshreRAM = NULL;  u1 z9 j# }0 |. ?' A" R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 c+ _* j+ @6 x9 d

6 T& V9 x$ v5 L" j7 y! [  C7 g        while(1)+ D* J: m. {+ G1 Z
        {; I( z% a0 v3 N; Z/ ?4 U! S3 L3 M
                read_MSG_buffer(pshreRAM);8 f$ n4 ^) K! Q; M4 h# n/ m
        }                * ^# |& q5 v+ s, ?! C/ B& g; p5 F8 `
}3 V! z  l" O$ |  P5 a0 y. Z
# [6 S) S5 o/ t: L( k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" ^% D$ H5 V" R# `+ F
{8 M3 m: j$ Z  V8 Q. B6 h* Q2 h
        RX_MSG_PROTOCOL buf;
2 Y" B* Y% P' I, J. A        
% |7 L1 z3 M  V' g" e        buf.a = pshreRAM->a;5 j& P. E$ L7 O8 T1 W
        buf.b = pshreRAM->b;1 d- y' F. w* @2 S" k! l$ `8 a
        buf.packet_cout = pshreRAM->packet_cout;7 d1 e; r9 s- g7 r' r+ F7 T
        
. I( ]6 G, j; ^' u0 }        if(buf.packet_cout != count_copy)& |+ N8 x& k2 H, W6 s( K
        {
  ]8 O: ~8 A- B8 d                printf("a is %d\n", buf.a);0 `  }' K9 w8 M; g
                printf("b is %d\n", buf.b);
0 v; x+ y. }  E- s) {- r+ d                printf("count is %d\n", buf.packet_cout);- ], D8 P* n, u: m" ~* q
                count_copy = buf.packet_cout;
( m$ F. e# a6 k2 R        }1 ?6 ?" A0 J. A0 i7 @
        else/ v8 H8 I( `8 X1 W, ?9 a
        {6 E" u2 Y3 U) A
                printf("No effective message!");
3 I: V. S9 S1 t$ X$ @, k        }# v7 n, L9 L) H$ @; P- f) I
}( h9 E/ P, ~' s, l

9 G4 M; T3 U2 A3 m2 `/ a
& H1 O2 s4 j! q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 M3 B" k1 H0 [; R
使用下面代码,对内存使用了mmap函数后:" O% E) v' N1 o! g% i. B9 ~
#include <stdio.h>
, Z4 a& v, M% B; c9 u8 c#include <unistd.h>0 t! |6 O4 C& o* z2 g
#include <sys/mman.h>" F) k0 A; c" K% U
#include <sys/types.h>0 v5 ?: i9 V& F# L; |+ F+ u* f
#include <fcntl.h>
; Q8 n1 v  ^( ]) l& x$ L2 u( ]! u2 s. v1 n, o
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 R; B. `4 H# i+ D#define SHAER_RAM_SIZE         (0x20000)   
; Q( n1 ?3 ?/ \
2 d$ l' @+ x  p4 Ktypedef struct( ?% n  ~! Z) h* f
{! @6 S1 `0 U  `  C
        unsigned int a;
. k3 y* t& o: _$ C        unsigned int b;
0 U* U9 \2 k, _8 v9 W        unsigned int packet_cout;
8 L0 o5 r3 Z; Z$ B  [, @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& L% v2 ?7 {' T2 f8 \$ F

- K: R9 |' x% h3 Y# v4 cvoid read_MSG_buffer(int *baseaddr);7 [' P5 m. g/ W. p; L4 B& Z0 p' y' g
unsigned int count_copy = 0;
3 E4 x4 c- Z) h* p
( |3 S7 k# k! x0 l) w+ J9 uint main()' o0 }) ^# [. S( ~& U
{
# w" {; C- ]9 T4 D        int fd;/ }( I6 L4 Z1 l$ E+ W- P7 V7 r7 Y& @
        int *mem = NULL;
! M" N# i! y/ v1 f2 C1 w4 @7 z" ^+ p; D' U3 E1 @0 o
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ Y$ q# D6 z$ m, p' n% I* y1 m( [2 B        {; w  m% r  e2 x2 O& X$ u, J$ y
                perror("open error");
, i; u! k. C! f$ D, k4 n! |& L                return -1;
) C, @4 q0 o- Q6 g        }
  U3 g" O' a/ b# h: Y        
9 N' l0 z: i8 T5 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& F' Z; v7 h% ^& x2 a

: t& ]$ P1 R: g* _3 e7 B        while(1)
; c# `! f$ M% J. W/ h5 J9 O        {
5 i4 B5 A+ x6 T3 x                read_MSG_buffer(mem);
# U" [+ @! l& W3 T+ V+ B6 E: i        }                + o  V8 W/ Z6 A7 u4 f# `" W1 ?8 Z
}
; p: q" x! a3 _( h2 l" `
0 Z% U( Z# c( M$ ~2 m- s/ ]4 z8 jvoid read_MSG_buffer(int *baseaddr)
1 m. x1 X' f* z* k# ]" `{
( c1 X! X" B: O$ J$ d0 [, e; d        pRX_MSG_PROTOCOL pshreRAM = NULL;3 R( Z  \2 n/ ~& }8 v
7 i% y1 L1 }) H$ z; ~9 j( [' j. |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 Y( `9 U" Y0 u0 V* l2 F0 q+ U  }7 \3 u% U: n' o
        if(pshreRAM->packet_cout != count_copy): ~/ x1 r; N8 a
        {
$ V3 c% y) a) F" r                printf("a is %d\n", pshreRAM->a);5 R( Q; z( }0 V4 c
                printf("b is %d\n", pshreRAM->b);% X  }2 Z, W$ N. _
                printf("count is %d\n", pshreRAM->packet_cout);, h" b. k* P' o
                count_copy = pshreRAM->packet_cout;
2 m4 L. R% J& B& |        }6 q$ k* I; |. J4 S3 H, L" Z
        else
. X7 ?6 w  l: A; J8 R1 V: w        {; |8 K" ?. K; N! c3 E2 P
                printf("No effective message!\n");
' D5 C& G1 Y) j# q        }
( _  m7 N1 @+ i6 H$ r- d0 Z( _}
* S, c5 m& L1 }8 x: v6 s' z) C6 x: s8 v/ m' ~$ A6 b  U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 v6 r* |* Z% I& \/ C0 C1 v

. g- j7 o0 N5 e  e# V: d6 Y8 T9 |! N
* m. C+ ~+ b. e8 m. M9 l

: `# K) M) r/ o% c" R




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