程序计数器寄存器(R15 PC)出现问题

时间:2019-03-06 14:13:45

标签: assembly arm keil cortex-m3

我需要将程序放置在内存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,并且在运行模式或分步模式下均不会更改。我做错了什么?

2 个答案:

答案 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。 (如果仍然不完整)。