在线时间0 小时
UID323157
注册时间2011-10-18
NXP金币0
该用户从未签到
新手上路

- 积分
- 156
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2012-5-10 09:06:42
|
显示全部楼层
回复:求汇编实现程序跳转
回复第 26 楼 于2012-05-09 22:49:45发表:
回复第 25 楼 于2012-05-09 17:35:29发表:
回复第 21 楼 于2012-05-09 13:58:50发表:
补充一下:如果你的代码开始于500,前边的地址应存放中断向量,main()和_startup应在500(后)的某个地方。你看s19可能觉得格式很固定,但你的程序结构变了(如把Main()挪各地方)s19的也变的。
我在楼上发了个截图,您看一下。
我试了无数种jmp,跳到0x0000 0000,系统没有重启;跳到bootloader的startup地址(反汇编看了一下是0x0000 0806),也没进入bootloader,是不是和我两个文件独立编译有关。我试过在application中jmp到程序的起始段startup是没问题的,而且我每次jmp前都关了全局中断,避免出现错误。无奈了....
从你的application 跳到 Bootloader的_startup应该没问题。我刚才特意修改我的代码在我的系统给你试了,跳转很正常。
关于跳转地址我还真记错了,对不起。0x00000000存的是SP的地址,0004存的才是_startup的地址。而且也不能跳到0x00000004去,因为那只是个地址,不是完整的可执行语句。看了我当时写的代码,我的代码也是从500开始,但在4f0开始我定义了0x4e71,0x4ef9 (汇编的 NOP,JMP),然后是_startup函数名(函数的入口地址)。每次跳转我会跳到4f0。这样的好处是不管你怎么组织你的源代码,程序都会找到_startup,然后由_startup调用你的MAIN()---这一点对Bootloader的兼容性很重要,也是Freescale推荐的,除非你在你的代码结构上作了相应的限制。
但问题好像不是出在上边提到的。我转换你的S19文件检查了,你的_startup还真在0x0806上,如果application直接跳到0x806应该能运行。我现在想知道你的_startup是Freescale CW生成的还是你自己写的?如果只把Bootloader烧入Flash,不烧Application,你的Bootloader的每个部分都能正常运行吗?你的Bootloader用到中断你在0x400前都设好了没有?
您有QQ没....我好想找到关键点了....是您说的这个意思。关键是“0x4F0这里的引导项”对于不同的程序如何来确定。其他的部分和您说的一样,startup是CW10.2自己生成的,我没改过。只烧BootLoader,运行正常,里面关闭全局中断,也没设置过其他的(据说bootloader最好尽可能少的使用中断)。 |
|