打印

关于2440的init.s的执行

[复制链接]
3425|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gucheng82|  楼主 | 2009-12-5 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问一下,2440的init.s在上电后共执行几次啊?一次还是两次?
我的理解是:init.s在上电启动后,先在FLASH中执行一次,将代码(包括自身)和数据拷贝到SDRAM中,然后在SDRAM再执行一次.请问是这样吗?
请高手帮忙解答一下,谢谢~~

相关帖子

沙发
阿南| | 2009-12-5 13:07 | 只看该作者
放个点灯的代码,实际测试一下,看看效果

使用特权

评论回复
板凳
gucheng82|  楼主 | 2009-12-5 15:37 | 只看该作者
谢谢阿南
我照你说的试了下,在初始化堆栈后面加入了点灯的子程序,没想到只看到只执行了一次,和想的不一样啊.能帮忙解释一下原因吗?谢谢~~

使用特权

评论回复
地板
lelee007| | 2009-12-5 22:42 | 只看该作者
倒塌

不是执行两次,是分两个阶段来执行的

不知道LZ说的flash是不是NOR

nand里边的代码是不能直接执行的,先把最开始4K copy到小石头里去运行,这4K代码内负责一些初始化,并且把nand里边的代码搬运到SDRAM里边。至于如何搬运(要不要搬运前4K),看你的喜好了,可以把前4K搬过去,也可以不搬过去。至于搬到哪儿,就看你链接脚本怎么写了,根据你的链接设置来确定搬运地址,如果搬运的地址与你链接设置不一致,程序可能是没法运行的。

折腾nand很郁闷的事,因为我总怕烧的次数多了,把无辜的nand烧坏了

7月份的时候我自己搞了个简单的调试平台,调试裸奔程序的时候,不烧nand(不用JLINK之类的东东的),通过uboot直接把编译好的程序DOWN到SDRAM里边,然后从uboot  go到SDRAM里边程序开始的地方去跑,雕虫小技,我觉得对于没有JLINK的菜菜来说是不错的,不过这个比较考验代码编写能力,调试只能根据运行结果和printf,我前面就因为有一次不小心把堆栈设置改了下(无意中碰到的),折腾了两天时间才发现

使用特权

评论回复
5
贾君鹏子| | 2009-12-5 22:58 | 只看该作者
楼上是高手啊,解释的很详细

使用特权

评论回复
6
lelee007| | 2009-12-5 23:16 | 只看该作者


南哥才是高手

使用特权

评论回复
7
gucheng82|  楼主 | 2009-12-5 23:48 | 只看该作者
谢谢lelee007
我用的是NOR FLASH,所以没有你这么麻烦,呵呵
我知道uboot是分为stage1和stage2的,可是init.s也是分stage1和stage2吗?这是怎么分的?

使用特权

评论回复
8
juventus9554| | 2009-12-5 23:58 | 只看该作者
都是高手,我啥时候才能达到你们的水平啊

使用特权

评论回复
9
xinzha| | 2009-12-6 08:32 | 只看该作者
一般来说,nor里面的是bootloader,通过bootloader下载进去的是firmware。多数情况下,bootloader和firmware是两个工程。
而bootloader是从reset_handler(或者其他的名字)开始执行,在链接bootloader的scatter文件中会把init.s确定为这一部分执行代码的entry,即入口点,在bootloader阶段,reset处理是0地址。
而在firmware阶段,第一个文件是vector.s或者其他的方式,反正第一个链接的需要是中断向量点,这是arm的异常管理的规定,pc会根据reset异常的向量跳到init.s中的reset处理函数执行。而在firmware阶段,一般来说 ld pc PC, ResetAddr这句是0地址。

使用特权

评论回复
10
gooogleman| | 2009-12-7 13:57 | 只看该作者
一次哦,内部SRAM 然后搬运到内存运行,

如果你是用仿真器和不用仿真器又不太一样。

使用特权

评论回复
11
bespecial| | 2009-12-24 22:05 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

27

帖子

0

粉丝