嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " N& X, X: d2 N) @. |

! q8 z2 D; ]- F; a) y0 @8 @! mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 P% x' c, e4 p7 v0 C
#include <unistd.h>
: v9 L1 M  ?/ U9 z#include <sys/mman.h>
, U$ S6 q$ q* k/ w  D7 l: Z% M#include <sys/types.h>0 W# n7 g6 o: t- a
#include <fcntl.h>0 D% Q/ f3 S6 B4 Q
, c+ ^& ^7 T' ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 Q/ d/ i  Y" c8 P: u  m% l. |
$ F- R3 e; H6 X0 I1 u0 a& u
typedef struct4 @& m6 Y# |) W  o% h
{
; ^) r: \5 a; s; {/ W        unsigned int a;' T0 l6 X6 a, j' M6 Z4 t9 b4 r- Q, ]
        unsigned int b;
2 ?* q# L4 j! k8 {9 V: X        unsigned int packet_cout;; f9 t/ P5 Q. `3 p; `$ B1 c9 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& t* ^! g) C0 A+ b( n( l; f# K2 T. P) D. z( e' F! m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 c! X0 U0 h) ~4 J; l
unsigned int count_copy = 0;
; g  f# |, p4 @3 X( Q5 X
1 l! {  N4 o" k" ]6 {, e/ X7 o7 r& Z; p) x7 k
int main()
! H5 L5 W3 v6 h, j% e{1 G/ c" f, B% j6 r1 S; _. {1 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 J7 @* z" U" v5 N# I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 F2 O- f$ F1 P( ]+ z  }

" m/ Y& j$ P' d        while(1)2 E* }/ @# \7 g2 o# X
        {, a6 [% g. G. v
                read_MSG_buffer(pshreRAM);
: \, s/ q* V. N3 V; W2 [* F0 a        }               
) y  W. A* I5 i7 u) o, N: V5 G}
7 J7 ^' K8 @  T3 ]: m/ c4 y
8 c. u- {( @, V; f6 c1 s$ Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ {6 X' k6 P% I+ r! `
{
0 v  `% w$ Q$ p3 D' R, Y- C  o        RX_MSG_PROTOCOL buf;
) L9 n8 b& S0 {6 A* q( l        ' \8 E9 P7 r$ W9 g8 @: `  U; c, r
        buf.a = pshreRAM->a;
. r1 Z1 \7 `( W& t        buf.b = pshreRAM->b;
* X; |2 _. D; T9 Q        buf.packet_cout = pshreRAM->packet_cout;
) f6 t& V5 s, N) B6 {        
) E' u% d, `  D) x/ I1 W        if(buf.packet_cout != count_copy)/ n' v& D+ u! E, ?( O
        {! @' z' O0 g- j8 h7 T
                printf("a is %d\n", buf.a);
0 B- L' x4 g( q+ v1 i. j& z                printf("b is %d\n", buf.b);0 R6 o3 w! [. l
                printf("count is %d\n", buf.packet_cout);
+ s  {0 }( B/ x! A  y: q" m+ l                count_copy = buf.packet_cout;% M+ \: Q  R$ B7 r! w
        }# N0 C7 ^: X- P# B+ K0 }
        else: _' D; v' v3 U1 U5 s
        {
, L6 D1 D6 f5 o+ a# Q2 H! x) h                printf("No effective message!");$ V/ ]! l. A# L! \# S
        }/ s! \* @  x% Q1 x
}
) I& }- ^' H6 O( j4 C+ S. P4 J2 L  r9 I' O7 m8 u
0 b, {% ^1 @* Q2 T( T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ i1 \7 `; @0 x6 g4 k0 H
使用下面代码,对内存使用了mmap函数后:; t4 N$ H' ^+ ?5 o
#include <stdio.h>: v- Z! b4 I: g7 ~7 u9 J
#include <unistd.h>
2 |2 R+ O6 J: @8 x#include <sys/mman.h>( t9 ?/ H6 v0 t" l# s7 M( f7 W1 x6 }
#include <sys/types.h>
; J: I1 |) H4 z6 q2 f: ?  }9 F#include <fcntl.h>" ~& y9 `& Z$ e: j, m, T7 X# n4 A

) u  y  Y% Q5 q6 J- O#define SHAER_RAM_BASE_ADDR    (0x80000000)
. @  D3 \7 o$ v% f# W#define SHAER_RAM_SIZE         (0x20000)   
, Q# S  b/ m% Z; h& @  X9 ~! P: H
: ]/ a- Y; A  s2 @! B6 }typedef struct5 Q& I& z) K8 n: s( _
{
, \- ?" W: n! y" K        unsigned int a;
8 h/ V2 ^+ v# I) H2 }        unsigned int b;) [6 m& M$ f2 A2 ^; Z0 v6 ]7 P5 @9 W
        unsigned int packet_cout;& b" M, ?2 J- J/ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* U3 e5 R: b1 @" M1 k* o/ {1 S
+ b0 q' T  v' U2 l' g, _
void read_MSG_buffer(int *baseaddr);5 v% l$ E1 i# l+ q( ]6 W
unsigned int count_copy = 0;
& l% u9 _: e/ Y) X! y: n4 Z# I: C( ?4 H' R4 X8 a: |
int main()
8 T7 G* E  W" z: d1 J4 H) D{
8 s8 B' \" \4 }$ @& `        int fd;) Z, W8 j. h5 K( d( |3 }
        int *mem = NULL;
, {* ^5 d) C9 i; o' {* ?' w  Q6 |" ?" d3 J
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 T: v8 J, v! H# y% `        {! i3 e( v  L4 Q/ X- }) J! w
                perror("open error");
! M& @* M9 A0 |+ N3 z  K9 k                return -1;
/ {) z& O' k0 O- F" U        }
/ h( o! i) G' F        6 u* A  Z) b& D1 q3 Z: V# ?# ?& x- ^' |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 F( s2 U* [! O* Z& W8 M/ n. l$ |- m/ z' s# z
        while(1)
6 \& |# ^5 f: @4 ~        {! r4 y6 Y+ A# m3 J% {
                read_MSG_buffer(mem);
' y% P4 G& J$ i# m        }               
! h7 I/ T3 c+ m5 m  P4 e9 W- \}" `- K  G2 ?! s. x* n: C3 G* [
- x+ j) e9 O" w8 f" R0 ?
void read_MSG_buffer(int *baseaddr)
, P5 @  s: f, z( J& b$ `% c8 ~{
; e8 ?& i" g* A- m4 z1 E! F+ r        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 A# g7 w" w' M
6 A/ `' h% X7 F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 t/ U$ W( k2 f! B+ U$ w1 g. N# J
9 i0 l# I* y( h$ Z        if(pshreRAM->packet_cout != count_copy)
- i5 c* t) ~) @' I+ z. ?* E7 r        {! T+ T8 A4 H3 ]* c$ B- C
                printf("a is %d\n", pshreRAM->a);4 d" G! f4 m3 t" T2 H! U& {
                printf("b is %d\n", pshreRAM->b);
5 p  r2 L3 l; M2 f1 q1 v4 v                printf("count is %d\n", pshreRAM->packet_cout);
4 t* n+ P% c3 f* k9 s: U8 n                count_copy = pshreRAM->packet_cout;! R5 q: C0 {: B. |
        }
9 u5 O: k/ i( w        else
$ u* C4 N/ A& `  \" a+ [        {' ]6 z5 y8 i& w+ A( {' s
                printf("No effective message!\n");
( @1 m0 G- d3 W        }
* ~$ \# V) l6 j% X5 v}
* T6 `2 S: D- K3 ?$ `4 ?! c* F( @: i/ k1 C+ V& t" L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 K$ h: R2 j9 j; _- }" W( I

  f4 I' R, G5 Z9 `
2 I3 t3 R  v/ F) ^
2 `/ {. I3 L4 O3 i1 i
, x& H: \: g( q




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