|
app1是可以运行的,因为我在app1里面点了三个灯,可以验证
app2的空间应该没有被擦除,因为使用Flash Programmer先下载app2时提示擦除了扇区1~5,而下载app1时只提示擦除了扇区1。而app2因为是被编译到0x8000地址,所以应该是在扇区5上。
keil的工程在c代码之前都有个.s的汇编文件进行cpu的初始化。我的app1和app2的.s文件是完全一样的,所以我认为只要app1能够运行(3灯被点亮),那cpu就是初始化过了,应该可以直接跳转到app2的main函数部分开始运行。实际上app1的.s里最后也是一个简单的跳转:
- // Enter the C code
- LDR R0,=?C?INIT
- TST R0,#1 ; Bit-0 set: INIT is Thumb
- LDREQ LR,=exit?A ; ARM Mode
- LDRNE LR,=exit?T ; Thumb Mode
- BX R0
- ENDP
复制代码
但我直接在这里将LDR R0,=?C?INIT 改成LDR R0,=0x8000 也不行。。。
最让我郁闷的是,我单独下载app2,是可以运行的,反汇编发现LDR R0,=?C?INIT执行后R0的值是0x8069,于是我把app2的.s里直接改为LDR R0,=0x8069,运行没有问题。但我在app1里用LDR R0,=0x8069就完全没有效果,app1的.s和app2的.s文件是完全一样的啊,唯一的区别就在于R0,=?C?INIT两个程序的?C?INIT不一样。
难道真是keil在编译的时候有什么特殊的设置?由于公司收到过ads的法务函,所以盗版的ads都卸载了,这两天回家装个ads试试。。。。
现在在学习arm 汇编,希望能有所帮助。
也谢谢楼上两位,等了几天终于有人回帖了。。。。 |
|