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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 M. Z: A0 D6 W# ^! U
" m4 h0 ?2 F: |* J( POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- Z  E8 T2 K+ ]4 k
#include <unistd.h>9 a) I& X$ T# A9 f' K/ I0 [
#include <sys/mman.h>8 e! M4 D, f+ I; a
#include <sys/types.h>
  c) L' W2 d1 X( N#include <fcntl.h>; A- O  k. _! m2 w. I

5 K( F) C8 t1 w1 A; o$ V#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) d# [# n. c, p4 G

: w5 p: |) q9 U! t, Xtypedef struct
7 e4 F- J- A# ]+ l7 O7 D8 h{+ U5 n/ W; L; `
        unsigned int a;: [1 `* V/ M# C+ }
        unsigned int b;6 b- D  I  k3 @
        unsigned int packet_cout;7 Y8 `1 p6 S1 \8 _! p0 m0 O8 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ]& N) o$ d' l; d( X( ]
, Z# o' n, t' F; Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; X% _( o; M  B9 B0 O1 O1 V) Q
unsigned int count_copy = 0;, m8 Y, y4 Q3 y8 E4 W0 L% ?

3 X1 s* L$ m$ G+ @5 @
5 m: P9 \( x* [+ ~6 [, e! Q) h6 Xint main()
1 y) M0 k9 Y) _# _, T1 u: J{
6 E' t1 X  Q/ v! z1 j  s! W        pRX_MSG_PROTOCOL pshreRAM = NULL;" o: A5 |$ \' H0 _* R. B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# p, J; o1 [5 A4 {) U6 ^, f/ y0 G: E, J8 t9 q
        while(1)9 s. s& F: J" M5 _: L; c+ D+ E
        {% [3 q7 ^1 ~# T0 a7 x$ K
                read_MSG_buffer(pshreRAM);
7 k3 W  q/ ?2 D" w) G        }                : A  q7 T# m! D% p" L* o
}
' c3 O% A; @' T  y7 O: w3 g% q8 ]6 e! J+ k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' ]/ @) G+ D* R{+ K/ K6 f: R9 z; Q3 c$ f7 r
        RX_MSG_PROTOCOL buf;
" x; g2 j+ w" w/ V: o& t        , q' Y0 R' x$ Z- Q. ]8 \9 C  z9 Q& T/ F
        buf.a = pshreRAM->a;' w: o! Z7 V+ b8 D0 Y0 G9 `7 T! _
        buf.b = pshreRAM->b;
# y" M+ }4 c6 a6 y3 z5 G( S% ^        buf.packet_cout = pshreRAM->packet_cout;6 E/ [0 e3 O$ l# O/ W
        # G' \8 R3 u5 {
        if(buf.packet_cout != count_copy)
) W' J7 t1 W# M; Q% D8 S1 M        {( X- G/ [; H0 {9 ]) x
                printf("a is %d\n", buf.a);1 L5 A+ M: W3 Q0 x; D
                printf("b is %d\n", buf.b);
  Q$ {  U- J  t  C) V* N                printf("count is %d\n", buf.packet_cout);0 t2 V9 n( R3 a2 I( I
                count_copy = buf.packet_cout;3 v( h4 c  E! {! R# T9 T1 F$ M
        }) X0 O7 `( {5 |- T$ Y/ g* _/ k9 a
        else' E" m/ A4 B: d
        {
" d$ W5 N4 W! \3 v                printf("No effective message!");
  e5 U7 J5 A5 \5 x& K) o        }/ u; [& {/ L/ @( m
}2 p4 u( W8 ?' q+ G$ l

1 x8 G, {+ x) t6 M" M9 a! V" v7 I' \' r" o/ U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" H: ]$ K0 V' _9 `使用下面代码,对内存使用了mmap函数后:1 |- [' z" h! `
#include <stdio.h>* w/ ?7 L: K9 d- Q% t
#include <unistd.h>& R$ O# i0 W3 o" t3 G
#include <sys/mman.h>. X2 O# n+ D! _! m% V
#include <sys/types.h>& J( a" y6 a) h
#include <fcntl.h>4 ?7 j* F" J/ f
3 O5 o* q4 U, m$ Z5 J. P
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 r2 K3 |1 h/ W#define SHAER_RAM_SIZE         (0x20000)   
- r1 o- p. g7 v7 {4 P7 \6 X- J% X/ o9 s
typedef struct7 U: v1 m" J7 O" W) l) f
{7 U4 @/ x& Q0 s4 t
        unsigned int a;- b8 \& ~; ?  m0 d+ z7 ~
        unsigned int b;  L' v7 O& N( x, u1 k5 |
        unsigned int packet_cout;
5 Z/ \$ j: o" Q4 Z' s) `2 K; x% A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ q/ j1 Q7 x# \  \9 u

2 v, q9 C( b6 D0 T9 gvoid read_MSG_buffer(int *baseaddr);/ D! g  y$ s5 ~4 ]  x+ }
unsigned int count_copy = 0;( {6 L4 f" y8 Z9 d" }! P6 r

, T# q% B7 n2 x2 J, o+ Mint main()
4 m( H, H' E/ V& z0 G  a{
! @% x+ H/ ^  l# d        int fd;& I5 e4 r$ V+ ~7 u$ W
        int *mem = NULL;
3 I( u+ t9 x0 m+ [. Y! m9 j4 C% D  D7 t" T
        if((fd = open("/dev/mem", O_RDWR)) <0)! z! r  Y% @7 s1 s$ B3 c
        {2 ~+ H& @( n' f, E
                perror("open error");
- `. y- t& j* X5 e                return -1;
, v7 h# |' f9 W; A  V& R        }
: W0 r5 X0 N0 u$ n' G( }1 v2 r3 L" R        
2 I" }! v* o- j: X2 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 d6 @& w' W: A# e8 y% ~! s

$ G" A/ g& X$ S- J) V% H        while(1): K' e2 x# S( D  A5 B5 l0 s
        {6 f' d$ C/ }2 i, {
                read_MSG_buffer(mem);! Q9 U  [) @& \1 {6 A
        }               
4 o  r+ S, w7 o- D/ Y; e. u}
' K& h) v6 {/ @/ q
* Y- T( B4 d/ L, T) N2 p% U6 Uvoid read_MSG_buffer(int *baseaddr)
, d, U) k3 m) H3 W& u{
8 H8 F: Y' e" B! ~7 }- N& ]& H        pRX_MSG_PROTOCOL pshreRAM = NULL;$ @2 m8 _0 M+ s3 X$ j" G* x

0 a3 `/ |7 a4 T$ }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  e6 I  g& V7 c- s/ w7 w: l" R2 J7 I/ @; c! `+ ~4 G. V8 \6 v
        if(pshreRAM->packet_cout != count_copy)
! n+ E/ t* S/ j/ _        {
. d3 Q3 c7 Y8 _. f+ k9 y                printf("a is %d\n", pshreRAM->a);% t4 H+ }0 a0 U5 m( ?
                printf("b is %d\n", pshreRAM->b);
- k$ C# \3 D/ q, T! }/ K                printf("count is %d\n", pshreRAM->packet_cout);
+ o2 C+ @" O" h                count_copy = pshreRAM->packet_cout;6 k/ s+ K& l2 O+ @
        }
/ `' P! x! J) R7 |5 l        else
# e# f5 C% ]! Y: ^        {
+ I5 v% q; i/ ^% ]% e                printf("No effective message!\n");( _" F% X( U, \, [
        }
4 f+ B9 T! `. R6 x}
1 X3 h. P$ i: |' n
( R' T: j- M  c% I, e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 w$ Q" H3 S) t8 N( [* V# C+ ]
! d$ G8 A! [" q- \5 s# ^
9 u8 _* m0 L; b3 N

2 q" J: a& Z  k' `3 p. v8 A* ^' q( P" e5 X4 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 09:11 , Processed in 0.039538 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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