RTEMS 4.11 的 MINI2440 QEMU BSP 移植小记

缘由

支持MINI2440在QEMU上仿真的RTEMS BSP,最初实在RTEMS 4.9.5上开始的。

之前版本的一些移植问题和很多朋友讨论过,这里简单的讲一下我移植之前的工作到4.11遇到的一些问题。

最近在公司做的一些工作采用的cortexm3的硬件平台,在应用eCos的同事,我当然会想到RTEMS这样优秀的操作系统为什么没有做CortexM3的移植。

于是乎在网络搜索了很久得出一些结论。

大体介绍

之前RTMES的编译工具就是arm-rtems4.XX-gcc这样的工具链都是基于arm-elf的,所以不会支持像cortexm3这样的thumb2指令集。

网上也看到很多老外发布的一些工具链补丁,但是看上去比较晕而且没有看到成功案例。

好在rtems在4.11的版本(svn最新版)中宣称已经支持了eabi的工具链,所以也就会支持thumb2。

当然,我立刻下载了最新的4.11的代码,而且惊喜的看到上面已经有TI CortexM3的一个测试性的BSP了。

在我进行新的STM32移植之前,我想把我们之前在4.95上的移植放到4.11上来,除了一些makefile,代码风格和RTEMS移植接口的不同外也遇到一些比较棘手的问题。

后面陆续拿出来给大家看看。

MMU映射表的问题

先看看smdk2410的新连接文件格式,系统把SDRAM的第一个16K放置了MMU的TBL。一看就肝颤抖啊,MINI2440 QEMU用SDRAM作为程序的运行媒体,当然系统起来的时候会把0x30000000放到0x00000000,然后把vector也放到这里。这样才能实现系统中断部分的仿真。如果这样咋办呢?不过暂时还用这个link文件吧。

MEMORY {
	SDRAM_MMU : ORIGIN = 0x30000000, LENGTH = 16k
	SDRAM : ORIGIN = 0x30004000, LENGTH = 64M - 16k
	NIRVANA : ORIGIN = 0, LENGTH = 0
}

REGION_ALIAS ("REGION_START", SDRAM);
REGION_ALIAS ("REGION_VECTOR", SDRAM);
REGION_ALIAS ("REGION_TEXT", SDRAM);
REGION_ALIAS ("REGION_TEXT_LOAD", SDRAM);
REGION_ALIAS ("REGION_RODATA", SDRAM);
REGION_ALIAS ("REGION_RODATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_DATA", SDRAM);
REGION_ALIAS ("REGION_DATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_FAST_TEXT", SDRAM);
REGION_ALIAS ("REGION_FAST_TEXT_LOAD", SDRAM);
REGION_ALIAS ("REGION_FAST_DATA", SDRAM);
REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_BSS", SDRAM);
REGION_ALIAS ("REGION_WORK", SDRAM);
REGION_ALIAS ("REGION_STACK", SDRAM);

_ttbl_base = ORIGIN (SDRAM_MMU);

INCLUDE linkcmds.armv4

用arm-rtemseabi4.11-gdb 调试一下,果然初始化异常向量的时候就挂了。

那么现在有两个方案

第一更改ttbl本身,把ttbl意外的一个地方映射成0地址放vector

第二更改rtems里面的一些东西让我们能像4.9.5那样方便的更改_ttbl_base

但是仔细想来发现,都不太好。因为就MINI2440的RTEMS来说MMU不是那么重要,因为本来就是静态的MMU。

最后,我把ttbl放到了SDRAM最后的16K,然后把SDRAM的可用长度减小16K,这样就统筹的解决了问题。

MEMORY {
	SDRAM :     ORIGIN = 0x30000000, LENGTH = 64M - 16k
	SDRAM_MMU : ORIGIN = 0x33ffc000, LENGTH = 16k
	SRAM :      ORIGIN = 0x40000000, LENGTH = 4k
	NIRVANA :   ORIGIN = 0         , LENGTH = 0
}

REGION_ALIAS ("REGION_START", SDRAM);
REGION_ALIAS ("REGION_VECTOR", SDRAM);
REGION_ALIAS ("REGION_TEXT", SDRAM);
REGION_ALIAS ("REGION_TEXT_LOAD", SDRAM);
REGION_ALIAS ("REGION_RODATA", SDRAM);
REGION_ALIAS ("REGION_RODATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_DATA", SDRAM);
REGION_ALIAS ("REGION_DATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_FAST_TEXT", SDRAM);
REGION_ALIAS ("REGION_FAST_TEXT_LOAD", SDRAM);
REGION_ALIAS ("REGION_FAST_DATA", SDRAM);
REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
REGION_ALIAS ("REGION_BSS", SDRAM);
REGION_ALIAS ("REGION_WORK", SDRAM);
REGION_ALIAS ("REGION_STACK", SDRAM);

_ttbl_base = ORIGIN (SDRAM_MMU);

INCLUDE linkcmds.armv4

运行结果


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值