嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 p+ c7 W' F8 d2 a/ j" ]3 K
$ p% [2 h7 w+ Z$ @- EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' ?9 ?2 ?; s" q) A  \9 D5 S" Y#include <unistd.h>
9 t( y# u8 y2 b  C. C6 y* {2 _' j#include <sys/mman.h>
3 t- G; h$ E2 c/ n  a; U) v4 i* y9 r#include <sys/types.h>
  }- b& q  U- j) r#include <fcntl.h>4 [* j4 ^0 ]0 {" ~7 I
) K) u, J( l% K& ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% ]& j9 H3 l4 A: e0 J, Y
! S; p, S8 |' j! d1 rtypedef struct
) U! r  u) b- S  R) [{' P, t- ~: s% j: C
        unsigned int a;
  f) g0 P( J. M# ?# L- ]7 c        unsigned int b;
0 w0 ~6 V) z% S3 b4 E) }$ f7 x& x; c        unsigned int packet_cout;
1 J+ x9 `! ~% I% r9 R/ J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 h* ~+ V# O$ \
& d" Q( t% |% T" J) g( c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& p( n% B9 M9 F
unsigned int count_copy = 0;
* Y2 O; s, C5 y( U! b) O8 J  m! V/ m) f/ K5 S. x: x0 z4 Z" }
( v. ~8 r6 ?/ u* M
int main()0 }  y4 ?+ b9 P( L1 V
{/ u# ?4 O( y# x- l# y  c8 z7 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;. Q& x- A0 F- N+ x$ M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 F" N! Q+ \7 E# d$ ~+ j" b

; E6 Z6 W' C  s3 Z0 P        while(1)
' _2 T6 x: }$ Q" G+ H, i        {
2 D' L* H4 S$ b6 W* n4 R                read_MSG_buffer(pshreRAM);
% d7 f, C2 i: s9 t        }               
6 r8 |  r% j: m9 M}
4 z1 U# Z+ m6 s& L" X
" i7 @( P# `" J# C  }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 J9 I3 a- Q' C8 ]5 @5 s) n5 T{! I: C4 [6 x$ W* X  h
        RX_MSG_PROTOCOL buf;
9 s9 J4 Y7 T0 }8 w        , c$ o4 B4 d( q6 C
        buf.a = pshreRAM->a;( \& C3 z  m9 A$ D+ b0 o' {
        buf.b = pshreRAM->b;+ f( J) S5 ^% Q
        buf.packet_cout = pshreRAM->packet_cout;% r; t( z+ A" J
        $ L, z- W( M; k9 n% H0 \
        if(buf.packet_cout != count_copy)
+ V5 ]* q& H: J        {
% Y& D/ ~5 L# V7 C* ~                printf("a is %d\n", buf.a);' [/ v: B* A  W( _
                printf("b is %d\n", buf.b);
8 A- C3 L" m0 d3 k2 |                printf("count is %d\n", buf.packet_cout);
8 {, `. G$ ]' S                count_copy = buf.packet_cout;* }1 ?! Q/ ^+ q7 b) R& N1 J1 d- t
        }
. ~$ m2 G5 W9 h8 f: p        else' m8 \/ U5 O" p# {9 ~5 t" L3 ~
        {
' E; m( D2 t& |- p' M                printf("No effective message!");1 a. C8 I+ ?4 M; |4 {$ V+ ?
        }5 g% U7 ~9 z( K% t2 y$ {- y- G
}* ^+ O! v( s" o0 ~+ l5 o  {
* O9 x$ H0 L7 J4 V9 f
5 X8 T8 |/ c9 E- R' Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, ~1 U: C; _, F* Q5 c5 z3 `7 ?使用下面代码,对内存使用了mmap函数后:
+ r; P$ J& j2 D0 n7 b#include <stdio.h>
4 B' N- [" w# \  [/ y( a#include <unistd.h>
; B3 B( W1 I/ M6 C#include <sys/mman.h>& J( `1 V* W8 F  Q. O/ l
#include <sys/types.h>
7 M/ Y- ?" a2 y2 e* D#include <fcntl.h>
8 J: _9 a7 L, k  {1 d' O
" h" r9 `+ P4 x+ ?  a+ X9 m+ O#define SHAER_RAM_BASE_ADDR    (0x80000000)2 g, r! ~/ R* {" ~+ h- p
#define SHAER_RAM_SIZE         (0x20000)   
0 ]& |; u/ R4 C0 Q: j/ C- i, v% s
( y& E( y: |8 q( `9 y2 k* s0 Ktypedef struct
  Y& ~' T: ?# B. D{
$ M7 ?( k. z/ Y* b5 P0 G        unsigned int a;
& J' J% M) G* ?  X        unsigned int b;
1 ~. q2 a( b. W  s* q. z, S8 |        unsigned int packet_cout;- N! c& b9 D2 i: N' _- v; ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' b1 L) k3 p' a; z6 o% T
; z9 y$ T, H4 ivoid read_MSG_buffer(int *baseaddr);- @9 g( R! e3 j2 T. X
unsigned int count_copy = 0;) z& V; m6 _2 f9 h% k

8 a2 D% p! g" {7 ?int main()( N2 g! {0 X0 D
{
! K3 V9 N3 U3 q( v5 M5 w        int fd;& ~/ J8 e9 \: ?9 V" z0 l' j) n) a
        int *mem = NULL;
1 c& j; \2 R' n; K+ W1 U1 F- F% x- F: T, k# W4 z7 l
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ k6 s6 r; ~) B( L  R1 ~2 q& T5 a        {
2 u$ X3 E4 l$ u7 u8 R                perror("open error");
3 e0 _( m% r( e' I                return -1;; c; A. Y5 F5 L6 B
        }
6 E. J. P: i3 ]% ^% X        , t9 j& }3 ?+ N% F- N" D) t/ T* `
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. e8 N0 Q9 ~# t2 G2 ]+ [1 D0 k6 q% P' o6 Z8 s" |3 c2 v6 {* ?
        while(1)
# A  T: n) O6 t+ s        {
3 f) j9 ~  h9 k7 y                read_MSG_buffer(mem);
2 G9 M4 @% j: i8 W# z" n. s: }        }                # y! H" D( ]9 Y
}
! V' i/ f' S3 |$ {$ u; j/ |; j5 w- C! S
void read_MSG_buffer(int *baseaddr)
6 H1 s! {# z4 c" W4 X  D6 s{
& N) j1 Z5 m  w0 e8 }        pRX_MSG_PROTOCOL pshreRAM = NULL;( m4 e' {1 {; P  e+ Y& S
* I) Q( p4 T  ^1 v5 U
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 O' u: j. Y* k/ n) d, Y7 M
  K  v* I5 V4 N& S9 a5 A$ {        if(pshreRAM->packet_cout != count_copy)# U8 V0 H- B1 `1 x
        {
  h- t' [2 l9 P8 z1 M                printf("a is %d\n", pshreRAM->a);
/ N4 M6 T( I- b' s+ G5 F- g                printf("b is %d\n", pshreRAM->b);
4 M" t1 b, z/ Y1 R5 C: V0 J1 o                printf("count is %d\n", pshreRAM->packet_cout);8 G2 n7 q1 e) B
                count_copy = pshreRAM->packet_cout;
5 R- q5 ?1 a+ o        }
) H9 A. t8 f) }" i! G2 W: e5 K& ?        else2 d: Z2 Y! _7 `, h  L- b0 ~& p
        {
# Y# C! g8 D7 T' }" \9 p                printf("No effective message!\n");2 J: T) v1 F# G2 E( K! v
        }) I4 G/ K5 Z3 b' }: W; z5 v1 W& H& C
}* K& \5 u! X! z2 i

2 e; s0 m; k0 w- S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 K: r+ d* o* a3 f5 ^

+ B+ ?3 z  j. q& U
$ C0 v9 e3 d( h) I/ N% D8 S0 T2 w4 \" J) g

6 P" t( w# r3 d




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