从不同于0的地址运行C应用程序

问题描述

我有两个应用程序,一个刚刚在地址0x20000上启动第二个应用程序 我可以在第一个应用程序中调试,它到达将重定向到地址0x20000的行。

一个应用程序中的代码如下:

uint32_t a_StartAddress = (uint32_t)(uint32_t *)0x20000;
((void (*)(void))a_StartAddress)();

两个应用程序都是在CCS中为TMS570LS033x开发的,但是当应用程序从0x20000启动时,什么也没有发生。是否缺少我要让代码从另一个地址(然后为0)开始的设置?我很高兴提出建议,在此先感谢

(两个程序在闪存中都有足够的空间,如果我在地址0x00000上对其进行闪存,则应用程序将运行。)

反汇编代码

  280 uint32_t a_StartAddress = (uint32_t)(uint32_t *)0x20000;
  00005618: E3A0C802 mov r12,#0x20000
  0000561c: E58DC010 str r12,[sp,#0x10]

  281 ((void (*)(void))a_StartAddress)();
  00005620: E59DC010 ldr r12,#0x10]
  00005624: E12FFF3C blx r12

sys_link.cmd

MEMORY
{
VECTORS (X) : origin=0x00000000 length=0x00000020 vfill = 0xFFFFFFFF
FLASH0 (RWX) : origin=0x00000020 length=0x0001FFE0 fill = 0xFFFFFFFF 
STACKS (RW) : origin=0x08000000 length=0x00001500
SRAM (RWX) : origin=0x08001500 length=0x00006B00
}

SECTIONS
{
.intvecs : {} > VECTORS

.TI.ramfunc : {} load=FLASH0,run=SRAM,table(BINIT)

.text : {} palign=8 > FLASH0
.const : {} palign=8 > FLASH0
.cinit : {} palign=8 > FLASH0
.pinit : {} palign=8 > FLASH0
.data : {} > SRAM
.bss : {} > SRAM
.sysmem : {} > SRAM
.binit : {} > FLASH0
}

解决方法

我已修复它,问题出在链接文件中!我需要这样更改链接器文件:

MEMORY
{
VECTORS (X) : origin=0x00020000 length=0x00000020 vfill = 0xFFFFFFFF
FLASH0 (RWX) : origin=0x00020020 length=0x0001FFE0 fill = 0xFFFFFFFF 
STACKS (RW) : origin=0x08000000 length=0x00001500
SRAM (RWX) : origin=0x08001500 length=0x00006B00