我需要将程序放置在内存0x20000000中的地址处。在Keil的项目选项中,我打开了“目标”选项卡并设置了以下设置(屏幕快照在这里-> https://i.imgur.com/wL88jqR.png):
IROM1 start = 0x20000000
IROM1 size = 0x400
IRAM1 start = 0x20001000
IRAM1 size = 0x20000
这是我的代码,我希望将其放在我需要的地址上:
STACK_TOP EQU 0x20000100
AREA RESET, DATA, READONLY
DCD STACK_TOP
DCD Start
AREA PROGRAM, CODE, READONLY
ENTRY
Start
NOP
NOP
NOP
b Start
END
编译后,我得到0错误和0警告:
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Program Files\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
".\Objects\main.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:00
然后在调试模式下,我在所需的地址找到了十六进制命令(屏幕快照在此处-> https://i.imgur.com/aDohAV7.png):
8: NOP
0x20000008 BF00 NOP
9: NOP
0x2000000A BF00 NOP
10: NOP
0x2000000C BF00 NOP
11: b Start
0x2000000E E7FB B 0x20000008
但是问题是我无法执行它,因为程序计数器始终为0x00000000,并且在运行模式或分步模式下均不会更改。我做错了什么?
答案 0 :(得分:1)
在调试模式下,您可以看到RAM中加载的二进制文件,因为Keil通过调试器为您执行了该操作,例如ULINK。但是,这只有1次,RAM内容将在下一个电源周期中清除,并且在重置处理器后二进制文件将丢失。这个想法是,您可以将程序放在RAM中,但是二进制文件必须存储在永久性/非易失性内存(NVM)中。
Keil的this article提供了实现所需功能的说明。
请注意,您仍然需要NVM中的代码来引导应用程序。在带有Cortex-M处理器的空NVM上运行是不可能的。
您的程序计数器停留在0x00000000,因为那里没有向量表可以继续。启动时,Cortex-M3将查看向量表(默认情况下位于地址0x00000000),并寻找Reset Handler的起始地址(此地址存储在地址0x00000004中)。在“重置处理程序”中,您可以按照本文所示将二进制文件复制到RAM,然后在RAM中调用主程序并正常运行。
答案 1 :(得分:0)
大概中止处理程序指向地址0,并且您最终处于锁定状态。您无法避免将至少0x4地址与Cortex-M一起使用。地址0x4可以有0x2000001。 (如果仍然不完整)。