OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 E% P& e" N& G$ C" n* b' z. N$ B

: s- k5 q+ M) u6 r3 |8 JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& k+ Q0 s! N5 v0 R* e! I#include <unistd.h>
( s. U9 w; o( G: U% a) Q4 w; `$ _#include <sys/mman.h>$ H6 H2 A( g( D( E) M
#include <sys/types.h>
7 F+ N$ s3 I  Y! O& t% w2 `) ?#include <fcntl.h>0 y  L% H* i7 [' C

9 \$ I1 H2 j  t4 b#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 Y: i" d' q6 b- V$ R9 K! z3 p

  k9 U) Q+ e2 D% gtypedef struct
# C6 {- I& ?& ]( I7 G0 u. K) h{
4 w# t0 x$ g& x/ @) q9 d        unsigned int a;4 G( K0 W2 ^# l2 @0 }
        unsigned int b;" T% ~2 O  U  L# |, N
        unsigned int packet_cout;
, y% p% ^3 p- L9 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: c1 |  x+ x8 _- A" y

% |# i* y9 H8 A$ k# mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 q' S: A3 N  r$ Uunsigned int count_copy = 0;. d. I8 A- P& D; s0 ?  I, m
4 ~0 F9 d5 G8 q. S- j

, O5 R0 {# [& V0 \5 Qint main()$ N9 t1 t" d( Q$ \
{1 D1 l' p6 G5 n" q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: t* B, P5 G- C2 M( }. h' Y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 V; ]5 _- t& h3 t; o* k0 R+ F2 @
# w! ~: ?# ?& y" G# U  X: ^7 H6 F        while(1)5 j3 v" C( b2 O7 H2 [* }
        {
0 X- Z+ |$ [, d7 f: \                read_MSG_buffer(pshreRAM);2 A3 |( {  o" d9 Y) ^$ x
        }                4 h8 j& |0 [* Z
}+ k9 s. L* u9 e9 t
& b9 ~- X6 F+ L: V; r# p9 K5 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  o; c2 p0 Y. P) o{& j) X5 ^$ C$ u6 G& {
        RX_MSG_PROTOCOL buf;) ?: s# h2 `+ [0 P; y4 i
        # ?! S& O) p. N$ E3 Z1 W6 e
        buf.a = pshreRAM->a;
+ u( b! X1 Q! f  j; K+ W        buf.b = pshreRAM->b;
- i: k  L  o1 C. g. a        buf.packet_cout = pshreRAM->packet_cout;* _/ S% r( G; w
        1 x& n4 |3 C2 G. G- W
        if(buf.packet_cout != count_copy)! Z( b) ?# h4 v% _
        {
, E) x( _* P! k$ c( @/ m                printf("a is %d\n", buf.a);; p% j3 h& P/ r4 e
                printf("b is %d\n", buf.b);% N( f* ^+ h0 X/ r7 }3 Y
                printf("count is %d\n", buf.packet_cout);8 Q: S7 I7 ?5 U2 [4 C' v0 k
                count_copy = buf.packet_cout;$ }% r8 D" t$ y; }) I* R
        }
& x/ G; g) v& ?        else
, u: B1 R7 b$ k. W- o5 f( ?        {1 i, W( x4 L" d( R1 h+ @- O
                printf("No effective message!");
- \# j# E" A& w$ D5 {        }
/ x" `" v# I! P; y6 M}* N+ w% ~2 |" C% j* \
2 J1 I9 v+ a/ g' I( F# V1 h

5 K: {4 d4 [, a. ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* B6 u+ s( a5 R& p( N" |8 \# ?' Z使用下面代码,对内存使用了mmap函数后:
5 p5 [# J& Z* F+ f" s/ Y8 H1 A4 r$ i" @- H#include <stdio.h>0 m8 J2 M" v8 \& |2 O- e9 k
#include <unistd.h>2 A4 H1 U0 M4 ^5 ]+ G
#include <sys/mman.h>
: Z6 p1 E% [0 Y- z1 S, U4 r#include <sys/types.h>$ K1 A6 r) H3 G- d: W. K) B; U
#include <fcntl.h>
" G, \7 m+ v  B6 M" u# ]
" r$ K+ ~* W+ |) `: |: s#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ W7 _( P; ~' h9 c, }2 W3 ~0 w( i#define SHAER_RAM_SIZE         (0x20000)   4 o' Y4 a% L- t
, z5 f7 y8 ?3 P7 ^+ ~; \1 E
typedef struct6 z  r5 C" l! `; }# u
{
# r1 [3 M0 e, m) u4 D# p: D  ]4 E        unsigned int a;7 \  [% u$ N) N3 X! g1 `* [
        unsigned int b;9 A; K% u$ u# h. y) K
        unsigned int packet_cout;
1 ^5 K5 t9 y6 [0 W; s2 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 G: K8 K9 s- h2 `" c
: a' H9 u+ W, J! ]void read_MSG_buffer(int *baseaddr);6 ^) }; m4 u/ f7 `
unsigned int count_copy = 0;/ I- z( q; ^8 y7 d6 O( x5 p* w

8 e7 s. T8 p# Z3 ^/ Sint main()1 z1 [3 _% B7 h4 ~0 ]
{
0 t& i. f# b: d4 Q        int fd;1 K5 A; F" w2 Q& Q
        int *mem = NULL;
" d5 a' \+ d, ~0 q# f6 \  }2 f
- d6 P1 @$ q" Z8 i6 h/ l2 U        if((fd = open("/dev/mem", O_RDWR)) <0)" m1 K0 ^, |! T1 Q3 A
        {
1 j9 |( K4 ?' X3 D* o                perror("open error");0 ]" f0 ]; m% h' J0 Z0 z& U
                return -1;1 q; I0 [" g. C0 r8 D
        }
' u% a, \3 D! o6 H2 i4 B" \        $ @2 d6 Z/ h- J2 ]- C
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, S8 V; _3 H0 ^4 p, T
8 t. A1 T+ `6 b
        while(1)
1 V* a1 L' q$ [9 N* i% U        {) C# p- Y) q7 h. R6 G0 r; A( P
                read_MSG_buffer(mem);
4 Q9 Z. r  \/ h) ]        }               
( P% p' X5 Q9 ]! a( Q& c  ?/ g% o}
- S0 J  `/ j) g  p% u
. p+ }# U1 `9 Xvoid read_MSG_buffer(int *baseaddr)
9 y3 \% ]$ d% ~{( n+ l2 j7 u1 v4 y# T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' r% @0 P6 k3 T
3 X4 z0 k' f# W3 w2 d+ `# ^$ }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) E1 y2 l4 K# P5 b& b% b
( X) ?5 p3 `5 x; \  M$ J
        if(pshreRAM->packet_cout != count_copy)
! h+ }4 U- c3 m7 {" e        {
! f( B+ |/ P" E% P2 }9 {                printf("a is %d\n", pshreRAM->a);3 @* i0 X. B5 ?- ~9 M$ c5 W
                printf("b is %d\n", pshreRAM->b);
  R. J5 |, f0 Y. R+ ^. B# }/ L                printf("count is %d\n", pshreRAM->packet_cout);
6 C7 c- z2 M. e: u                count_copy = pshreRAM->packet_cout;( v6 q) y& Q! O/ ?5 ]( ]
        }
7 U2 H2 n4 Z# L  I9 z0 @        else# n8 C8 ?  f& s8 o! |" S( a0 m. V) w: K+ t
        {
$ x3 `2 E& D4 W6 y: u4 E                printf("No effective message!\n");7 B4 u  D  Y/ d5 }* K
        }
6 A( B! w& [8 E6 z" \9 o}
6 E9 p7 P& @# f& Q4 b0 S. D  R
# x# }/ s* i7 h8 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* G. T/ U4 M2 b7 e, V* Y6 ~/ l7 M/ I5 m- z( |; I8 F  F
" s2 S! i! d/ c" ]' f
7 J! p+ g! E) l! U: [" I1 ^: q7 f
# C3 u! ]0 G( U- G. b  C: t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-4-9 01:31 , Processed in 0.040510 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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