首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

程序怎么从FLASH搬运到SDRAM中

2012-02-24 
程序如何从FLASH搬运到SDRAM中?程序是存放于FLASH中的,而运行于SDRAM中。请问上电的时候程序是如何搬运过去

程序如何从FLASH搬运到SDRAM中?
程序是存放于FLASH中的,而运行于SDRAM中。
请问上电的时候程序是如何搬运过去的?
是软件方式?
采用汇编语言?


[解决办法]
[code=/asm]
/* nor copy */
relocate:/* relocate U-Boot to RAM  */
adrr0, _start/* r0 <- current position of code  */
@ldrr1, _TEXT_BASE
ldrr1, _TEXT_PHY_BASE/* r1 <- destination        */

ldrr2, _armboot_start
ldrr3, _bss_start
subr2, r3, r2/* r2 <- size of armboot      */
addr2, r0, r2/* r2 <- source end address    */

copy_loop:
ldmiar0!, {r3-r10}/* copy from source address [r0]  */
stmiar1!, {r3-r10}/* copy to  target address [r1]  */
cmpr0, r2/* until source end addreee [r2]  */
blecopy_loop
bafter_copy
[/code]
其中_TEXT_BASE在uboot的board目录下相应芯片目录下的config.mk中定义。
_TEXT_PHY_BASE是由start.S开头的一个宏定义的,原型在uboot的include目录下相应芯片的头文件中定义。
_armboot_start定义在start开头,就是_start的地址;_bss_start的原型定义在uboot.lds中。
如下:
. = ALIGN(4);
__bss_start = .;
实际_bss_start就是bss段的基址,bss段是未初始化数据段,由系统自动初始化的。
关于ARM指令集的你自己去看看,我就不讲了。
上面的代码就能将你的程序从flash中搬到SDRAM中。但是这段是仅nor flash适用的,nand flash实际是调用C程序进行copy。
因为nor flash是块存储设备,nand flash是IO设备,需要先驱动起来,有一点区别。
具体的可以找uboot源码看看,对你理解底层很有帮助的。
[解决办法]
哎呀,不要想的太复杂了!
一般的处理是:

MCU片子本身有一个ROM区,可以称作“内部ROM区”,上电时,最先执行的是它那里的代码。在这种情况下,代码是片子出厂的时候就已经埋进去了的。
或者是,本身没有ROM区,但是有一个区域可以在启动时自动映射成“内部ROM区”(其实就是中断向量所在的位置,CPU上电复位时,会跳到这个固定的地址执行)。注意这个被映射的区域必须是可执行代码的,例如Mask ROM, Nor Flash等等。在这种情况下,代码可以是用户自己实现的。

存放在“内部ROM区”的代码会把固定区域的一块很小的代码搬到SDRAM中,然后运行这段代码,不妨称这段代码为代码1。那么用户就可以实现这个代码1,在这段代码中把想要执行的程序从Flash搬到SDRAM中,搬完后,跳到这个程序的入口开始执行。

总之,就是MCU会通过运行复位地址所在的“一小段代码”(当然首先是跳到复位向量处,复位向量那里存放了一条跳转指令,跳到“一小段代码”处),来进行首次搬移工作,那搬移后,就是你自己的事了,你再想搬2次,3次,4次。。。随便你。

所以bootloader有“几个阶段”的说法,说白了也只是为了应用上的方便,你要是不想通用,直接通知MCU的供应商给你改内部ROM的程序,帮你把整程序一次性搬过去,也行!(当然,这是不会发生的情况。:))

热点排行