嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ~- t+ w0 V# @9 ]' W  \' ^2 O: g; f& @" {- b8 B7 ]  s) v) @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* J% ~. B; M; L1 b
#include <unistd.h>
: F2 `7 ], f) V! a7 b6 i#include <sys/mman.h>0 L: p4 s0 j" [( V! n1 J1 K
#include <sys/types.h>8 c5 ?7 X8 E/ ?# G% T$ I$ m
#include <fcntl.h>
0 X( u; T) q9 I6 `& i) q7 I8 m3 p4 ]# ^) P
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ m; f7 Z3 R8 D/ O, U1 i1 q. [- j: ?6 N. E6 C
typedef struct( ]( f5 p  B6 X5 ~
{5 y; s5 ?7 P. @6 R0 ?; Y& ^' C
        unsigned int a;- P) C- ]: E3 U  Q7 y
        unsigned int b;0 q' c( v. B/ z$ O0 X
        unsigned int packet_cout;7 j8 b) g0 p- {6 w) [# ^0 Q! I8 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 q& `5 u1 P! W, [1 e2 Z) W
) {* V& J( R$ ^6 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) B- E$ @' X5 c9 w
unsigned int count_copy = 0;
7 J0 z$ u/ R& B3 n+ z0 v* u6 D- P8 M3 w/ W' p
. R; s& t! ~' f
int main()& J0 A6 G3 K  @5 G- m1 a
{
' N: L( ~) H# l7 s5 Y        pRX_MSG_PROTOCOL pshreRAM = NULL;
* ?2 `9 v1 l/ E8 `8 L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) T* f( M  F2 M2 p+ p

; r8 o8 i; d. m/ }5 w        while(1)4 O- }/ ~0 U) {/ }- J
        {! x  a4 v* N! A! J! [4 y
                read_MSG_buffer(pshreRAM);/ E: b3 B: u, a" ?- g& N& b
        }                ! ]; d, M' H' c
}
# f% S6 G2 [2 p; a4 b: i& O0 R) O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 G9 T2 g1 ]  e% [* H: T
{' `1 U' y7 {4 c# B- d) B- c6 x
        RX_MSG_PROTOCOL buf;2 H5 |/ s8 E$ E8 _! I7 |: V3 @. U
        
6 L4 V" H% w4 Q) s9 S        buf.a = pshreRAM->a;# e& F1 W  q) }& e
        buf.b = pshreRAM->b;
" h. M2 ^+ K$ _; c, U        buf.packet_cout = pshreRAM->packet_cout;
; o& B/ |% L% s# V) Y        - z5 P8 I& Y; l9 \
        if(buf.packet_cout != count_copy)  M7 U6 }: I7 K( N' y' e
        {8 t* }$ A; Q  J  |' s
                printf("a is %d\n", buf.a);
; d0 y) P, J" r( a; Q+ L0 |                printf("b is %d\n", buf.b);, f: d4 K  t+ Z0 a; [6 ?4 P0 \; W0 L. T
                printf("count is %d\n", buf.packet_cout);
1 Z* \3 v5 [* {. r% B8 R9 |; y                count_copy = buf.packet_cout;5 w' B$ f" L  J) ]
        }. q* f% _" k6 X0 |! G* t( I! O9 a7 M
        else
& V% _8 ]# M/ N# \7 ]+ X        {2 l) i! U* S  Y2 x; P$ F
                printf("No effective message!");7 O; J' x0 |& W5 r' _" z7 r  s; p2 D/ N
        }
% `& O' j- ^9 V! O. f}+ S) f: b2 t, h1 m

) S( [/ d8 t" h3 t8 w( G. z4 |% L9 L1 d; F! ^+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% r4 v2 d+ @9 H  O1 A# F使用下面代码,对内存使用了mmap函数后:
. o1 i* P/ x: Q) W! Z3 D#include <stdio.h>
, K: g* L7 O& @4 E3 U( B#include <unistd.h>% x7 x1 @% s1 @2 i1 h* j
#include <sys/mman.h>
' z4 |. p' H6 U5 s+ _#include <sys/types.h>( v, y- R+ Q, i/ \8 d( z
#include <fcntl.h>
( [/ a! ?* X3 O  z# |
% P% e% @3 B2 f6 p2 Q#define SHAER_RAM_BASE_ADDR    (0x80000000)" a3 ]8 c+ ^+ m- z4 o
#define SHAER_RAM_SIZE         (0x20000)   / _8 |# l. y) w6 T
% b' F2 |4 r6 U5 e  \2 R4 i
typedef struct, \2 J" K* S; ?7 e( S* W7 J
{9 \& ^8 ^5 [. T/ U% W; E
        unsigned int a;8 @( I) X( d0 e! H& R
        unsigned int b;
; J5 Z8 u8 O% X        unsigned int packet_cout;
  o. D( {0 ^* A8 b' v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" V# @( J9 e. r9 P
$ k' b5 W* ?- E+ m- E; [void read_MSG_buffer(int *baseaddr);
! r& t6 p  @: @1 r' F% M" J' E9 m* e# N6 tunsigned int count_copy = 0;' C3 E; Y# [4 V* O* \5 I# _
: x' i5 x1 M! [9 h
int main()7 M! ^1 _9 U4 K" J( S2 n
{
2 u( c0 c" |+ S4 }' p, l7 G        int fd;
" w& d! K1 f5 {! j" H, d        int *mem = NULL;- g8 N. M7 _4 B
+ V1 c: D1 C: i- y) E+ D8 \
        if((fd = open("/dev/mem", O_RDWR)) <0)$ J  E7 P! l- U2 p7 x! e
        {) s/ ?1 W: d7 C8 P, O- C
                perror("open error");
$ o# l* Q8 ~7 N- S                return -1;
0 J2 n4 a, \* X) Q1 J+ ?! \        }
. J3 A7 j; j5 l( G5 [        + M, J' Z; |, W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) a2 i- {" c0 C( n- q9 G" L
" q" D/ S) {* w& M4 p, \( Q        while(1)
% |( O/ v5 B9 s; R2 r& h8 A        {% i: X! i8 q- ^' w' j( ?1 I( ?
                read_MSG_buffer(mem);
) M: c" I" w! g! M4 N4 H% ^        }                ' P: V4 Y4 o* L" r
}
$ |7 k1 E3 D9 ?6 y! w, X
# `  [0 f% e) }( B* Wvoid read_MSG_buffer(int *baseaddr)1 T8 W, w, _" `7 O
{
$ d7 s$ Z+ B" |0 {9 X, M. E- G        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 c% }9 C- y# E- E9 I5 I7 U
' W" B& `5 @, T1 |) C) z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' s, Q5 q2 \) J8 z: S% N
! i& l0 q0 t- I  V( y
        if(pshreRAM->packet_cout != count_copy)6 m9 U7 ^8 t8 z/ d3 y9 N5 F7 \
        {+ M9 [0 F# g+ o; i0 F# }9 X+ v+ b# `
                printf("a is %d\n", pshreRAM->a);5 d, w/ N" U4 d5 Y2 O; X5 l
                printf("b is %d\n", pshreRAM->b);' [/ j1 f% z0 ~8 N: B" M/ _7 p- I
                printf("count is %d\n", pshreRAM->packet_cout);; V+ l  |1 {* `
                count_copy = pshreRAM->packet_cout;
$ f  v, j# L  I3 N) R- e        }8 P4 ~. D/ T( M. p; w
        else
9 b7 t$ H: e! @8 y2 R        {6 O" G% o' F7 x* _+ d+ g- w
                printf("No effective message!\n");- v/ O2 l" m7 _1 i1 u- l1 U: H
        }. H7 a. A5 }' C0 g. T
}2 H1 |6 v2 B6 k' l. n+ N
7 K3 d# y% Q2 V' I: p% }9 Z/ E* n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' Y7 k, ?' n( Q0 s* T5 P! \

5 l* T8 v  w0 t4 ~) y+ y, O0 ^3 v% ]8 K6 S# v

  o; }: r  Y7 `3 y; t4 _
6 z/ _; r& g  ]$ B




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