工具/软件:
早上好、
我使用 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 无法正常工作的原因吗?
您好、
