打印

关于2440下载程序地址设置问题

[复制链接]
2498|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qinhuan7|  楼主 | 2013-6-27 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qinhuan7 于 2013-6-28 11:41 编辑

我用keil调试时,平台是2440,外接两片SDRAM,一片NANDFLASH和一片NORFLASH;ROM1设置0x00000000或者0x30000000后程序都可以运行,程序默认是从0x00000000开始运行,这个可以理解,那从0x30000000怎么能运行?如果说0x300000000地址被映射到了0x00000000,那么当ROM1设置0x00000000时地址没有被映射过吗?如果映射过,它是什么时候映射的?

相关帖子

沙发
huangxz| | 2013-6-27 22:41 | 只看该作者
看了两遍还是没看明白。

使用特权

评论回复
板凳
jlass| | 2013-6-28 08:43 | 只看该作者
看了三遍还是没看明白。

使用特权

评论回复
地板
dirtwillfly| | 2013-6-28 10:33 | 只看该作者
没看明白,不过建议楼主再去看看ARM的启动过程

使用特权

评论回复
5
liusensen| | 2013-6-28 11:07 | 只看该作者
接着来一个  也是没看懂 !

使用特权

评论回复
6
qinhuan7|  楼主 | 2013-6-28 11:43 | 只看该作者
我的神啊

使用特权

评论回复
7
qinhuan7|  楼主 | 2013-6-28 11:45 | 只看该作者
liusensen 发表于 2013-6-28 11:07
接着来一个  也是没看懂 !

很简单,问题是我都是用nandflash启动,调试时的地址不同,为什么程序都会运行?

使用特权

评论回复
8
qinhuan7|  楼主 | 2013-6-28 13:12 | 只看该作者
huangxz 发表于 2013-6-27 22:41
看了两遍还是没看明白。

其实我想问的是,程序不是从0x00处开始执行吗,我把程序下载到0x00000000,或者0x30000000处它都会执行,为什么?

使用特权

评论回复
9
huangxz| | 2013-6-28 13:48 | 只看该作者
qinhuan7 发表于 2013-6-28 13:12
其实我想问的是,程序不是从0x00处开始执行吗,我把程序下载到0x00000000,或者0x30000000处它都会执行, ...

是从0开始执行的,无论你下到0还是0x30,最终都是从0开始的。

使用特权

评论回复
10
867405479| | 2013-6-28 20:01 | 只看该作者
应该是从0开始执行,不过在0地址处到0x30地址间都是0,所以程序在0地址和0x30地址间跑的时候什么也没做,到0x30处才开始执行你烧写的程序,不知道是不是这样?

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
qinhuan7 + 3 赞一个!
11
867405479| | 2013-6-28 20:04 | 只看该作者
这应该与NANDflash的烧写过程有关,nandflash是整块整块的扫写,烧写时会先将flash里的都写入0,不知道是不是这样,希望得到求证

使用特权

评论回复
12
qinhuan7|  楼主 | 2013-6-28 20:19 | 只看该作者
huangxz 发表于 2013-6-28 13:48
是从0开始执行的,无论你下到0还是0x30,最终都是从0开始的。

嗯,但是我下载到0x30的时候程序是怎么去执行0x30的代码的呢?

使用特权

评论回复
13
qinhuan7|  楼主 | 2013-6-28 20:31 | 只看该作者
867405479 发表于 2013-6-28 20:04
这应该与NANDflash的烧写过程有关,nandflash是整块整块的扫写,烧写时会先将flash里的都写入0,不知道是不 ...

nandflash是IO设备,烧写nandflash时是先将程序烧写到SDRAM中,然后通过NF_WRITE()把程序转移到nandflash中的

使用特权

评论回复
14
qinhuan7|  楼主 | 2013-6-28 20:35 | 只看该作者
867405479 发表于 2013-6-28 20:01
应该是从0开始执行,不过在0地址处到0x30地址间都是0,所以程序在0地址和0x30地址间跑的时候什么也没做,到 ...

这样也行?

使用特权

评论回复
15
pangencao| | 2013-6-29 12:28 | 只看该作者
当设为0x30000000时,keil调试软件会自动在线设置pc寄存器从该处执行,所以程序可以正常执行,但这是中断还是从0x04等地址执行,如果中断向量未设置处理好(norflash上次写入或ramcopy或nand映射),相关中断程序是不能正确执行的,如usb中断。

使用特权

评论回复
16
qinhuan7|  楼主 | 2013-6-29 20:54 | 只看该作者
pangencao 发表于 2013-6-29 12:28
当设为0x30000000时,keil调试软件会自动在线设置pc寄存器从该处执行,所以程序可以正常执行,但这是中断还 ...

用keil调试程序和下载程序有什么区别(调试的时候程序被存在哪儿,和下载时是一样的吗?)

使用特权

评论回复
17
pangencao| | 2013-6-30 09:42 | 只看该作者
没有区别,但是有时候执行流程是有区别的;
对于2440,调试程序通常放在sdram中,下载程序写入flash。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
qinhuan7 + 3
18
lelee007| | 2013-6-30 10:02 | 只看该作者
0x30000000

LZ确认以下,2440上从NOR启动时,是不是有硬件设置,可以将NOR的0x30000000 remap到0x00000000

如果是这样的话,你的问题答案显而易见,你把remap的原理和流程弄清楚就OK了

使用特权

评论回复
19
qinhuan7|  楼主 | 2013-6-30 17:04 | 只看该作者
本帖最后由 qinhuan7 于 2013-6-30 19:10 编辑

折腾了一周,终于弄清楚了,和大家分享一下;
我用的TQ2440,norflash地址范围为0x0000000-0x1FFFFF;SDRAM的地址范围为0x30000000-0x40000000;

使用keil下载后程序重上电后仍可以运行,是因为下载将程序存储在flash中,断电还在;
使用keil调试后重上电是刚刚下载的程序,是因为程序下载到RAM中,断电后就丢失了;

使用jlink下载norflash时,在程序大小不超出0x1FFFFF的范围内,将程序下载至任何地址程序都可以运行;上电PC从0x0000000开始执行,如果0x00000000没有语句则执行下一条语句,所以程序可以执行。

在keil调试的时候,在keil中设置下载地址ROM1为0x00000000或者0x30000000(下载到此处的前提是0x30000000之前的区域没有代码)程序都会运行,因为程序PC默认从0x00000000开始运行;当使用debug的initialization file时,PC被设置为0x30000000,此时程序就从0x30000000开始执行了,这是我个人理解,有不对之处请纠正

使用特权

评论回复
20
qinhuan7|  楼主 | 2013-6-30 17:16 | 只看该作者
怎么结贴给分错误呢,我分配了分数的嘛

使用特权

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

本版积分规则

个人签名:把学习当成一种娱乐!

26

主题

400

帖子

7

粉丝