RTEMS 4.11 的 MINI2440 QEMU BSP 移植小记

来源:互联网 发布:银河帝国全集mac 编辑:程序博客网 时间:2024/04/30 19:57

缘由

支持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 = 16kSDRAM : ORIGIN = 0x30004000, LENGTH = 64M - 16kNIRVANA : 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 - 16kSDRAM_MMU : ORIGIN = 0x33ffc000, LENGTH = 16kSRAM :      ORIGIN = 0x40000000, LENGTH = 4kNIRVANA :   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

运行结果