用三星的ARM都要配置RAM,我的2410板子优龙的,0x30000000~0x34000000有64M SDRAM,当然还有4K SRAM在0x0处(从Nand Flash启动)。
以前在仿真带有异常中断的引导程序时非常头痛,ADS的RO Base设置为0x30000000。在没遇到异常中断的情况下,程序不会有一点问题,正常运行。但是一有中断了,程序就不行了。因为异常中断时,PC会返回0x00~0x1c,而我们把RO Base设置为0x30000000,在地址从0x0000开始处当然就没有
b HandlerReset
b HandlerUndef
b HandlerSWI
b HandlerPabort
b HandlerDabort
b .
b HandlerIRQ
b HandlerFIQ
存在。异常中断时当然会出错。
于是我就写了个scatter专门在调试时使用,当下载到Nand Flash时还用RO Base=0x30000000。
bootloader_load 0x00000000
{
steppingstone +0
{
start.o(Start,+FIRST)
init_asm.o(+RO)
init_c.o(+RO)
}
}
sdram_load 0x30000000
{
SDRAM_RO 0x30000000
{
*(+RO)
}
SDRAM_RW +0
{
*(+RW,+ZI)
}
}
这样就OK了,含有跳转指令的start.o给放到0x0000处。
需要说明的是,RO Base设置的是程序的运行域,而AXD仿真加载程序时就是按照运行域而不是加载域来把代码放到内存中的。 |