工具/软件:
早上好、
我使用 TMS570LC4357 UC 创建了一个应用、一旦应用完成、我需要创建引导加载程序、就能够从引导加载程序跳转到 APP、但这样做时不会调用应用程序 ISR。 另一方面、如果应用程序自己运行、而没有引导加载程序、则中断可以很好地工作。
我有两个链接器脚本,一个用于引导加载程序,一个用于应用程序,我认为这两个脚本都已正确声明,但这是我第一次使用 TI UC ,所以我对向量复位有点迷失,如果它需要在链接器脚本以外 的其他地方进行更改,或者如果我缺少一些原因,为什么在引导加应用程序运行时不会调用中断。
这是引导加载程序链接器脚本:
/*----------------------------------------------------------------------------*/ /* Linker Settings */ --retain="*(.intvecs)" /* USER CODE BEGIN (1) */ /* USER CODE END */ /*----------------------------------------------------------------------------*/ /* Memory Map */ MEMORY { VECTORS (X) : origin=0x00000000 length=0x00000020 fill = 0xffffffff FLASH0 (RX) : origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff FLASH1 (RX) : origin=0x00200000 length=0x00200000 vfill = 0xffffffff /* Bank 7 (128kB, FEE) */ FLASH7 (R) : origin=0xF0200000 length=0x00020000 vfill = 0xffffffff STACKS (RW) : origin=0x08000000 length=0x00001500 RAM (RW) : origin=0x08002500 length=(0x0002EB00-0x2500) /* Bank 0 ECC */ // ECC_VEC (R) : origin=(0xf0400000 + (start(VECTORS) >> 3)) // length=(size(VECTORS) >> 3) // ECC={algorithm=algoL2R5F021, input_range=VECTORS} // ECC_FLA0 (R) : origin=(0xf0400000 + (start(FLASH0) >> 3)) // length=(size(FLASH0) >> 3) // ECC={algorithm=algoL2R5F021, input_range=FLASH0 } /* Bank 1 ECC */ // ECC_FLA1 (R) : origin=(0xf0400000 + (start(FLASH1) >> 3)) // length=(size(FLASH1) >> 3) // ECC={algorithm=algoL2R5F021, input_range=FLASH1 } /* Bank 7 ECC */ // ECC_FLA7 (R) : origin=0xF0100000 // length=(size(FLASH7) >> 3) // ECC={algorithm=algoL2R5F021, input_range=FLASH7 } } ECC { algoL2R5F021 : address_mask = 0xfffffff8 /* Address Bits 31:3 */ hamming_mask = R4 /* Use R4/R5 build in Mask */ parity_mask = 0x0c /* Set which ECC bits are Even and Odd parity */ mirroring = F021 /* RM57Lx and TMS570LCx are build in F021 */ } #endif /*----------------------------------------------------------------------------*/ /* Section Configuration */ SECTIONS { .intvecs : {} > VECTORS flashAPI: { .\Boot\Fapi_UserDefinedFunctions.obj (.text) .\Boot\bl_flash.obj (.text) --library = F021_API_CortexR4_BE_L2FMC.lib (.text) } load = FLASH0 |FLASH1, run = RAM, LOAD_START(apiLoadStart), RUN_START(apiRunStart), SIZE(apiLoadSize) .text : {} > FLASH0 |FLASH1 .const : {} load=FLASH0 |FLASH1 .cinit : {} > FLASH0 | FLASH1 .pinit : {} > FLASH0 | FLASH1 .bss : {} > RAM /* Uninitialized global and static variables */ .data : {} > RAM /* Global and static non-const variables that are explicitly initialized. */ .sysmem : {} > RAM /* Memory pool (heap) for dynamic memory allocation */ FEE_TEXT_SECTION : {} > FLASH0 | FLASH1 FEE_CONST_SECTION : {} > FLASH0 | FLASH1 FEE_DATA_SECTION : {} > RAM #endif }
这是我的应用程序链接器脚本:
/*----------------------------------------------------------------------------*/ /* Linker Settings */ --retain="*(.intvecs)" /* USER CODE BEGIN (1) */ /* USER CODE END */ /*----------------------------------------------------------------------------*/ /* Memory Map */ MEMORY { VECTORS (X) : origin=0x00020020 length=0x00000020 //VECTORS (X) : origin=0x00000000 length=0x00000020// VECTORS (X) : origin=0x00020020 length=0x00000020 FLASH0 (RX) : origin=0x00020040 length=(0x001FFFE0-0x00020020) FLASH1 (RX) : origin=0x00200000 length=0x00200000 STACKS (RW) : origin=0x08000000 length=0x00003500 //STACKS (RW) : origin=0x08000000 length=0x00001500 RAM (RW) : origin=0x08040000 length=(0x00080000-0x00040000) } /*----------------------------------------------------------------------------*/ /* Section Configuration */ SECTIONS { .intvecs : {} > VECTORS /* discomment only for debug purposes */ .text : {} > FLASH0 | FLASH1 .const : {} > FLASH0 | FLASH1 .cinit : {} > FLASH0 | FLASH1 .pinit : {} > FLASH0 | FLASH1 .bss : {} > RAM .data : {} > RAM .sysmem : {} > RAM FEE_TEXT_SECTION : {} > FLASH0 | FLASH1 FEE_CONST_SECTION : {} > FLASH0 | FLASH1 FEE_DATA_SECTION : {} > RAM }
如您所见、应用程序从0x00020040开始、我没有什么疑问:
1)引导加载程序矢量在0x00000000定义,一旦我跳转到应用程序在0x00020040重新定义,在调试时使用内存浏览器,我可以看到正确写入闪存。 我是否需要在链接器脚本的其他位置更改向量?
2)我想中断没有被启用,但在我的代码中,有一个初始化,其中正在启用中断:
- sciEnableNotification(...)
- rtiEnableNotification(...)
-_enable_irq()
我不知道缺少什么、但似乎与我添加引导加载程序有关、想知道什么是 ISR 无法正常工作的原因吗?
您好、