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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) y/ C& b- l) N9 T0 F2 ]

6 b% W  R" j8 k8 u( E- Q0 OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! x9 l1 q8 u" X
#include <unistd.h>
0 {- E1 k. y& u7 K' \; t$ k+ v, i#include <sys/mman.h>7 l/ B( L) k7 R+ Q
#include <sys/types.h>
# |( z9 g4 b2 o! [6 c# E4 m0 q5 X#include <fcntl.h>! k) h+ q6 A: T% M( C
  D- S. @  G# ?. q& L0 k
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 J9 G" Z( Y5 o, I$ r1 I) E

. n* v7 r( M( O0 L: s% u$ G$ V8 ?, i: Ftypedef struct. n! o1 K5 j6 w0 e9 _
{" |: g  ]# C- _5 q6 V- v
        unsigned int a;9 L: ^2 g8 A5 n
        unsigned int b;
: }! A  D. E4 g3 {- t+ }) Q        unsigned int packet_cout;
  `( C3 Q/ _7 B# d6 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  P; a6 `+ e' R, V

7 j) q% j7 d1 u! e9 z; evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% {# E6 P' @5 `: q  _/ X% w# funsigned int count_copy = 0;3 t' v) T0 c4 W: v/ \; v1 d

2 [  _- N6 Z+ A+ P( G/ V. B# V" s; Q! R: m- s2 L/ ^" h) e, ?$ e
int main()2 h+ F8 q: g% C( j1 y; W' X
{
  \4 }. h: q8 s. _        pRX_MSG_PROTOCOL pshreRAM = NULL;# k. A- u+ ~4 p" D) t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( C4 K( F3 [  `1 U7 e2 b
$ d* N5 O( t" P4 b" d; R6 J        while(1). a/ [4 U* }4 q; {  r2 z1 x! L
        {0 {2 s4 s& Q" T! V' x+ s9 F
                read_MSG_buffer(pshreRAM);
2 v! Y4 L9 v7 [* w% @        }                + C" o$ V+ P# x4 |8 I% |
}
% i- \# y: q# [3 ?( V1 e: z3 b+ ]4 ~" p  q6 d9 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  C3 Y& O$ I. D1 ^{- L) Z  g) Z! K. t( q
        RX_MSG_PROTOCOL buf;! ^1 \" B7 E! K  H" \5 m- A) p
        * ?) q1 \( O0 U5 q
        buf.a = pshreRAM->a;/ c+ `! L  C* H/ y. a. U0 {
        buf.b = pshreRAM->b;+ s; `9 @6 h2 E5 v: i  F
        buf.packet_cout = pshreRAM->packet_cout;
  @" t+ o1 F5 h7 h. ?        
) J: k8 T* o8 |8 D+ R1 D: |7 U+ E        if(buf.packet_cout != count_copy). d6 \0 Q* e# ]. ?
        {
4 G2 \' i% ~( R, v                printf("a is %d\n", buf.a);7 g2 n9 V* A( X6 k' D
                printf("b is %d\n", buf.b);
0 T6 _: `1 D0 F2 W9 U9 N' q                printf("count is %d\n", buf.packet_cout);) X9 b  k5 m% C/ f( u
                count_copy = buf.packet_cout;
& o2 r8 A- t3 }+ M        }) U+ Y' p; N6 c0 P$ `
        else
1 ~7 Z' ^- w9 E2 K: v: l/ F' L        {  s& b+ U: Y! y4 A
                printf("No effective message!");
- [: R' p7 ~5 P0 D' s5 b) v  E0 w7 {        }
0 n8 S4 l* s1 f4 ~}
& a) @2 [/ ~& o" Y% R" k
, ?. s! g! A( [8 ~9 T6 Q5 \- s* i( u- v, L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 E: y% P  T( Y; J7 q使用下面代码,对内存使用了mmap函数后:
, r5 `% ^' A/ x# }! w#include <stdio.h>
+ o7 ~4 F/ R1 K  a3 e#include <unistd.h>
2 w" U3 W% F  w5 P& Q- Z#include <sys/mman.h>
$ n1 p$ s& f( m# V* F#include <sys/types.h>
; }0 i! |8 m/ W$ b#include <fcntl.h>
, N; V/ ^. Y* p: I
& x* r8 j( i5 @6 S; r) _#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 t, y6 w* e6 }: _1 H5 u( D#define SHAER_RAM_SIZE         (0x20000)   . i$ ~2 l3 l" T& \8 t( G
: d3 U3 W6 }$ U4 b7 _
typedef struct  F/ G2 _7 z0 k7 u" P: d) v
{+ }  t) ~8 C* r" a
        unsigned int a;) r/ |8 L' V; Q, v
        unsigned int b;( B$ X) W& q' Q8 e+ z3 n
        unsigned int packet_cout;1 ^5 B6 J& h' {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 P0 K# z; L# u" h' ~7 J5 W4 z- S2 {7 k3 l2 U4 d
void read_MSG_buffer(int *baseaddr);  J3 Q% c7 i$ a; s/ b" W
unsigned int count_copy = 0;
$ v; j1 f3 W) ~6 t: u5 G$ N) H# j8 Q5 t  w
int main()+ k5 {8 m0 D3 \- i+ D4 X
{
3 m$ i, r* m0 @; V. K        int fd;
& B2 T. x% S$ G4 G        int *mem = NULL;6 w" S9 l2 e& x; c' W3 R" N" G4 I4 E
0 v8 W  F  Q. f) N! |9 b; L: ~
        if((fd = open("/dev/mem", O_RDWR)) <0)! U  o3 z- \3 Y4 m' S/ z0 Z
        {/ p- n# E+ @+ I9 M6 _( I( P
                perror("open error");, j9 w2 }$ B; x# n) I
                return -1;
% \' }1 L. c, A: T( @        }
& x) H4 I; z& y/ l/ Q8 F' ?        
2 n; w" Q# I7 u  Y3 C        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! r  z+ E2 M/ ~

7 ~2 `5 E0 L/ I% }4 V8 p        while(1)7 n  n  H$ k: L
        {
4 r- I/ m5 s2 x( E; ]# w                read_MSG_buffer(mem);
; g, v/ c8 i( q3 b" Z4 X+ ~        }                  n' J4 u0 ?7 o# R+ r2 c
}
5 K  Q2 s* _$ O) l
/ M2 m* o9 a0 \8 y, rvoid read_MSG_buffer(int *baseaddr)4 p& e* N  Z- G( }: z% U8 f) f
{
' g. y" H3 m% `' v        pRX_MSG_PROTOCOL pshreRAM = NULL;; U0 \2 ^$ ~# ~: g6 X2 E, D
5 i4 F& ]! Z6 \' N# S% J0 m. {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. ]0 m9 I9 b& T/ \8 A

& A2 Q0 W/ l$ J  Y8 {) Y8 P4 |! w- w& j        if(pshreRAM->packet_cout != count_copy)
6 n, C9 {; h/ P& R+ |+ P        {+ i; X4 }, i6 H0 [' X
                printf("a is %d\n", pshreRAM->a);0 c: ~. b/ J! _4 \
                printf("b is %d\n", pshreRAM->b);
& y7 h4 p' e6 I' y! E* n                printf("count is %d\n", pshreRAM->packet_cout);# c# l/ Y: D5 }% u: ]- `* }
                count_copy = pshreRAM->packet_cout;
9 e( V6 x5 e2 V/ S7 z. b! W) ^. j        }+ t1 K7 Q* ~. F4 h7 H, w
        else; \. C( e; w7 e. u  f% L, D8 @
        {
% r8 @" ]- m3 {2 _2 S& q                printf("No effective message!\n");
! O) `) A0 r7 I        }
& ?4 a/ m5 V4 B* E2 A0 g}6 E5 B$ m, V' M( V

2 ]4 \) b7 Y, A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& Y/ [* W% S# ^, [: x9 m. Z- W

! ]- ^" c8 a( O& y" w3 e
6 g- L3 ~$ v* F' M7 I  H' p# \  m, o
3 M- X* ]2 B) R7 b: D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 16:26 , Processed in 0.062093 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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