到上一连载为止,RTEMS 4.9.4的相关代码部分的修改就算结束了。

有些细心的朋友会注意到,第三个连载中列出了所有的文件,我们一些文件并没有修改;还有一些文件AT91RM9200中是没有的。如

c/src/lib/libcpu/arm/at91sam9260/memcpy/memcpy.S,这个文件是我找来的一个ARM下memcpy的优化版本,效率应该高于普通的memcpy。库里本来就有memcpy,所以编译不编译都无所谓。

另外就是网络驱动,网络驱动可有可无,如果运行相关的以太网代码,那必须有的。这里以后再弄吧。

以太网驱动可以先屏蔽一下,只是为了编译通过就好,反正在最中的代码中也不使用。全部做成哑函数就行了。

 

我们先讲讲链接脚本的修改:

 

AT91SAM9260的内存构成:

 

RTEMS 的 AT91SAM9260 移植(7): 链接脚本_网络

 

 

开始的 0x0到0x100000的空间为boot memory。它可以把ROM和SRAM0映射到该地址来。

我们的代码在 SDRAM 中运行,64MB,地址从0x2000 0000 开始。

 

ARM规定,异常向量必须从0x0的地方开始,系统启动时默认是将ROM映射成从0x0地址开始,显然,ROM不能写入东西。

Bootloader 可能会改变这个ROM 的映射,只是可能。但操作系统不能以为这个工作Bootloader 一定做了,必须将SRAM0映射成从0x0地址开始,并将异常向量拷贝到0x0开始的位置。

 

所以为什么start.S中要在拷贝异常向量之前执行memroy remap的函数了。

 

我在调试网络的时候,学习AT91RM9200的脚本,将网络的缓冲区全部放在SRAM0或SRAM1中。发现代码跑一段时间就死机,跑一段时间就完蛋,后来干脆将所有的内存缓冲区全部放在SDRAM中,只有异常向量放在SRAM0中,一下问题就解决了。所以这个脚本也就变为全部都在SDRAM中的了。

 

 

由于所有的东西都从0x20000000开始,不会覆盖到0x0,所以0x0放向量的位置也不需要出现在脚本里。

还有关于脚本中的 .init 段,这个段原来是存放系统中先于Main函数调用的代码。

因为先于main函数运行的代码全部被当成构造函数放在另外一个段了(.ctors)。

这个段只是存放调用.ctors段代码的框架代码。固定为 32 个字节,8条指令。

紧接着是代码段,入口地址 _start 从此处开始。所以 _start 地址应是:0x20000020。

Bootloader加载的位置应该是,0x2000 0000,加载完毕后,跳转的位置应该是:0x2000 0020

特别注意这一点。

 

脚本基本上就这么修改,其他部分没有什么太好说的,关于网络缓冲区的问题,我们讨论到网络的时候再说。脚本看不懂请参考<< using ld>>这个手册,或者别的大牛文章,如果您觉得有问题,请发帖直接找我讨论。谢谢。