This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:链接器脚本错误

Guru**** 2380860 points
Other Parts Discussed in Thread: TMS570LC4357
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1495434/tms570lc4357-linker-script-error

器件型号:TMS570LC4357

工具/软件:

早上好、

我使用 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 无法正常工作的原因吗?

您好、