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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * d+ N* Q2 ]' x2 q
/ t# ?: z4 w3 [0 i* R( H: ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( R+ C$ d  F* Y5 j
#include <unistd.h>2 ~! a1 n- M6 x; k2 i. E( E2 u
#include <sys/mman.h>
" h9 t7 T/ C* N) X2 c6 r#include <sys/types.h>6 O  R! C0 d( N: t# V* C/ X
#include <fcntl.h>2 v: s1 ?% c" u% V! D2 q' P
! T: w! i9 `- P2 c* p# |  j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ g! \  J# F$ ~7 f, ^2 j5 e
9 W5 n  M; J+ Q- F0 P, \0 ]typedef struct
  S$ e3 h3 |2 M% A9 D$ ^/ R{- Y- t7 w- u+ E+ X
        unsigned int a;
) g1 M2 n5 l  ?: J& C        unsigned int b;
$ [+ V# J' ]5 H; g( ]        unsigned int packet_cout;" Z+ ~# N/ Y4 a+ Y, ^8 c( p- l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! F; |+ h! D& F
" m* Y( }" F# @+ y7 j* H) X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! c2 z; N- N& ]2 t# punsigned int count_copy = 0;  S6 ^8 p1 l6 g# t8 f' |

* d2 t3 s2 @3 V1 \& [0 n
% R2 I4 R" K: Cint main()' X; W% |. t2 s: m) s% m' E9 l
{
# ^5 M; j' E1 _9 N: o        pRX_MSG_PROTOCOL pshreRAM = NULL;% {* O7 b& A( K. V$ ]4 `- o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 d4 J" ], @1 [; f- D; `, U8 e

1 Z, [4 `+ G4 [! n        while(1); m9 G  E0 m3 V5 Z6 T
        {
) P0 F7 P, m" z; F- X! [/ O                read_MSG_buffer(pshreRAM);% _+ f/ {0 U' f# @
        }               
, {1 B& I' \8 T% ?# `}
$ w* L; x# m; n6 P7 G3 w
5 B( K* w  [5 L9 W7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 v, \# H# e7 e5 O' v
{. E) I7 H( d  k. M: \
        RX_MSG_PROTOCOL buf;5 B' ^& {7 a8 A" N, ^! {" w! [
        & T( G  C% g. l
        buf.a = pshreRAM->a;4 @- ~9 L6 a4 I2 S, h9 b) |
        buf.b = pshreRAM->b;
# Y# s0 m, l6 b; a+ Y. n# T        buf.packet_cout = pshreRAM->packet_cout;
1 ^5 F( C6 H4 L9 Z        ' R! a" `+ F, V4 A/ L  }! z
        if(buf.packet_cout != count_copy)
' w" O+ U" V5 N- U& Z" K* [" }. U- m        {
: o9 g8 h; w) x$ _8 x( Y/ d                printf("a is %d\n", buf.a);2 ^% F' {6 x; [: S  Z
                printf("b is %d\n", buf.b);
  z  N; B" p# }  @6 p( f6 E2 X                printf("count is %d\n", buf.packet_cout);
5 _- v0 S" P& r                count_copy = buf.packet_cout;
$ U  S) A! ~6 P4 m# _2 V        }7 _# F: _* C# U; d2 g& Z
        else; j: |( b( g9 L9 [1 x
        {6 W: k$ Z& `' G! @
                printf("No effective message!");4 ]2 E, Y, B+ G& M/ [+ W' k# L; Z& M
        }
: A9 j: a2 I7 c( R  |/ r}. D6 ~: t' I- i  `- `) [. x6 O
- Q4 W+ Z0 x3 O$ m: q" K4 Q( a
( p$ P% I* c( T0 t# r  N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 W; c' H/ ], k使用下面代码,对内存使用了mmap函数后:0 Y7 i0 i, Z; g/ j
#include <stdio.h>" f  Z$ F, v) \8 Y2 G# x4 a1 S" l
#include <unistd.h>
* Q" E, Y; J3 G- n; C#include <sys/mman.h>
; Z& t8 M( ^; s: U6 k) p#include <sys/types.h>; ?6 T$ `. Z8 B. r& K5 z- q, C
#include <fcntl.h># c, c" f5 m, I7 F, b

9 D  g" ]5 O; v% V0 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 J8 H0 d0 W, S0 M; V#define SHAER_RAM_SIZE         (0x20000)   & }+ P3 z" t0 q  o
$ t: A" C8 N$ L" h8 i, k) q
typedef struct, n3 A: k7 y3 f* g
{: T, P: o% K' v
        unsigned int a;2 z& a5 Y4 y- s, R9 D5 F+ K7 z
        unsigned int b;
9 z! y% \. w0 F. N" B! T0 J8 w        unsigned int packet_cout;
) E( S, A6 {! M6 y! T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ^/ E7 N$ H+ R2 V2 z" T6 R( U3 R' y- @+ |0 {$ r  H0 Q! k+ g
void read_MSG_buffer(int *baseaddr);: ^( v7 ]3 c- \1 p$ _
unsigned int count_copy = 0;9 Z( T! q' j! h: M; |
4 `8 j& Q: e* W3 u' `& s; ?' N
int main()
; V5 T8 z& _! C( H{0 ~0 h+ Y$ H+ @' Y
        int fd;; Y! w* c: A) c/ j( e
        int *mem = NULL;$ m# Y% D; O! }5 o9 V0 Z& q0 f" s; |
6 k, h: J$ |: E6 ~# ?8 ]
        if((fd = open("/dev/mem", O_RDWR)) <0)* O; S; O. J+ z7 b
        {
: _1 O  H' `9 @                perror("open error");
0 y* V5 a  F: {                return -1;/ r3 A# ]; e" N0 E) j
        }
1 `: |7 k+ T: p, T$ F        + ?7 S5 v0 p- f9 x: d
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( X$ I; w# o  G' M2 Z$ @
* j: I4 z) X0 K5 V( u0 D
        while(1)
& ]4 m: q  I8 R' m        {8 A: X, Q) O5 w1 Y) K9 E
                read_MSG_buffer(mem);
  t! P2 J  X& k3 ]: o        }               
' ^2 ]8 h8 c8 f. W; W) g$ K}
' W: R3 L2 w2 T4 y6 h& _" k' i$ m8 a: J7 A! d/ C
void read_MSG_buffer(int *baseaddr)
6 M9 b7 r. ^9 k' \# T* o{  N) c8 \; ]) ]0 F  c; G
        pRX_MSG_PROTOCOL pshreRAM = NULL;) m& L% W# \! U# u

6 _6 X' {* ^" m+ D# a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 ^9 @9 T, K5 t8 n$ L+ r( L' f( u/ a7 ?( S6 I
        if(pshreRAM->packet_cout != count_copy)7 @/ w; D# `& H" H+ t
        {
  k8 Z! s+ C( k# ]! m, O/ m                printf("a is %d\n", pshreRAM->a);
. R. z+ t  V# j) A                printf("b is %d\n", pshreRAM->b);
" ]) T7 L  `: C9 P; p                printf("count is %d\n", pshreRAM->packet_cout);/ b. w# e% p+ w! U: o2 r$ W) M
                count_copy = pshreRAM->packet_cout;
4 @7 D3 D4 M# V0 B: X: E- _3 g3 C- C        }
6 h4 ]" b- X* X. t* b& e        else  |9 \! {- r- l* m
        {* n0 n/ O: J4 b- b
                printf("No effective message!\n");
0 j5 ^. N2 p9 m3 e        }
) r  @; M; X$ t- |2 b}
7 E- y% ?; _9 M0 W& E7 i& |) ]' \3 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ F+ U8 s  W: W4 e" h. t3 h1 n+ y; G3 ?: c/ f' i

! }) p5 v: x0 s/ q; }# F6 b4 W& M. @% f) k4 V  g. h! r  Q7 W

& G# s; E$ F6 k" Z2 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-25 03:57 , Processed in 0.042097 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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