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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 f/ F- F8 B  V( s9 t
! [1 u' y8 l+ L3 ]7 Z6 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 ?( J: i" K- Z* M0 Z#include <unistd.h>
. z) Q% G; h$ d/ w! t! n+ |#include <sys/mman.h>; w2 i8 G/ {2 t7 h( m8 X  i) o' Z
#include <sys/types.h>
; l0 u1 c( _; G  M/ w#include <fcntl.h>
+ A  @# Q1 N" M/ _
! T7 [& Y! L8 r#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) f$ e$ v2 f, [0 e- X  k! j1 q6 K
7 \5 J+ j- {3 s0 A% o$ a
typedef struct5 j7 Q: a* c( s, _
{9 n5 @' q& @' z! _+ N; i
        unsigned int a;/ }3 f, T. t/ ]
        unsigned int b;
1 [+ ^8 f0 G/ X( d3 i% r$ W$ X        unsigned int packet_cout;- \5 ?6 a& i. m" V# L& }, b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 _- v6 f* L- ]/ U

  P+ N6 n6 {" K  t# Y; V# Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, A' B8 e, c4 P; F: X) f  o5 |7 p9 Q- kunsigned int count_copy = 0;& E, x$ S. D8 c

5 C7 d* r! u; J& ^- ^/ z' e% }( t4 F8 I4 D
int main()5 N3 R/ T. \% ?) s0 B. |: g+ ^' @
{
$ e) z3 n5 T: H        pRX_MSG_PROTOCOL pshreRAM = NULL;
% b9 M3 ]! Y* O# O# T; Z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( c0 K7 e$ T- p0 O5 U

( k3 ^: j5 F+ U+ i0 t. B4 E0 _& ?        while(1)
1 |7 X0 a) _8 |1 b0 W        {+ `5 Y; L+ ~) s2 \
                read_MSG_buffer(pshreRAM);
7 ~/ n2 ^8 j7 Y* _% u( t7 x        }               
! |" R" n$ [' @2 p# X& V9 L. h1 j}
/ S4 z& N. P( r% p' i# T  J1 J# `3 A6 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- x9 M) j* o5 m# N{
% M: I; }' X" [( z+ s: z! ]" |/ B        RX_MSG_PROTOCOL buf;/ j9 b" S1 H/ B) x7 I- E- _0 Y
        ( C5 F8 S. j! {
        buf.a = pshreRAM->a;4 l1 B' K( c  s, H" O
        buf.b = pshreRAM->b;# C3 T, m& p, U
        buf.packet_cout = pshreRAM->packet_cout;
8 s0 w! K+ t8 c! T" x5 T0 S        % P! I5 Y" i6 g; |0 v% u
        if(buf.packet_cout != count_copy)7 q; i7 y2 T  ~0 }( i
        {% Q/ A1 R6 C5 M  a- m9 J2 g
                printf("a is %d\n", buf.a);
/ p1 F( Y0 n* `6 @7 s1 L2 u0 \                printf("b is %d\n", buf.b);: {* n1 {. e1 o+ L6 s
                printf("count is %d\n", buf.packet_cout);0 `6 c7 b; u, |1 o: I. U
                count_copy = buf.packet_cout;
9 r/ e* _! \7 f. ?1 K        }
  W( ]7 s0 V  c; H4 D        else
* H6 v$ v- \% @- S. v        {+ _% W6 [# |5 R7 w; C6 @% \. J
                printf("No effective message!");
$ l% Y5 C, Z6 S8 Z: J0 g! B- Q4 p* i        }
: \7 Z: n5 _/ L5 n! G}
) K3 a+ j( `8 A; e; a+ J0 M
; F7 |' f: R  @& m$ F/ B' p" N2 W# h+ F: l& e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, T$ ?# L8 B9 m6 @- O$ l使用下面代码,对内存使用了mmap函数后:/ E! N) s$ m- _* P) y
#include <stdio.h>6 ]; a" m# F8 m& I. R/ }, K9 P- A
#include <unistd.h>
/ e9 w9 H3 T' D! ~$ s; a& b#include <sys/mman.h>, K* d, b' v9 I! C6 u, `9 y9 `) R
#include <sys/types.h>4 t: A' @" ^# l) T4 ~" C  Z
#include <fcntl.h>, v2 p- [( R: y: @

4 `/ X8 Z  Z# r. U#define SHAER_RAM_BASE_ADDR    (0x80000000)7 M, i5 q/ [! E& g
#define SHAER_RAM_SIZE         (0x20000)   ( `/ g. y* Q5 x% |4 \* n

2 B6 l- x- [3 O* M- B# m' p- Jtypedef struct# \4 r5 K- m9 _: Z4 @  D
{$ y3 h3 X3 ]! U& u! w( s
        unsigned int a;0 C  T* P% m" _* f, o
        unsigned int b;7 r" S/ |5 p% b% x! B/ @" D
        unsigned int packet_cout;$ }* Z9 v8 w: M8 W  C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* A# M* d6 }; [+ o6 G: R9 N  l; Q6 z
$ o: K9 _- s7 k! _; l. U8 fvoid read_MSG_buffer(int *baseaddr);
  Z4 b! z( ]6 b& n# Z4 iunsigned int count_copy = 0;
/ R3 w- n/ Y- B; u6 [: V
* v6 r$ J/ Q; l$ R  y# Iint main()
6 i$ }/ T$ W$ ?{; j$ F. M$ A- A
        int fd;6 z' E' H% s3 G, v
        int *mem = NULL;
* Z) g$ k* V* v) _6 [
% p/ B& ]" v* i6 X: y' a        if((fd = open("/dev/mem", O_RDWR)) <0)
) l: j1 U& V+ n  `% A        {
) e' U: }  K- w1 {, \                perror("open error");
; c5 y2 J! p5 n+ R                return -1;) t! I2 }9 I0 g- E
        }' }& f' }0 U5 N( P  ^
        
* N. O4 m/ M1 G/ b( B        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" @8 I, O! G& F3 o4 |( B* b9 P6 _  y4 N2 r6 E- j3 f
        while(1); A+ U$ `5 S. l/ n
        {, z2 m& N6 [% K& S9 M
                read_MSG_buffer(mem);% x) K  i, z/ G3 x
        }               
* t0 V: H; N. f# I% |4 s3 V! N}
* s& [" }1 k  g3 j! W( v( n0 ?8 {- ^/ q) Z( Y3 S
void read_MSG_buffer(int *baseaddr)
% Y: i/ p, @9 Z3 r8 R- `{
2 i) T0 w$ P  {" `! H9 U        pRX_MSG_PROTOCOL pshreRAM = NULL;3 Z0 C/ L) l4 k/ W" j: _/ Q

8 c4 O& Q0 T4 y% n4 s6 |$ O7 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ Z( D; p( e* d  D# h' H
# N7 ?* O. d4 K3 r) Q; j
        if(pshreRAM->packet_cout != count_copy)
; x. {3 Y" u' M* s) Y2 b/ a0 Z5 K- `        {( {& L  a9 L7 _  p' n
                printf("a is %d\n", pshreRAM->a);5 r/ K$ R5 p- N( z( L" B
                printf("b is %d\n", pshreRAM->b);
+ ~' Z( e0 ?8 H! W" w# M7 T                printf("count is %d\n", pshreRAM->packet_cout);
7 R6 Y/ j4 [. d. O4 Y/ m7 T                count_copy = pshreRAM->packet_cout;" q' a/ Z+ A8 S
        }
6 @, n! E' ?  \  Q" {        else
& R. e0 l! ?, ?; W: Q        {
( ^8 u) z. W/ J7 ]0 u                printf("No effective message!\n");
) @9 ?; ~2 r5 f! ~8 O. {% M        }( a& b; z, n% \/ S. K
}
& W1 ~6 A4 S. \& Z- [. N" b: g3 f* x; ^. U: T; j9 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 a: z( G* c4 l! ~8 v
. L7 }7 }; J: ]1 u7 P& j0 H
$ `$ a: ^: S* P( @

/ v" J4 L+ I5 p7 d# D+ I, K
! w! }; R1 Q0 {! Q, b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 21:06 , Processed in 0.038817 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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