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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, \  M( G6 O; v5 }7 V0 f( a
4 X9 Z' B$ C+ v' ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- L5 I& l3 c6 |% l& N& v& v#include <unistd.h>
8 @- G3 ~8 i5 g1 }2 `#include <sys/mman.h>
; @$ `2 H) w$ q* _#include <sys/types.h>  n1 b* S* n; G
#include <fcntl.h>
0 n# q. m0 b% _7 Q8 `; n$ _4 c  _2 u# i) m
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . f/ {2 i5 G' X7 f6 p0 ?
/ k! j7 M* N+ D- F3 J
typedef struct2 E7 O6 n# k- W) y0 U
{
1 R/ p0 E% a, R# F! Y        unsigned int a;. x' B6 @8 q; |" [
        unsigned int b;
5 h6 x# K5 g9 v' ?. G4 r7 ?        unsigned int packet_cout;6 ~# g$ w& Y) F3 {, ^* @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. t  i/ m* l* s1 }5 ], ?+ ?3 w; j( o! W8 Q$ a) a. r; `* c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: Q3 _) h, c* F! a! S* Punsigned int count_copy = 0;8 j7 _1 \  E6 H
5 ~/ J$ x: o8 o- w5 b

7 y8 c8 ?7 m* ^int main(): I3 L! q1 K; K/ W
{
$ H, P, n4 v3 C+ i- ^, \" D8 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 r$ Q0 o; J0 Z; n/ l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ M1 q$ O8 G- @
  E4 f! h; x& h7 e2 W
        while(1)
$ {+ D# `) K' H& T  o) C        {
0 n) C3 r. }/ w                read_MSG_buffer(pshreRAM);/ S6 P7 u, i" \* L
        }               
0 M" l& W" h- l/ Z: \  k}- B9 @' r& u$ i5 _

4 _/ d! U5 l% zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 g8 a# E  \' E{
* m: G, e! i/ u0 ]. F. F  f        RX_MSG_PROTOCOL buf;
- Z0 O4 [1 e1 p8 {        0 n+ k! |  x8 i6 l
        buf.a = pshreRAM->a;
# H: H% A7 `2 @        buf.b = pshreRAM->b;6 c- q. J$ w/ |2 M4 @
        buf.packet_cout = pshreRAM->packet_cout;
' g$ k  Z2 N% v& a6 g- d" |        7 T  u4 ^2 L! R% G* O5 {
        if(buf.packet_cout != count_copy)
/ P3 Y8 }0 W( m9 Y$ D1 X( u1 s        {
9 a: B& g- ?' _7 S' ^6 i/ \. \  g; E                printf("a is %d\n", buf.a);' S/ @8 s8 t1 H/ s, {
                printf("b is %d\n", buf.b);
4 j0 c' n6 |& t! h' ]  I                printf("count is %d\n", buf.packet_cout);) m( H2 k8 ]+ D
                count_copy = buf.packet_cout;9 p( O+ j* R; _: Y2 c" K& ~8 Q
        }3 C/ o: ^& a# f" b/ v6 J
        else, h( j& X. L8 b8 |% L! m3 ~
        {
3 g  j2 l/ V& W" B! `* l* Y                printf("No effective message!");; }& h& t+ i! [4 ~  @; C
        }
# L- t# y! ]- F% L}+ S( a( N4 ?, P2 T1 ?% y

0 F6 h- u2 P; u& {( j  N- N' W# m5 Y7 F! F0 f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 @) y" \4 L9 G0 H/ t2 A
使用下面代码,对内存使用了mmap函数后:
2 F! F9 W0 v3 I  \) U#include <stdio.h>7 m) ^/ E+ h/ i7 q" e3 J: N
#include <unistd.h>
- f* C" ]8 l* B1 u#include <sys/mman.h>7 \" l( J0 q/ S! n, r; c8 P* t
#include <sys/types.h>
6 q% ^+ k# w/ u* ?8 ?8 L#include <fcntl.h>
! ^: p* ~: w/ O3 k# i! t* \" |. ?) V+ T, ]% [2 G& C4 w6 E* b
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) Z* }( a5 B  b8 Y: G#define SHAER_RAM_SIZE         (0x20000)   $ D' x5 I+ H! ^5 ~* _7 w8 b1 w4 ?

6 u' M9 q- c* W7 [, W! z% ?typedef struct
9 x3 ?: Y: r3 K. Y0 K{; G8 b0 @9 f+ J5 M& h
        unsigned int a;
. l, j" h& e5 |. d$ |% k7 U( @        unsigned int b;
1 O$ u" k! r3 ]7 q) s* I, S$ n' R        unsigned int packet_cout;9 I% d( Z( \7 i* [& \. n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& r, x( J- O$ @. Y% W8 ?

: Y* S" m) O4 d5 y. }% ?( g* Avoid read_MSG_buffer(int *baseaddr);
. x' d, K+ j8 P- munsigned int count_copy = 0;
4 E' q' n( ~% J0 T) L8 e# ]( \% T# ?1 F, v- C
int main()$ ~- t7 ~' D% r- r1 h8 b
{
- C; g  Y3 ~9 n% O        int fd;
1 k, L( g# {( U        int *mem = NULL;
' Q5 ]8 A( D/ h1 ]8 w
$ R, j, i: D6 M" C/ ?) t7 S' D        if((fd = open("/dev/mem", O_RDWR)) <0)
7 c1 W0 G) b* ]/ e; A" y. h        {' @4 A+ d/ o0 F' p5 L
                perror("open error");( j- i* Y+ Q. W6 X
                return -1;  R6 D6 q6 Q0 h) a8 e
        }
. f: [- I  T& B' R          ?' c( |( N: d0 z1 {; G* D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 a% Y* ?' w) x. }& r+ w1 g
9 p, _  \* k6 P( B        while(1)3 d" ^8 ~8 f: v# K  d$ D3 h
        {$ v8 d% z2 O* W$ H
                read_MSG_buffer(mem);9 k4 O! l" }( n2 j0 k
        }                ) _4 d7 |" F: l7 V4 F; y4 k& |
}  t. M" z8 E. F( F1 k

* s6 h5 i1 \5 Q* {; mvoid read_MSG_buffer(int *baseaddr); t# b/ X) x' K' f/ R4 e/ o
{  L  Q- b7 a0 b: q
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ x+ r; H: m3 P

- v7 v* ?( }3 G$ D- r; w( E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% j9 ~" E4 I) X) C3 T+ A

7 o: C; W% n7 Q/ [0 C0 G        if(pshreRAM->packet_cout != count_copy)9 S# w/ I. F. V& O/ C7 j+ q2 @7 u
        {% V: l5 q8 i' b' ]+ h, @
                printf("a is %d\n", pshreRAM->a);
# p! E' v) F. }% S5 q                printf("b is %d\n", pshreRAM->b);  }- Q: F  }6 F9 [- r/ a1 w! B
                printf("count is %d\n", pshreRAM->packet_cout);
9 F3 m: v  @" a0 U                count_copy = pshreRAM->packet_cout;
& b/ F: m- P5 ^6 [        }& p5 _9 L; y, ^3 H8 P% ~0 w9 P
        else4 O1 x5 M2 k1 |. M4 t- U7 d8 S
        {
5 C7 l  ]" ?; ?/ y7 x# b; r                printf("No effective message!\n");8 Y( I; J# H- b  G
        }
. C- \8 }" |5 W5 v! a( u' D}, q. W$ e3 r) g6 J
! P. Z& `+ I, ]1 V; G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ x* {' b! o8 I. C& v% p, d6 Q/ b& d! y

" N0 b5 W& [2 F: R  y6 V7 Z! h- j

* r" f$ j/ c  W! S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 15:29 , Processed in 0.037907 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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