OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5038|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + J- o: c6 }6 {% T: ^' {+ L% z
; p$ }% ^# V- \$ Z9 i7 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- T3 n$ c+ V) D& T8 f+ {2 `
#include <unistd.h>
' d' i+ @9 U  D+ E#include <sys/mman.h>3 a: M) v8 C# O' p+ W- W! |7 F
#include <sys/types.h>3 e$ w% h6 |  d6 F. c
#include <fcntl.h>, l0 i3 }6 I2 z* g
$ W2 f9 L" B5 z( p5 O) l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * n% m& E; w% q/ g" P
+ y6 X4 A: ]( ~* y5 A* G
typedef struct
6 \# q; O9 B# F- ?4 D, i* Q{: Y" }7 o6 K% y. q4 ~/ r( `/ \
        unsigned int a;) o1 {, p* _1 Q, p& p
        unsigned int b;/ b' {9 a, B, C  y% [
        unsigned int packet_cout;
/ y6 N- C% h5 k' N! H! Q6 l$ |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 W6 f/ n( u( @) c, R7 [; A9 C' H; L2 f2 K( C1 w, f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, z9 V9 `2 ?6 @( m" }# e
unsigned int count_copy = 0;2 l4 d/ L( f) z7 T3 L( ^) i- k
8 `3 T( W4 D. K( H

: r) n' R* d( f) z- Rint main()  k% @. B* C$ ^- H# x: F- Q
{
& a7 S/ i0 y2 t3 j        pRX_MSG_PROTOCOL pshreRAM = NULL;
& I" b' j$ r5 d& z& t; h. V) t7 S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 [6 d0 I1 u& j7 ^) o9 v5 E
: b/ G4 E9 M4 ]1 y  H! Z7 z        while(1), n6 d* N$ u1 }% K* N2 J, @
        {* G2 r" v) D4 v
                read_MSG_buffer(pshreRAM);
& l- r. H8 |- k2 L( M( l. m& C. a        }                ( Z/ j. K# N+ {0 I: Y: q# K
}, k6 Q) l- V  \
- O. V; I' M) e$ [+ L% G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- m/ `7 s3 V3 P* h{
/ V% a/ U: a; J; l, v        RX_MSG_PROTOCOL buf;# b( v( g$ B% \' ?2 w
        
( |. b9 \7 ?7 \& O* |9 P. ]( q        buf.a = pshreRAM->a;6 }" ~- g! a" [: B7 Q& h. J
        buf.b = pshreRAM->b;" v2 l1 o% f+ j' p( `+ B4 m
        buf.packet_cout = pshreRAM->packet_cout;  v2 i& \  r" ?* J- T$ c1 q
        " G9 v8 @1 _# m( y
        if(buf.packet_cout != count_copy)$ g2 \) N+ O/ ?# Z
        {
! D# a4 d* a/ a  A9 C( v2 m                printf("a is %d\n", buf.a);: |$ D& D. I' H1 V9 }. h. K* L
                printf("b is %d\n", buf.b);/ i8 ]' m9 _* I
                printf("count is %d\n", buf.packet_cout);* {. h* A$ E' O  z# @' n
                count_copy = buf.packet_cout;" n% K7 z8 U6 i9 M% c3 q
        }
2 L2 c9 U" i4 S: q        else- m2 T8 K, p  j0 Z
        {
, k5 x2 g3 n" f# d+ F- i                printf("No effective message!");8 N# N% _) [( T' h. Q3 \
        }
& G% X& E" G8 }5 Y}
& p5 N9 K5 s2 c. t9 h0 C' t' t3 A
8 w: `8 d; X. a2 R# T& r% h: `6 @
' B- H. G6 H$ o( d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- }# L) Z, N! B8 [0 V使用下面代码,对内存使用了mmap函数后:- H9 a/ S4 T; z- G
#include <stdio.h>* ^5 U+ W: c; L7 z
#include <unistd.h>
2 f7 T1 P" q8 I7 V' P3 u#include <sys/mman.h>+ d; q3 M/ |0 k: L& d
#include <sys/types.h>
- s2 f% X3 Z3 _' I0 i; f3 D+ a#include <fcntl.h>
6 w& Q  l2 z7 q
: s/ d7 H# `- p  ]: [5 N" l3 x#define SHAER_RAM_BASE_ADDR    (0x80000000)
* g3 o8 o8 Q$ d  N7 G#define SHAER_RAM_SIZE         (0x20000)   
4 B  Q5 E% a( y: I' @
; x& J( @) D  `' H7 s' utypedef struct! r" X! P+ s' s9 u; z
{3 d! c: I$ H, l7 c3 \% S
        unsigned int a;
. t: m! ^/ S0 _$ K2 G        unsigned int b;
3 R- H$ B4 f3 g$ p" g        unsigned int packet_cout;/ i' y6 ?+ j( F5 ^" w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^( x$ C  j) v6 `! B" i' M6 g  |( B
void read_MSG_buffer(int *baseaddr);- C4 Z$ \8 Z' R3 E$ X7 @
unsigned int count_copy = 0;7 G9 e& g( ^( ^' ?" y- G
# a! p" i# K6 e4 a% C  m
int main()
) U# L2 _; t. U{( S3 H, L( k: O' i" Z- g
        int fd;  t3 N: [9 g2 r
        int *mem = NULL;
8 I' x+ O$ g, d+ h( n
' E" I1 }  N  K, u# N% C4 R# ]5 S3 l% w        if((fd = open("/dev/mem", O_RDWR)) <0)$ q/ e" Y) |- F/ n: ~
        {
) B  D+ P3 l! @# n  z% C                perror("open error");2 Z$ r2 i0 b( L6 B  L5 i" v
                return -1;
, L8 V. |' I( B, V1 n' V        }
; T: W; e1 Z4 v) `        
4 w) L, q2 [+ ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" }: E: n1 l* r( g  L/ b
3 ]( o1 \6 W; ]* L) ^
        while(1). `' h0 p5 D; Z3 s$ o
        {
! s* J. y) R. B7 |) n; b6 F' V                read_MSG_buffer(mem);
/ R$ d- A( }% n8 |! @, |        }               
. A; \  u( O  {}5 H& X$ [7 r- l6 V! o

  e. \) \; v" j+ n" v! D6 V7 f3 X- Z: svoid read_MSG_buffer(int *baseaddr)
! _" `! }4 t* N9 `  d* l4 F5 ]{
% }2 ~' E. z6 s, o2 v        pRX_MSG_PROTOCOL pshreRAM = NULL;. t; r2 W' a: ?& F9 e
: w7 {- Y# R( S( c2 a$ C' B8 x; j/ b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# G. h: h! S: f& r( A" R9 E
0 x% M1 _7 ~0 r" V9 t2 \
        if(pshreRAM->packet_cout != count_copy)
8 H) ?  C1 E6 W. z2 v7 f        {3 b$ E% V& f/ i" t
                printf("a is %d\n", pshreRAM->a);# k$ |+ M1 ~  a3 U) t
                printf("b is %d\n", pshreRAM->b);
* k' p: y5 A! ^; y3 m                printf("count is %d\n", pshreRAM->packet_cout);
4 {2 Q7 n' Q! O  f                count_copy = pshreRAM->packet_cout;
; a. F* f; a, l8 a- l9 K$ ]        }
% K$ r; U: Q4 J        else
8 d( M* Y" p  n$ h        {: r  k( |  z+ o4 o6 y
                printf("No effective message!\n");8 k/ ?+ A8 k& u6 @  ]1 c+ _
        }
3 v* _0 Q8 P0 S5 U- T( W7 J6 U( N}4 g7 I$ m4 O' V1 z

! g- S# M$ n  h( i& P' \; I! W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: g; p% f  V, p+ R; I: t' N

4 i6 r# C' G; X% |$ n) Z; R0 G' r1 U9 P2 g. k

' L9 j2 ?  m: C6 N6 g5 L2 m
$ l3 O' D1 F( z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-10-19 02:54 , Processed in 0.035632 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表