嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 k" a5 u& `! T! O8 Z
* w0 t8 e8 `2 ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 z' L# F& `4 P8 J; y#include <unistd.h>9 \* L: u% Z2 j, V% X. }( Q; ^9 m
#include <sys/mman.h>$ b7 u( a4 i  j, b: s
#include <sys/types.h>* s( q: v+ i) j6 H2 f& r
#include <fcntl.h>( w+ ^2 h: x# V! W' v. f1 E
1 Y7 K1 n: E( B; n7 o5 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 r4 j3 j0 l/ m8 b
8 t3 z- W4 e) btypedef struct9 |% |8 t+ e! c) I
{
' P3 r, k# Y0 u( i        unsigned int a;" C1 P( f8 Z+ T8 J  I3 }
        unsigned int b;) f( I6 }% ], N, E
        unsigned int packet_cout;
6 L; _, ?/ K. i3 i' Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, C2 f/ {/ n: m; f2 q7 _5 \3 p

6 O3 p" f' ]. m6 v3 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; R$ \% P4 H1 ]. d
unsigned int count_copy = 0;+ T* K8 w2 ~5 j% {
* \4 I  M% T3 p: P/ G3 c6 D  E0 i, f

% A3 H% h9 m4 M9 C+ Iint main()
5 V3 U" K* f" a{
( r9 ~$ n! ^7 A/ K( W6 Z0 l3 {0 T        pRX_MSG_PROTOCOL pshreRAM = NULL;
: m4 u% y1 Q/ A+ b+ i4 M" k2 q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# N, v8 D9 S# k1 H" e- u& ?1 G  \* k: A
        while(1)2 g( ^6 _6 F# e7 F; |2 C
        {
& w$ i  H# V5 y8 q; t                read_MSG_buffer(pshreRAM);& |5 r/ W4 x6 c  y6 |4 k, M5 `$ ?
        }               
9 V8 Z. k9 B9 A: ^+ F7 ^( {}
, L  g: t$ x, H5 z! V# Y+ z1 w( o% V; c- S6 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% S+ c& ]  G- ^4 p! S8 G/ P2 {3 _{
5 M# S8 ^( ~2 Q( J( @        RX_MSG_PROTOCOL buf;
5 t7 q& R8 u: j$ c! ]5 [        
0 p, `* D# s3 s/ w$ M& n        buf.a = pshreRAM->a;, }7 P4 i6 u- U* k
        buf.b = pshreRAM->b;2 r" n* R% l  F/ l* V1 Z( R' y
        buf.packet_cout = pshreRAM->packet_cout;
5 Y4 I, T4 S1 z        
$ j& f( |/ j5 @5 W        if(buf.packet_cout != count_copy)- {+ u- _5 G; V; o' \
        {! C7 c1 a3 U' r# Z) [) Q; L
                printf("a is %d\n", buf.a);
( ~. v' S+ z3 |$ m, b9 P8 q4 V4 U                printf("b is %d\n", buf.b);
$ E0 W& U) _/ \5 r5 b" ]$ u                printf("count is %d\n", buf.packet_cout);
& |7 t! \0 L% ?                count_copy = buf.packet_cout;6 t$ r) G9 O2 J$ }: W  J* A4 w
        }% p) N, h1 e- S
        else1 z* Z! `4 [$ m( x7 X3 b9 ]
        {1 j/ ]- Y" b/ z0 y, F
                printf("No effective message!");1 l4 [% v* ]* Q# s0 y# J
        }3 @7 @! N. Q; f4 w+ ]
}
/ Y: J% I3 t! w) H8 M+ w5 z
) ^: {7 H/ K" a9 n, H4 J/ z1 z1 y
; v- z+ Z* i# p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 G' M3 _1 r9 E+ K* v4 p
使用下面代码,对内存使用了mmap函数后:
3 Z% n& o* {& Q; X6 K5 h#include <stdio.h>3 r1 k& t2 x8 q3 l$ \; P  E
#include <unistd.h>
4 Y' N8 B, e  s  i+ U& |; b5 X#include <sys/mman.h>4 @9 n6 y/ T* E5 F4 O1 {
#include <sys/types.h>
* h, j' y2 f9 g# }#include <fcntl.h>
" l/ x; h6 [8 y* v$ k  y0 O+ c$ g7 b, D, D9 q
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 I" s5 n3 J7 L
#define SHAER_RAM_SIZE         (0x20000)   , O$ [& ?: b" `. f

# v4 z" K' h$ x; }" h* _typedef struct
: e+ X1 u2 e) ?8 a( ?{
, s4 r  H# X, g  s2 A5 }        unsigned int a;) q- n. g) @! B( b: i3 P, P' w
        unsigned int b;! K2 }+ Y- E0 q2 ^1 q3 Z! o* l/ Q
        unsigned int packet_cout;+ H6 C5 H! n# c2 W4 P; ?4 N3 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ `2 m0 Z- R+ d* N
. k  t4 m# x# S- R
void read_MSG_buffer(int *baseaddr);9 g) w* g" u( O. a  ]6 s/ ^
unsigned int count_copy = 0;
7 G5 h! F6 q6 K: r  q, I% N
0 ~# l$ _7 S& M: e" d+ p8 [) y- Gint main(): [. k0 l, f& ~  P2 N) @
{/ A9 ^0 d2 E3 m% B9 I" v
        int fd;8 G# W! c& I0 x9 ]
        int *mem = NULL;, Y) B! J( u8 c6 N8 }7 J& w

# n+ r7 h5 m1 x2 S) H& w        if((fd = open("/dev/mem", O_RDWR)) <0); s& k0 N& w5 d/ s& W! ~& a
        {
9 Q3 S: b* u4 g                perror("open error");
- O0 `, @% w# l5 m! |                return -1;
9 ]- K# r4 h' m* p        }/ l1 i5 R& H" l- u
        
' ?% c2 V( s" D2 t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ P& }, J6 T5 N6 q
, f, n: R9 B, @$ f, @. g$ q        while(1)
0 O' C% v. j; W! v8 i8 g  B# f        {
+ m5 P1 @& l' q& C: B, E                read_MSG_buffer(mem);" h4 i6 g) {9 _& k6 l% P
        }               
) l) o8 E2 D9 z% U7 T( S( O4 X0 Q}" M1 z- h8 P# G, ~+ \  u

8 ?$ H, `9 X5 I$ s: w( wvoid read_MSG_buffer(int *baseaddr)
) u" [! d) G6 c) u( C0 _{
0 r. ~, c+ J. C) @/ m# u9 [4 C% W$ d        pRX_MSG_PROTOCOL pshreRAM = NULL;! X: z' }- q5 \% H4 j
  X; ?1 O" b1 K$ F- a+ J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ P5 g5 _: T" l* J: e

" O. [  G! o7 `  h+ S1 l2 ^/ k: R        if(pshreRAM->packet_cout != count_copy)2 `. Q! o) c9 ?7 E) d6 @. z
        {! [; ?2 x5 L3 L2 c! Y' a5 y! f
                printf("a is %d\n", pshreRAM->a);7 S3 a/ z9 v- }) |1 V
                printf("b is %d\n", pshreRAM->b);
7 n4 l" E0 H. W' \2 I4 P                printf("count is %d\n", pshreRAM->packet_cout);
3 w* o$ |" a0 B( h6 I( M1 A+ ^                count_copy = pshreRAM->packet_cout;" f, k$ H8 l! d6 g
        }
3 Z' a: d& E: [        else" H! j" ^$ [6 D# F) \# j; C
        {
; c0 m% F: v$ V# t8 t' g8 D                printf("No effective message!\n");
" E% \; \, A/ Z# B        }
$ O% n- M( o( y4 N- Z1 H3 c- B2 B}
6 C4 S& e% {' H5 h$ l: F. d( b2 ^. r0 o3 w& O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* J2 e! q" K% Y5 e

5 ?7 ~+ m1 q  Y. a1 G# Z) ^, v" f, W' A3 P' ?
# R/ d- `( t1 x8 l
! m9 X  w9 y) A- b+ L9 u; \( K





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