求救:S3C2440从NANDFLASH启动
若代码小于4K,则代码直接就可以在S3C2440内部的RAM运行.若代码大于4K,则需 从nandflash中copy代码至外扩的SDRAM中,再在SDRAM中运行.
这copy代码是怎样个过程啊?
是不是将保存在nandflash中4K以后的代码复制至SDRAM中,前4K由硬件拷贝至SRAM里?
那复制完之后,跳到SDRAM的0x30000000处开始运行,此地址(0x30000000)的内容是不是 为main()的入口地址? 当配置为nandflash启动,则硬件负责nandflash里的前4K代码拷贝到内部RAM里(此内部RAM映射为从地址0开始),拷贝完成后跳到地址0开始运行程序。此程序怎么运行取决与程序员编写的代码。是否跳到其他地址运行取决于程序员怎么编写程序。 0x3000_0000这个地址是Bank6的起始地址,你如果把SDRAM放在这,那么就可以访问这个地址.
为了方便描述,假定你NAND的前4K程序为程序1, 被引导的程序为程序2.
main的入口地址是取决于程序员的,假如你的程序1代码负责把NAND中的其他代码拷贝到0x3000_0000处, 那你就可以直接跳转到0x3000_0000处开始运行.
但是你要注意,你编写的程序2的代码里配置的绝对地址(ROM和RAM的地址)要与这个运行的地址匹配, 否则运行会不正确. 前4K是直接MAP到内存只的,这时这4K代码就能直接执行,大于4K由于没有MAP到内存中,是在NAND中的,在NAND中不能执行代码,必需由前4K代码中有一个函数把后4K拷到内存中,然后跳到这个入口来执行. 回复【1楼】springhsq
-----------------------------------------------------------------------
来自韦东山的启动代码
ldr r0,=0x53000000 ;watchdog地址
mov r1,#0x0
str r1,
ldr sp,=1024*4 ;须先设置堆栈,才可以调C函数
blclk_init
bl GPIO_Init
bl lcd_init
blmemsetup
blcopy_steppingstone_to_sdram ; 从steppingstone的地址为0处开始复制的.
ldr pc,=on_sdram
on_sdram
msr cpsr_c,#0xdf ;系统模式
ldr sp, =0x34000000 ; @设置栈
ldr lr, =halt_loop ; @设置返回地址
ldr pc, =main ; @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop
b halt_loop
end
执行的结果就是一直重复拷贝过程,没有跳至main中执行;(使用keil 环境编译的) 这个要想深入理解啊
只有一个硬道理:看源码
会遇到很多问题,不过大多网上都有答案,这个过程完后会有收获的! 回复【3楼】tcc89xxevb
-----------------------------------------------------------------------
把后4K拷到内存SDRAM中,是怎样跳到这个入口来执行?????
ldr pc,=on_sdram ///执行这个,是不是就是跳到SDRAM了
on_sdram
msr cpsr_c,#0xdf
ldr sp, =0x34000000
ldr lr, =halt_loop
ldr pc, =main ;这个是不是就会跳到SDRAM中的MIAN函数
halt_loop
b halt_loop
实际运行的结果:没有跳至MAIN函数而是停止:
怎么进不了MAIN函数啊???? 是的,用ldr跳到绝对地址
如果是裸机我记得是靠着ADS的R0,RW设置来确定复制位置
uboot的话靠着text_base确定复制位置 你是在MDK还是ADS下的 回复【4楼】b159
回复【1楼】springhsq
-----------------------------------------------------------------------
来自韦东山的启动代码
ldr r0,=0x53000000 ;watchdog地址
mov r1,#0x0
str r1,
ldr sp,=1024*4 ;须先设置堆栈,才可以调c函数
blclk_init
bl gpio_init
bl lcd_init
blmemsetup
blcopy_steppingstone_to_sdram ; 从steppingstone的地址为0处开始复制的.
ldr pc,=on_sdram
on_sdram
msr cpsr_c,#0xdf ;系统模式
ldr sp, =0......
-----------------------------------------------------------------------
scatter文件有没有检查一下,里面的ro和rw段的地址有没有设置正确 回复【8楼】w32067989
----------------------------------------------------------------------
不是ADS,是keil uVision 4
谢谢!!! 在linux下,使用交叉编译工具,代码已能够正常运行!!!!
谢谢各位!!
页:
[1]