嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 d9 N% H; n9 G  O" m) g( R$ n1 G4 j: H8 V4 }1 w( ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% R1 ?, s7 m4 L
#include <unistd.h>
6 |# p% ~7 h2 r' v1 o* o+ P9 G#include <sys/mman.h>
8 T1 r0 L. J" F1 }. L#include <sys/types.h>& S, p: k2 ~9 [0 h
#include <fcntl.h>
1 n2 H5 P1 k) \9 q; V5 I! p" r" @2 B4 P; u2 I( J1 M- k' F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % q; t/ Z  i! K! q  Y. G

$ L8 b- M$ c3 a0 \& _typedef struct# v1 t# @6 {; f# _/ ~
{8 O1 L9 k/ }2 @
        unsigned int a;
9 c0 S" v# U; {' x. g' y        unsigned int b;
+ z* W- {3 T, C& c$ y" ~        unsigned int packet_cout;
6 y+ S8 e0 T' X- A6 S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ M% L4 B3 Z4 P; g
; U% o" O3 I. Y( k" J9 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 ^. |8 |7 q6 _) i. E. runsigned int count_copy = 0;
7 l0 {1 S9 y" i9 J$ b
# i0 }7 g( w2 O0 q( M. q
5 E6 j7 P, O4 R: W3 oint main(). s  c( e- s8 c1 p! Z( U5 s
{! Q# H4 D3 w/ |! n8 X# h) v. K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 w6 X. i. n2 X- C' v        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 m1 b0 V- w! l1 `' V% O* A/ a9 c. o$ b$ y
        while(1)
; Y, v+ u1 c* [+ H% T        {* E$ z8 K* ^# n8 b+ G7 z; K
                read_MSG_buffer(pshreRAM);
8 U# }# @5 j" e# _. m0 W' q2 U        }               
) T# Y# I$ l; H: }$ D}
& }/ n$ c/ }+ Z6 ?7 v
3 M- P7 o" h: F0 g6 l  B( Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): v9 Y2 ~. t2 U' w/ R7 L$ E$ H# R  V4 O
{
8 H: i0 f' x' M        RX_MSG_PROTOCOL buf;
- h( V# D; X8 j7 D) C$ p        $ r2 P' j8 o: k0 R! i6 A
        buf.a = pshreRAM->a;# l" A6 [5 B' U/ f
        buf.b = pshreRAM->b;
$ h+ n" i0 ?0 s& l  p6 m        buf.packet_cout = pshreRAM->packet_cout;
4 b1 u/ T, w: O5 g4 f        
5 A3 L6 \- ]3 e' S# z( C) C        if(buf.packet_cout != count_copy)
/ ^0 A0 x& N4 W& o: N3 |% F        {5 N0 A% q' w' Q* `* u  ?
                printf("a is %d\n", buf.a);0 ~" j/ |$ E  j9 k  a/ P; I. e
                printf("b is %d\n", buf.b);8 H$ y: y& Z: i# a" E1 ^0 F7 f
                printf("count is %d\n", buf.packet_cout);" l$ M. {. c, v1 d  e; O
                count_copy = buf.packet_cout;
! `: |* U& m( [: o, p        }
+ J" ~5 M+ p. m3 d" F, L! J        else$ ]; |' X5 D" U, E6 p
        {9 D$ I. o8 r3 p- A: \
                printf("No effective message!");5 i$ ^6 X& p$ L; r
        }
" w; i2 N4 r% e2 l! b}8 T% s) i1 [* G$ l) Y! H
6 D8 z# K( \1 Z; `4 d$ ]

; }/ V+ @$ _8 g0 R* C! T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 u! F" `2 H4 ]$ C& D3 B使用下面代码,对内存使用了mmap函数后:- q& m) S) h1 x; p
#include <stdio.h>
/ l5 G5 B5 G6 b0 [* n) c#include <unistd.h># v1 ?) f9 I/ ]9 L) n6 d; N1 }* N8 Y
#include <sys/mman.h>
( |' l  H8 s( Q/ B: i! C#include <sys/types.h>
9 D. s! S/ W6 T" O9 O- e0 {) D! P! F#include <fcntl.h>& O( o. }4 B3 I( a- p+ e! D
1 ^- R3 g' {/ W
#define SHAER_RAM_BASE_ADDR    (0x80000000)% H2 f2 |" M" P1 \; D8 ?9 d) e
#define SHAER_RAM_SIZE         (0x20000)   1 n( X& g0 O# e) Z" r1 T
3 u$ h+ C+ u  R, o! @5 i6 W# }
typedef struct$ ~' ?1 a5 L9 [5 h2 U9 k$ W
{
8 N% J% i5 }! s7 r# q        unsigned int a;' m1 {" M5 u' C, ]- ]8 y
        unsigned int b;
) o1 e( o/ w. u: @3 w  R5 T( m        unsigned int packet_cout;
) G" k4 \2 w8 C  a  @5 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 M/ `% @- j6 C  s/ W& c
, c4 K; B" p9 v. J, M# h5 K0 U* Hvoid read_MSG_buffer(int *baseaddr);
; a+ l) U! d  ]# ?& g( c8 Iunsigned int count_copy = 0;
1 k: p2 w% j+ p3 v/ G  D
" V! W9 c( L" y1 F8 Yint main()
3 l. j8 F- S: p7 Z! ?5 c{
$ P9 i: k/ c2 ]4 _  e        int fd;9 o3 V) b7 @6 b4 k0 e
        int *mem = NULL;; ?1 v  L4 i/ ]# w
0 B- \* L( k5 Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
, [) j4 R: R* ]: J) b        {, F3 _, X7 e  H9 a( D
                perror("open error");% A$ y8 k; Z4 |  q) |( y& t
                return -1;  X# Q: ?9 y! e( |# o' p+ q$ c; N
        }
7 ~7 J: L  C8 L6 D+ V7 y& s        
) K8 {6 M: n8 L+ W: q6 G# T        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; j% @+ F( u8 y" c
7 m- Z- R! v  F6 w& E* `2 V; L% }        while(1). _+ l; u8 J4 @" r6 N& @3 c
        {
) M& Y- s/ l1 D' F& A+ X& t                read_MSG_buffer(mem);4 Y7 m! E: H! i* v1 T. a
        }               
  e, }. y/ m! D' {}
' N+ M. t4 W4 R; }+ W2 W; n. U7 L5 a. I+ S! v/ r
void read_MSG_buffer(int *baseaddr)
1 ]5 a; X2 E  i9 t8 h4 c{/ A; D) Z/ j( p7 y* `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) O& c8 c0 F. [3 N- g/ [8 H; w; g0 o' {4 @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" Y6 m0 F# K" @; O5 S
8 E' D" W. i3 O+ T# |0 z        if(pshreRAM->packet_cout != count_copy)$ a+ v/ D+ ?6 Y. I" g/ Z, B( R  A# E
        {
( ]3 ~+ Z4 U2 t2 m. @4 O                printf("a is %d\n", pshreRAM->a);, y- I  Z4 C, h  F2 i
                printf("b is %d\n", pshreRAM->b);
. }* Z4 k0 a% e* _; o0 e                printf("count is %d\n", pshreRAM->packet_cout);
, i) i  |. ~9 Y$ ~                count_copy = pshreRAM->packet_cout;
7 Z9 S4 R. m7 Z5 R! Q        }
( P1 E/ U/ _, O* @        else% g+ |- \+ G. {8 i+ s
        {: {; K  r4 b/ y) ?+ o  V8 J
                printf("No effective message!\n");$ \& r& }! m% H/ [2 c0 W7 u
        }+ F! `  ^; D. M8 v1 P9 {7 }# q
}
- P9 @3 w, u6 l2 R1 J/ d5 J3 K2 P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; k( L1 N$ ]' [& r0 ~1 N
; `6 k6 n2 }2 E" X9 e

% D! p) Z& ~7 m( E" J# F. V! j6 x* ?! C' d6 x
9 Z, o- x( W# W  i  r





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