您好!
我正在编写一些应用程序、它充当固件更新的引导加载程序和闪存写入器。
但我遇到了一些问题。 最终、它无法从引导加载程序应用程序跳转到次级应用程序。
我自己的引导应用程序中跳转到第二个应用程序的代码如下所示。
// // 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. //=========================================================================== */
虽然应用的位置不同、但我不确定它为什么不能正常工作。
如果您能告诉我如何正确执行该操作、我将不胜感激。