支持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移植接口的不同外也遇到一些比较棘手的问题。
后面陆续拿出来给大家看看。
先看看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
那么现在有两个方案
第一更改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