arm程序从flash复制到sdram中的问题

[复制链接]
3899|8
 楼主| happy_mcu 发表于 2007-6-22 13:41 | 显示全部楼层 |阅读模式
下面是我的程序&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;r0,ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,BaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;ldreq&nbsp;r0,TopOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;InitRam<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,TopOfROM<br /><br />0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;r0!,{r4-r7}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;r2!,{r4-r7}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r2,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;%B0<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r2,r2,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r0,r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />InitRam<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,BaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,BaseOfZero<br /><br />0<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r2,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;ldrcc&nbsp;r1,[r0],#4<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;r1,[r2],#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;%B0<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,EndOfBSS<br />1<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r2,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;r0,[r2],#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;%B1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;Main<br /><br />我有这样几个问题<br />1.通过上面的程序可以实现将flash中的代码复制到sdram中吗?<br />2.为什么在程序的最后用b&nbsp;Main可以进入main函数,而用ldr&nbsp;pc,=Main却不可以呢?
himalayan 发表于 2007-6-22 14:16 | 显示全部楼层

关于b Main

其实执行b&nbsp;Main&nbsp;后程序并没有调到c语言的main()函数<br />而是先执行一些堆栈的初始化<br />以及ram清零等操作后才进入main()函数的<br />
high 发表于 2007-6-22 14:50 | 显示全部楼层

b Main就是跳到Main

2楼说的是b&nbsp;__main<br /><br />b&nbsp;__main就会把rw,zi搬运过去内存,初始化库等工作然后跳到main<br />即如果用ads,如果c里面有main()函数,自动产生一个__main给startup调用<br />b&nbsp;__main<br /><br />---<br /><br /><br />
阿南 发表于 2007-6-22 20:16 | 显示全部楼层

high high说的很对

  
luhuaren 发表于 2007-6-22 22:01 | 显示全部楼层

re

第一个问题:是的。首先比较&nbsp;&nbsp;刚一上电时候的PC值和RO的值是不是一样,如果不一样,那么就要把进行代码拷贝,如果一样,那就不需要了。
xieqin 发表于 2007-6-23 00:00 | 显示全部楼层

2

b&nbsp;Main可以进入Main函数;ldr&nbsp;pc,=Main也是可以的。<br /><br />推荐用法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R12,&nbsp;=Main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR,&nbsp;PC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R12&nbsp;<br /><br />
 楼主| happy_mcu 发表于 2007-6-23 08:08 | 显示全部楼层

谢谢各位的热心帮助!!

&nbsp;&nbsp;&nbsp;&nbsp;我把上面的程序通过Flash&nbsp;Programmer烧到flash点close后程序能运行,但是重新复位或者重新开机后却没反映了,跟没有程序一样。那是怎么回事呢?
himalayan 发表于 2007-6-23 09:00 | 显示全部楼层

3楼说的对!

是我说错了!
xieqin 发表于 2007-6-23 10:13 | 显示全部楼层

专解问题2

显然楼主所说的b&nbsp;Main是CODE32.<br /><br />如果Main()函数所在C文件也是用armcc.exe编译的,那么b&nbsp;Main和LDR&nbsp;PC,=Main都是正确的.<br /><br />而Main()函数所在C文件也是用tcc.exe编译的,那么b&nbsp;Main是正确的,&nbsp;LDR&nbsp;PC,=Main则是错误的.&nbsp;因为b&nbsp;Main会被编译器纠正优化(ARM程序调用Thumb程序),而LDR,PC=Main不会被优化.所以运行的时候会出错.<br /><br />也就是说b&nbsp;Main这条指令,linker知道它是用来实现函数调用,所以linker会自动在把它转成ARM程序调用thumb程序.&nbsp;而LDR&nbsp;PC,=Main这条指令,linker并不会把它转成ARM程序调用thumb程序.<br /><br />本问题的根本原因是:&nbsp;ARM与Thumb程序混合调用的方法错误<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部