我的环境:at91rm9200+28F128+dataflash
我运行仿真器时,程序执行起点是__ENTRY,地址是0x20000000,(1)请问这个地址是可变的吗?
1ffffff4 [0xffffffff] dci 0xffffffff ; ? undefined
1ffffff8 [0xffffffff] dci 0xffffffff ; ? undefined
1ffffffc [0xffffffff] dci 0xffffffff ; ? undefined
__ENTRY [0xea000009] b InitReset
undefvec [0xeafffffe] b undefvec
swivec [0xe59ff010] ldr pc,SWI_Addr ; = #SWI_Addr
pabtvec [0xe59ff010] ldr pc,PrefetchAddr ; = #PrefetchAddr
dabtvec [0xe59ff010] ldr pc,DataAbortAddr ; = #DataAbortAddr
rsvdvec [0xeafffffe] b rsvdvec
irqvec [0xe51fff20] ldr pc,0x1ffff100 ; = #0xfffcecec
fiqvec [0xeafffffe] b fiqvec
SWI_Addr [0x2000752c] dcd 0x2000752c ,u.
PrefetchAddr [0x200000e8] dcd 0x200000e8 ...
DataAbortAddr [0x200000ec] dcd 0x200000ec ...
InitReset [0xe59f10dc] ldr r1,0x20000110 ; = #0x200081e0
20000030 [0xe3c11003] bic r1,r1,#3
我执行到软中断后程序死在0x00000008:
00000000 [0xea000007] b 0x24
00000004 [0xeafffffe] b 0x4
00000008 [0xeafffffe] b 0x8
0000000c [0xeafffffe] b 0xc
00000010 [0xeafffffe] b 0x10
00000014 [0xeafffffe] b 0x14
00000018 [0xe51fff20] ldr pc,0xfffff100 ; = #0x00105260
0000001c [0xeafffffe] b 0x1c
00000020 [0x00105448] andeqs r5,r0,r8,asr #8
00000024 [0xe59f1130] ldr r1,0x0000015c ; = #0xfffffc00
00000028 [0xe3e00000] mvn r0,#0
0000002c [0xe5810064] str r0,[r1,#0x64]
00000030 [0xe3e00001] mvn r0,#1
00000034 [0xe5810004] str r0,[r1,#4]
请问为什么呢?
你需要把entry处的8条指令拷贝到0地址。
你从仿真器里直接从0x20000000运行,可能是错过了某些初始化代码。
你是在板子上跑的吧
问题出在你板子上0x8的软中断代码不对,应该把0x8换成一条跳转代码,跳转到0x20000008,否则就死循环了,应该象楼上的说的,你的bootloader没有执行
1.请问这个地址是可变的吗?
可以变,我觉得要看你的板子的硬件环境而定。
2.00000008 [0xeafffffe] b 0x8
自己跳到自己怎么能不死呢...
引用: 引用楼主 tntman 的回复:
我的环境:at91rm9200+28F128+dataflash
我运行仿真器时,程序执行起点是__ENTRY,地址是0x20000000,(1)请问这个地址是可变的吗?
1ffffff4 [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
1ffffff8 [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
1ffffffc [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
__ENTRY ? ? ? ? [0xea000009]? b? ? ? ? InitReset
undefvec [0xeafffffe]? b? ? ? ? undefvec
swivec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,SWI_Addr ; = #SWI_Addr
pabtvec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,PrefetchAddr ; = #PrefetchAddr
dabtvec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,DataAbortAddr ; = #DataAbortAddr
rsvdvec ? ? ? ? [0xeafffffe]? b? ? ? ? rsvdvec
irqvec ? ? ? ? [0xe51fff20]? ldr? ? ? pc,0x1ffff100 ; = #0xfffcecec
fiqvec ? ? ? ? [0xeafffffe]? b? ? ? ? fiqvec
SWI_Addr [0x2000752c]? dcd? ? ? 0x2000752c? ,u.
PrefetchAddr [0x200000e8]? dcd? ? ? 0x200000e8? ...
DataAbortAddr [0x200000ec]? dcd? ? ? 0x200000ec? ...
InitReset [0xe59f10dc]? ldr? ? ? r1,0x20000110 ; = #0x200081e0
20000030 [0xe3c11003]? bic? ? ? r1,r1,#3
我执行到软中断后程序死在0x00000008:
00000000 [0xea000007]? b? ? ? ? 0x24
00000004 [0xeafffffe]? b? ? ? ? 0x4
00000008 [0xeafffffe]? b? ? ? ? 0x8
0000000c [0xeafffffe]? b? ? ? ? 0xc
00000010 [0xeafffffe]? b? ? ? ? 0x10
00000014 [0xeafffffe]? b? ? ? ? 0x14
00000018 [0xe51fff20]? ldr? ? ? pc,0xfffff100 ; = #0x00105260
0000001c [0xeafffffe]? b? ? ? ? 0x1c
00000020 [0x00105448]? andeqs? r5,r0,r8,asr #8
00000024 [0xe59f1130]? ldr? ? ? r1,0x0000015c ; = #0xfffffc00
00000028 [0xe3e00000]? mvn? ? ? r0,#0
0000002c [0xe5810064]? str? ? ? r0,[r1,#0x64]
00000030 [0xe3e00001]? mvn? ? ? r0,#1
00000034 [0xe5810004]? str? ? ? r0,[r1,#4]
请问为什么呢?
你在0x08处的指令是又跳转到0x08,所以死循环了!
(1)请问这个地址是可变的吗?
这个是可以改的,在你的仿真程序的某个设置项里边设置了程序下载的地址及__ENTRY地址。
00000000 [0xea000007] b 0x24
00000004 [0xeafffffe] b 0x4
00000008 [0xeafffffe] b 0x8
0000000c [0xeafffffe] b 0xc
00000010 [0xeafffffe] b 0x10
00000014 [0xeafffffe] b 0x14
00000018 [0xe51fff20] ldr pc,0xfffff100 ; = #0x00105260
0000001c [0xeafffffe] b 0x1c
从这里可以看到,板子的启动代码中除了复位异常和IRQ异常之外都是进入死循环,因为是跳到当前位置
所以你的程序要能执行软中断的内容,然后将下载及__ENTRY地址设置成0