嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 e# ^  h3 m5 Q' ^0 Z
- H& I3 ]" S# v( I2 wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 e8 K6 i# P2 U! K
#include <unistd.h>
2 a$ S( e. `0 o% j1 I$ {2 ^#include <sys/mman.h>
: e9 @  r6 j3 ]/ y; k#include <sys/types.h>
8 n  M" `1 q9 \% e# @: w#include <fcntl.h>
9 R; O& e) z! }5 c& Q  c  a+ V% G5 W# ~' |7 y% ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 j$ A6 I/ C' h: ]) s$ j: f

  Y+ u0 K2 L* W& ctypedef struct! r8 ~9 M$ P) r& z# r% P
{
$ Z* `' G' i' M1 ^        unsigned int a;
9 i( s' b' i- O        unsigned int b;4 X0 O  r9 @9 K6 d/ m' X; O) |/ K
        unsigned int packet_cout;8 X8 w5 f) |. j; B" T8 Q5 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 M! N, J' e* _) y
8 W: }' m# U/ ?' wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' M7 E" W3 N7 L; ]$ k5 q. Xunsigned int count_copy = 0;& [6 T" w4 K. ~" ^6 B/ H* _

* a5 J! G8 R7 `$ R9 B/ _0 _
# L6 x, D5 ~- o+ g: z$ `int main()7 g7 ?; E' F9 R9 I% [
{# k5 @4 e/ K$ d4 \6 e* x. k
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  M- p, e3 f& w% f% ~: i        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# N. ~. h% }$ Q  V' e! w" o" F3 R! c' ]5 g
        while(1)  c' n1 {, }6 V$ d2 Y" f
        {, Z& Q8 T6 ~  L, H8 N5 \; ]& T
                read_MSG_buffer(pshreRAM);
0 y0 `1 Z8 M7 u        }                2 [* m) u  {) O
}
- Q5 i! Y1 G  E) |: \  z( G4 c* H. B2 C: ]" E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# ?1 f! O6 ^0 l7 L" W
{1 i' [: I# n3 D
        RX_MSG_PROTOCOL buf;
: Y- K  d6 r( w. `        
2 B# k: [5 S- w1 }% F        buf.a = pshreRAM->a;" f% ]& y" G  I5 g" a' ^" W) V2 d
        buf.b = pshreRAM->b;* o1 D% g; U# p
        buf.packet_cout = pshreRAM->packet_cout;, Z& l8 q0 D6 ]/ O' R
        
1 u  P, f- i0 w6 Z        if(buf.packet_cout != count_copy)
6 X7 p1 Q4 G# d$ `( n        {* W! b' Q/ ]6 J/ V
                printf("a is %d\n", buf.a);
& v7 j0 H! W0 T/ |+ v- K1 \                printf("b is %d\n", buf.b);$ U+ t* ^  Z1 F' p2 ^
                printf("count is %d\n", buf.packet_cout);
4 n- ]4 C% ^2 P/ R) L* e; p8 T# ]                count_copy = buf.packet_cout;
+ N" w/ s3 D. W        }5 B- c9 G" A& W1 W+ |
        else
* j$ ?) D5 z( u: ~        {
' o5 \" @3 \7 V! y' w$ [- \1 ]                printf("No effective message!");& `+ \9 [  o6 _
        }
; j# J/ e3 G3 _1 g1 @# Y}
" A5 s, @0 @6 x5 H7 {; _" h" q6 r2 ]. y: I$ e9 _
7 {9 P5 v0 F4 x. y0 T; P: m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) a- K' k. X  D% L$ B4 H2 l
使用下面代码,对内存使用了mmap函数后:% h! C9 o3 y- {* Y0 s8 C4 d
#include <stdio.h>
# o. p! _, K4 f; F2 _! v' A#include <unistd.h>
& z& h3 p# O- E6 G# J2 G) [#include <sys/mman.h>
: K2 O5 i8 A. ~* v7 z$ h#include <sys/types.h>
+ w* P8 f0 W' c' l1 |4 g#include <fcntl.h>' ~# r" C' \6 v! n4 E0 Q5 J

3 p% F0 u( K! @/ n: }$ o  r& v#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 ]% q$ C2 }  P0 G#define SHAER_RAM_SIZE         (0x20000)   
; b! K# F# Y+ B. m
2 O, [4 I* c; b. wtypedef struct( z( ]. ]5 A+ A: I$ M: P
{: [/ m$ c4 x$ W2 V' P' e; u* M
        unsigned int a;7 Y3 d! R; _4 E
        unsigned int b;
4 W& R7 r, ]1 A9 m4 {1 N; R, `        unsigned int packet_cout;* F: _/ M, A2 b: F; {& d) g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( B) Z2 r  P; h* i  s4 s9 I
. K9 Y5 X% j5 }/ |3 P( O8 S
void read_MSG_buffer(int *baseaddr);
  h5 }- v8 ?: z; F0 Aunsigned int count_copy = 0;
7 A' j$ _$ F( j" b4 Z% }, ~7 a' C8 e+ `) z3 f# b- Z0 J5 g
int main()
1 I% \2 g3 I. z% {, H{
+ J$ W2 k. E3 o+ y        int fd;
! [- n( B& y8 i! z7 U1 q  R2 M/ S. }        int *mem = NULL;4 [5 B3 v" H4 E& ^3 f7 F8 ]+ B
4 p9 a4 [  ^9 ~; i  ^/ B  r9 h+ P) a. C
        if((fd = open("/dev/mem", O_RDWR)) <0)- e% P4 ^, @4 N. X7 W7 d3 d
        {
5 [  u* ~+ h+ h                perror("open error");
. J/ f7 P% X2 T+ B; F, s                return -1;# j( I; x$ _+ B' k. ?# |. r  H6 D
        }) v) `3 T2 `- G, [8 X% s) V
        
! h9 q$ a( O; c2 W2 b. A" D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* F8 S$ W) X+ I! Q- {5 |
2 t4 F7 B3 z( L# T* @9 x        while(1)
9 e) p/ n" @, U6 v7 T; `9 Y        {$ u7 \; k/ P) e+ S* n1 f
                read_MSG_buffer(mem);6 X. _* N: G$ n) m( `# v
        }                1 X) B" G7 P  @% Q. |5 {/ Q+ [
}- o5 ^% ^& w. ]/ t7 q. z5 M# s

  r$ b5 x$ N6 k( X6 P$ }8 \void read_MSG_buffer(int *baseaddr)
, V2 W- }/ s- T& v4 p- }* k% p{
% M0 M: U, F: C1 i8 ?8 v        pRX_MSG_PROTOCOL pshreRAM = NULL;+ C! |& x* r- J% R( x, }$ G
% |% G0 \4 L$ _% a+ M: s' w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) H3 h: j0 m+ n- K9 \
+ Y5 k; u# ^' |" v        if(pshreRAM->packet_cout != count_copy)
' G! A2 E7 C) ^3 b, K+ O0 P        {7 z7 c. x8 f- {9 h
                printf("a is %d\n", pshreRAM->a);
; M# a# \7 _5 {! j$ Z0 x/ y* p                printf("b is %d\n", pshreRAM->b);
8 d7 U- ^2 J2 I                printf("count is %d\n", pshreRAM->packet_cout);
  E; Z4 L9 |5 l" o. Z3 Z; _                count_copy = pshreRAM->packet_cout;  x5 a* [/ O" r( W
        }+ A: b5 C; C+ f4 @. g
        else. d' b0 \' H/ T, h' f/ q
        {2 ~) ?0 o2 E( j6 Q8 s
                printf("No effective message!\n");- |. z. t0 W* A% ^) |( p; r
        }7 R) Y6 i6 b' K# [; j  |  E
}1 ]% Z% V8 s3 P' c1 t
9 S3 c: Q3 |  i# M3 V& I/ N! F# ~; n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 y$ j9 N# o, @  ~3 W7 D
, a2 W$ R, _$ r
7 Z3 ?. \" o: G5 g3 d0 \
8 v/ Y% f% `0 t' l) y% P' y: D3 i( ~0 f$ O, e' I2 Z





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