8132|14

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

程序如何从FLASH搬运到SDRAM中? [复制链接]

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

最新回复

版主贴主早上好! 版主贴主每天都有好心情! 1fxipXPdW9uxgbD1vPzRmveX回帖是一种美德!KxXx5Ki2lG7zW7FztO47arjz ========================== 介+绍: [/url] 4EU3ShNOLcVgq3I8whL3emWa 1)可录制上网记录,截获Http信息。 2)利用截获的Http信息自动生成命令(Page,拖拽即可完成) 3)执行命令,模拟浏览器向Web服务器发生命令。 中文论坛:[url=http://spritebrowser.com/LunTan] 1fxipXPdW9uxgbD1vPzRmveX 要看美女来这里: [url=http://byhat.com][/url] ======================= 软件创业QQ 群:103815692 xoxpaSRIFHD2g4chKTMXI7fB  详情 回复 发表于 2010-4-14 13:21
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
汇编语言或者C语言都可以,用汇编的多一些。
如果CPU存在stepstone概念,stepstone区的数据是CPU在启动的时候自动搬的。
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
100分,没人给点建议啊?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个 一般都是采用汇编 指令实现,这样效率更高。
C 基本很少用。

 
 
 

回复

1

帖子

0

TA的资源

禁止访问

5
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
上电启动后,从falsh的地址0开始运行,在完成CPU工作模式设置和关看门狗、关中断以后读取_start的值,如果地址和TEXT_BASE不相等,进行代码搬运。TEXT_BASE是SDRAM中代码基址。
相关的代码在uboot里都有,你可以去读一下。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 tankdin 的回复:

上电启动后,从falsh的地址0开始运行,在完成CPU工作模式设置和关看门狗、关中断以后读取_start的值,如果地址和TEXT_BASE不相等,进行代码搬运。TEXT_BASE是SDRAM中代码基址。
相关的代码在uboot里都有,你可以去读一下。

“从falsh的地址0开始运行”
不是必须要在RAM中运行程序吗?
UBOOT是烧录在FLASH中的吗?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
[code]
        /* nor copy */
relocate:                                /* relocate U-Boot to RAM            */
        adr        r0, _start                /* r0 <- current position of code   */
@        ldr        r1, _TEXT_BASE
        ldr        r1, _TEXT_PHY_BASE        /* r1 <- destination                */

        ldr        r2, _armboot_start
        ldr        r3, _bss_start
        sub        r2, r3, r2                /* r2 <- size of armboot            */
        add        r2, r0, r2                /* r2 <- source end address         */

copy_loop:
        ldmia        r0!, {r3-r10}                /* copy from source address [r0]    */
        stmia        r1!, {r3-r10}                /* copy to   target address [r1]    */
        cmp        r0, r2                        /* until source end addreee [r2]    */
        ble        copy_loop
        b        after_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源码看看,对你理解底层很有帮助的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
烧写uboot是通过SDRAM的,但是最终是存在flash里的。
先下班,回去再回你了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
也就是说,一个嵌入式系统
CPU上电马上就去读取FLASH里面地址为0的指令。存放到SDRAM中

然后运行。对吧。

我有点疑问就是:我们读取FLASH需要驱动。这驱动程序是放在哪儿的?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
ARM9会有个stepstone的概念,如果设置成NAND启动,它会自动读取NAND前4K或者8K的数据到内部RAM的0地址处然后开始执行,外部的DRAM等是要初始化才能正确访问的,启动时读取的那些NAND是由CPU自己来完成的。先被复制的这些代码用来初始化外部的RAM以及将其它的FLASH中的数据读取到RAM中去,再跳转过去执行。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
哎呀,不要想的太复杂了!
一般的处理是:

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

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

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

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

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
看bootloader,
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
在启动代码里,写入一段搬运代码,把FLASH里的代码搬到SDRAM里,当程序跳到主函数里时,就可以正常运行了,这段搬运代码可以从网上搜,要注意的是,在主函数运行前,要把Flash 进行初始化
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
版主贴主早上好!
版主贴主每天都有好心情!

1fxipXPdW9uxgbD1vPzRmveX回帖是一种美德!KxXx5Ki2lG7zW7FztO47arjz
==========================
介+绍:

[/url]

4EU3ShNOLcVgq3I8whL3emWa
1)可录制上网记录,截获Http信息。
2)利用截获的Http信息自动生成命令(Page,拖拽即可完成)
3)执行命令,模拟浏览器向Web服务器发生命令。

中文论坛:[url=http://spritebrowser.com/LunTan]

1fxipXPdW9uxgbD1vPzRmveX

要看美女来这里:
[url=http://byhat.com][/url]

=======================
软件创业QQ 群:103815692

xoxpaSRIFHD2g4chKTMXI7fB
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表