Assembly 将PC(R15)设置为指向我的代码,然后将其放置在嵌入式ARM设备上Keil指定的RAM地址

Assembly 将PC(R15)设置为指向我的代码,然后将其放置在嵌入式ARM设备上Keil指定的RAM地址,assembly,arm,keil,cortex-m3,Assembly,Arm,Keil,Cortex M3,我需要将程序放在内存0x20000000中的地址。在Keil的项目选项中,我打开了“目标”选项卡,并设置了以下设置(屏幕截图在这里-->): 这是我的代码,我希望放在我需要的地址: STACK_TOP EQU 0x20000100 AREA RESET, DATA, READONLY DCD STACK_TOP DCD Start AREA PROGRAM, CODE, READONLY ENTRY Start NOP NOP N

我需要将程序放在内存0x20000000中的地址。在Keil的项目选项中,我打开了“目标”选项卡,并设置了以下设置(屏幕截图在这里-->):

这是我的代码,我希望放在我需要的地址:

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
然后在调试模式下,我在我需要的地址找到了我的十六进制命令(屏幕截图在这里->):


但问题是我无法执行它,因为程序计数器始终为0x00000000,并且在运行模式或逐步模式下都不会更改。我做错了什么?

可能中止处理程序指向地址0,而您最终处于锁定状态。您无法避免在Cortex-M中至少使用地址0x4。在地址0x4处使用0x2000001是可以的。(如果仍然相当不完整)


更完整的实现可能是将0x2000001写入0x4,并将VTOR设置为指向从0x20000000开始的向量表(您将希望尽快安排填充该向量表)。

在调试模式下,您可以在RAM中看到加载的二进制文件,因为Keil通过调试器(例如ULINK)为您执行此操作。但是,这只是1次,RAM内容将在下一次电源循环中清除,并且在重置处理器时,二进制文件将丢失。其思想是,您可以将程序放在RAM中,但二进制文件必须存储在持久性/非易失性内存(NVM)中

Keil在中提供了实现所需目标的说明

请注意,您仍然需要NVM中的代码来引导应用程序。使用Cortex-M处理器运行空NVM是不可能的


您的程序计数器停留在0x00000000,因为那里没有要继续的向量表。启动时,Cortex-M3将查看向量表(默认情况下位于地址0x00000000),并查找重置处理程序的起始地址(该地址存储在地址0x00000004)。在重置处理程序中,您可以将二进制文件复制到RAM中,如本文所示,然后在RAM中调用主程序并正常运行。

在构建此类程序之前,您计划如何加载和执行它?使用向量表0x20000000从0x00000000启动的部件是ram,因此重置时不会加载程序(通常),因此您必须首先从0x00000000或其他一些闪存空间运行,然后一旦程序在ram中,您就可以分支到它。@old_timer,我需要从地址0x20000000运行。这就是重点。我完全理解,除非你从某处将程序加载到ram中,否则不可能做到这一点。你打算如何将程序加载到ram中。从flash复制它很简单,这是我们可以采取的一种方法,如果您以不同的方式加载程序,那么这可能意味着不同的解决方案。如何使用引导管脚或配置位或其他启动也决定了该输入代码的外观。然后,您可以讨论如何设置代码和链接器脚本,因为问题是您还没有进入代码和链接器脚本步骤,您个人可能是,但您需要赶上我们……注意,如果您使用gnu工具,这是微不足道的,但您可能会丢失一些依赖的库或其他编译器中没有的一些C语言扩展。
*** 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
     8:     NOP 
0x20000008 BF00      NOP      
     9:         NOP 
0x2000000A BF00      NOP      
    10:         NOP 
0x2000000C BF00      NOP      
    11:         b Start 
0x2000000E E7FB      B        0x20000008