您好!
我正在编写一些应用程序、它充当固件更新的引导加载程序和闪存写入器。
但我遇到了一些问题。 最终、它无法从引导加载程序应用程序跳转到次级应用程序。
我自己的引导应用程序中跳转到第二个应用程序的代码如下所示。
//
// Included Files
//
#include "driverlib_cm.h"
#include "cm.h"
#define APP_START_ADDRESS 0x00270000U
void exit(uint32_t address){
//
// Jump to entry address
//
__asm(" bx r0");
}
//
// Main
//
void main(void)
{
CM_init();
GPIO_writePin(120U,0);
exit(APP_START_ADDRESS);
}
//
// End of File
//
链接命令脚本与下面的相同。
MEMORY
{
/* Flash sectors */
CMBANK0_RESETISR : origin = 0x00200000, length = 0x00000008 /* Boot to Flash Entry Point */
CMBANK0_SECTOR0 : origin = 0x00200008, length = 0x00003FF8
CMBANK0_SECTOR1 : origin = 0x00204000, length = 0x00004000
CMBANK0_SECTOR2 : origin = 0x00208000, length = 0x00004000
C1RAM : origin = 0x1FFFC000, length = 0x00002000
C0RAM : origin = 0x1FFFE000, length = 0x00002000
BOOT_RSVD : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
S0RAM : origin = 0x20000800, length = 0x00003800
S1RAM : origin = 0x20004000, length = 0x00004000
S2RAM : origin = 0x20008000, length = 0x00004000
S3RAM : origin = 0x2000C000, length = 0x00004000
E0RAM : origin = 0x20010000, length = 0x00004000
CPU1TOCMMSGRAM0 : origin = 0x20080000, length = 0x00000800
CPU1TOCMMSGRAM1 : origin = 0x20080800, length = 0x00000800
CMTOCPU1MSGRAM0 : origin = 0x20082000, length = 0x00000800
CMTOCPU1MSGRAM1 : origin = 0x20082800, length = 0x00000800
CPU2TOCMMSGRAM0 : origin = 0x20084000, length = 0x00000800
CPU2TOCMMSGRAM1 : origin = 0x20084800, length = 0x00000800
CMTOCPU2MSGRAM0 : origin = 0x20086000, length = 0x00000800
CMTOCPU2MSGRAM1 : origin = 0x20086800, length = 0x00000800
}
SECTIONS
{
.resetisr : > CMBANK0_RESETISR
.vftable : > CMBANK0_SECTOR0 /* Application placed vector table in Flash*/
.vtable : > S0RAM /* Application placed vector table in RAM*/
.text : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
.cinit : > CMBANK0_SECTOR0
.pinit : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
.switch : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
.sysmem : > S2RAM
.stack : > C1RAM
.ebss : > C1RAM
.econst : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
.esysmem : > C1RAM
.data : > S3RAM
.bss : > S3RAM
.const : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
MSGRAM_CM_TO_CPU1 : > CMTOCPU1MSGRAM0, type=NOINIT
MSGRAM_CM_TO_CPU2 : > CMTOCPU2MSGRAM0, type=NOINIT
MSGRAM_CPU1_TO_CM : > CPU1TOCMMSGRAM0, type=NOINIT
MSGRAM_CPU2_TO_CM : > CPU2TOCMMSGRAM0, type=NOINIT
.TI.ramfunc : {} LOAD = CMBANK0_SECTOR0,
RUN = C0RAM,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
上面的引导应用程序尝试跳转到的次级应用程序的链接命令如下所示、
MEMORY
{
/* Flash sectors */
CMBANK0_RESETISR10 : origin = 0x00270000, length = 0x00000008 /* Boot to Flash Entry Point */
CMBANK0_SECTOR10_11 : origin = 0x00270008, length = 0x00007FF8
CMBANK0_SECTOR12 : origin = 0x00278000, length = 0x00004000
CMBANK0_SECTOR13 : origin = 0x0027C000, length = 0x00004000
C1RAM : origin = 0x1FFFC000, length = 0x00001FFF
C0RAM : origin = 0x1FFFE000, length = 0x00001FFF
BOOT_RSVD : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
S0RAM : origin = 0x20000800, length = 0x000037FF
S3RAM : origin = 0x2000C000, length = 0x00003FFF
S1_S3RAM : origin = 0x20004000, length = 0x0000BFFF
E0RAM : origin = 0x20010000, length = 0x00003FFF
CPU1TOCMMSGRAM0 : origin = 0x20080000, length = 0x00000400
CPU1TOCMMSGRAM0_ECAT : origin = 0x20080400, length = 0x00000400
CPU1TOCMMSGRAM1 : origin = 0x20080800, length = 0x00000800
CMTOCPU1MSGRAM0 : origin = 0x20082000, length = 0x00000400
CMTOCPU1MSGRAM0_ECAT : origin = 0x20082400, length = 0x00000400
CMTOCPU1MSGRAM1 : origin = 0x20082800, length = 0x00000800
CPU2TOCMMSGRAM0 : origin = 0x20084000, length = 0x00000800
CPU2TOCMMSGRAM1 : origin = 0x20084800, length = 0x00000800
CMTOCPU2MSGRAM0 : origin = 0x20086000, length = 0x00000800
CMTOCPU2MSGRAM1 : origin = 0x20086800, length = 0x00000800
}
SECTIONS
{
.resetisr : > CMBANK0_RESETISR10, ALIGN(8)
.vftable : > CMBANK0_SECTOR10_11, ALIGN(8) /* Application placed vector table in Flash*/
.vtable : > S0RAM /* Application placed vector table in RAM*/
.text : >> CMBANK0_SECTOR10_11 | CMBANK0_SECTOR12, ALIGN(8)
.cinit : > CMBANK0_SECTOR10_11, ALIGN(8)
.pinit : > CMBANK0_SECTOR10_11, ALIGN(8)
.switch : > CMBANK0_SECTOR10_11, ALIGN(8)
.sysmem : > C1RAM
.stack : > C1RAM
.ebss : > C1RAM
.econst : > CMBANK0_SECTOR10_11, ALIGN(8)
.esysmem : > C1RAM
.data : >> C0RAM|C1RAM
.bss : > C0RAM
.const : > CMBANK0_SECTOR10_11, ALIGN(8)
MSGRAM_CM_TO_CPU1 : > CMTOCPU1MSGRAM1, type=NOINIT
MSGRAM_CM_TO_CPU1_ECAT : > CMTOCPU1MSGRAM0_ECAT, type=NOINIT
MSGRAM_CM_TO_CPU2 : > CMTOCPU2MSGRAM0, type=NOINIT
MSGRAM_CPU1_TO_CM : > CPU1TOCMMSGRAM0, type=NOINIT
MSGRAM_CPU1_TO_CM_ECAT : > CPU1TOCMMSGRAM0_ECAT, type=NOINIT
MSGRAM_CPU2_TO_CM : > CPU2TOCMMSGRAM0, type=NOINIT
.TI.ramfunc : {} LOAD = CMBANK0_SECTOR10_11,
RUN = S1_S3RAM,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
虽然应用的位置不同、但我不确定它为什么不能正常工作。
如果您能告诉我如何正确执行该操作、我将不胜感激。



