嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' b. _8 U* I2 ^3 G; |

1 ?4 d0 B$ Z* ^9 ~9 I' qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' t% J( i9 [  n. R#include <unistd.h>( l# |' Q* a# @: s2 l
#include <sys/mman.h>
/ W$ I3 a, e, e+ [0 [4 W1 g* N#include <sys/types.h>
; D6 Q% D4 F) M#include <fcntl.h>
" n. a; O1 r+ F
5 \$ P3 T! v/ U  z( N1 O' V#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! f" a/ |. t. j9 m

7 q7 g) b  R$ r; g# R) x. u. H" c3 ~) Ttypedef struct5 K* R5 X& y3 D* v$ i
{
! L( r" j3 X5 ?( m        unsigned int a;7 {0 `6 P7 O2 [* e/ G' a( ?& }6 j. s
        unsigned int b;: e' U- _4 l  q& `/ D" }; S+ _$ z
        unsigned int packet_cout;6 F1 d6 b2 O7 L. Q* G- Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* Q2 S  Q0 {9 s7 |
# ]" O. q6 K/ D# n4 W7 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" D$ ]1 J) w: m$ g1 j7 d
unsigned int count_copy = 0;
$ d- R+ K( W5 o0 [( Q
& Y  x8 R7 r$ s6 o6 s8 E; B
, @6 Z2 q% }7 D. l3 Z( g' G# d5 Oint main()6 ]; n# X1 u( a- s
{* w. p+ N: @$ r/ R- M0 M4 e
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" `; h: _! i/ k        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 G- r% D9 c0 p; ?+ C! J

4 A2 I/ j) j5 C8 F        while(1)
, e0 {* E! b3 F' E+ V( W% y# ]+ D        {
, ~2 Z8 k" q0 t/ |  I                read_MSG_buffer(pshreRAM);
, m  j4 {7 D! D7 e) C        }               
6 M7 B' k: {. a% @/ A}7 v3 V, r" c/ P, n; {
& O$ Z; t. m' _! E  T4 q; y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 r0 J1 }* w; N3 J* ^# V7 B# G
{
. w, ^2 g5 I$ f' ~        RX_MSG_PROTOCOL buf;: }1 a1 I, i8 H% k
        
6 I' P  U4 C- d( g; x/ P        buf.a = pshreRAM->a;. \  t, C: ?; O$ Q% w9 z2 A" v8 H4 ^
        buf.b = pshreRAM->b;3 M+ E. j4 I) Y0 {" S; p" v
        buf.packet_cout = pshreRAM->packet_cout;
/ ?- `6 q, U& y3 g3 f) B! g( M; S        . m' M: P5 r8 c0 D
        if(buf.packet_cout != count_copy)3 x. s+ e' h! _
        {% t( @0 `7 F6 G# j1 [3 |' T
                printf("a is %d\n", buf.a);8 P$ S, ^" S& B9 @( a& E
                printf("b is %d\n", buf.b);
: t* W+ K1 C9 ]7 a5 e. B6 `5 c                printf("count is %d\n", buf.packet_cout);2 X3 J) c5 x" Y  U! j+ J
                count_copy = buf.packet_cout;
9 M% L2 Z6 d% [0 j& |        }
, u, ]1 \1 T- k8 t* b* i: Y        else
6 ^) n6 a. e" w1 k0 {4 Y3 T        {
5 _4 N5 j/ W( [+ B                printf("No effective message!");
' Q+ P) Z/ g$ g) K        }
) K- S# U# L% c  H5 T. _1 @}2 X& `! ~$ e4 D; J) s" [2 k

6 F2 _  R, ^1 O; l3 g
# N- E. l; t; W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 o4 p2 l, g8 s5 S6 j( D' }4 |7 d
使用下面代码,对内存使用了mmap函数后:
9 R  m9 k" u0 v4 f' Q; z#include <stdio.h>8 y% }) u8 v! r# z
#include <unistd.h>
/ W# R8 x/ _6 Z- F# s, s#include <sys/mman.h>
# [5 l# V3 Q; N5 ?! w6 P- t+ c5 h) ]#include <sys/types.h>  D& l+ {+ V0 J) x7 i+ j+ n
#include <fcntl.h>4 y6 I: ?& I2 O8 k% m% B6 a" U  p
; m! g( y9 \6 L8 C" l$ O) D
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ y6 l- \' m% ^! ^! K2 U
#define SHAER_RAM_SIZE         (0x20000)   
- P8 r% i2 K3 O- @
% r1 a3 Q6 }" i; ttypedef struct# M4 {+ X9 G3 ~- ^9 V# w, t7 }1 ]+ v
{
. Z$ P5 @7 {/ V5 W" c" S        unsigned int a;, W6 J# Y6 t$ j8 U5 K
        unsigned int b;, w  ~' M5 a4 W2 G5 G0 x
        unsigned int packet_cout;
, j: O  \) O1 s! X6 L0 n$ O+ F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) D" L0 P4 ]. [  m6 o
+ N& d3 B2 X6 A1 N6 J! hvoid read_MSG_buffer(int *baseaddr);
/ ~! l1 o7 t' nunsigned int count_copy = 0;
5 G5 N3 Q2 z, ]* P0 G8 X# t! K' ]
int main()4 h2 D+ w: r, y5 P& L2 K
{3 \# E  l8 h! C0 L
        int fd;
- p! P: L& S4 E' P        int *mem = NULL;4 r( E6 O  D+ I  @/ e
& P4 L4 x- [8 e) B# x
        if((fd = open("/dev/mem", O_RDWR)) <0)$ N4 y9 b! U6 g
        {& e8 O' c, I/ I9 F1 n
                perror("open error");
+ E; {7 _7 J. ^  V! q                return -1;
& ^2 z* T* y/ n) y3 ?! M' g        }* n& q$ O  \8 _, g& z
        0 G' c4 L6 _$ n' Y6 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ e4 n5 h+ I# q5 Q

/ j( T, B4 ]" v) M% S) F9 ?5 R        while(1); `) G- y0 X+ S9 x4 ~* j
        {
3 r9 K/ ?4 i* ?7 ?- S& L                read_MSG_buffer(mem);4 h$ ?( f" k4 B' R5 ~: I
        }               
$ X1 D5 h' E* L, V$ x0 T$ I+ k4 g}! S* |/ D: H, d5 u. g. h

$ `7 `  G$ S2 ^2 [$ }0 Wvoid read_MSG_buffer(int *baseaddr)" W% T3 r8 U- v5 V
{
/ e. z+ V) ~9 b0 I$ e; b. {" N        pRX_MSG_PROTOCOL pshreRAM = NULL;
- V, g3 b' \- z2 Z$ |8 O2 u- M. d# Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# J# V# r0 O- f4 H1 W
! @# k+ P/ [! |- a+ O. e        if(pshreRAM->packet_cout != count_copy)
2 I- `& \/ W: U" Y        {2 H) [) q& J. E0 o& T* {
                printf("a is %d\n", pshreRAM->a);
3 T% _: l& A( D' }                printf("b is %d\n", pshreRAM->b);% }9 {/ W1 W. o/ D7 v# r
                printf("count is %d\n", pshreRAM->packet_cout);
9 U3 g! Y" w2 }+ N                count_copy = pshreRAM->packet_cout;
) B- f) Z  |/ `; z8 ]        }
2 X% S+ r$ Y% X) C2 ^- p0 X5 G        else& }! Y9 E1 f* ]& C4 V- r3 a: l' h
        {
1 z6 l0 x. q2 d* h                printf("No effective message!\n");) y  g- j) e" d( e6 ]3 G0 z' q4 d8 P7 z* o5 S
        }
, u9 D$ `6 v. t0 h4 q7 J8 J6 Z}; F! H+ g1 C2 F# A" N3 J( V4 p! f

9 f" x" W, |" _# m& ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 r; T7 v; O" P7 E% U" f0 \7 ^  ]! A* W$ v- Y; [7 g1 n1 R

0 \, L3 Y1 V5 f. a' X* T  F, X
+ z6 W! t6 e8 \8 H
0 g* i6 ?5 c& g; [, J1 B0 t7 Q




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