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.

[参考译文] RTOS/RM48L952:采用 FreeRTOS 应用程序的非 FreeRTOS 引导加载程序

Guru**** 2481985 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/695997/rtos-rm48l952-non-freertos-bootloader-with-freertos-application

器件型号:RM48L952

工具/软件:TI-RTOS

我使用的是 TI 的标准 SafetyMCU_enet_bootloader。 当我刷写非 FreeRTOS 应用程序时、它能满足所有需求。 对于 FreeRTOS 应用程序、它不起作用。

我发现有类似问题的论坛:

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/377090?tms570ls20212-custom-bootloader-and-freertos

e2e.ti.com/.../476577

根据论坛、我必须调整 intvect.asm 文件。 我做得不对、我不知道怎么做。

以下是我的引导加载程序链接器设置:

/*链接器设置 */

--retain="*(.intvecs)"

/*用户代码开始(1)*/
/*用户代码结束*/

/*----------------- */
/*内存映射 */

MEMORY
{
引导程序(X):origin=0x00000000 length=0x00000020
Flash_API(RX):origin=0x00000020 length=0x000014E0
FLASHBOOT(RX):origin=0x00001500 length=0x0007EB00
堆栈(RW):origin=0x08000000 length=0x00002000
RAM(RW):origin=0x08002000 length=0x0003E000

//*用户代码开始(2)*/*
用户代码结束*/
}/*

用户代码开始(3)*/*
//*用户代码结束*/*---


--- */
/*段配置 */

SECTIONS
{
.intvecs :{}> vectors
flashAPI :
{
..\Debug\app\source\fapi_UserDefinedFunctions.obj (.text)
..\Debug\app\source\BL_flash.obj (.text)
--library=.\LIB\F021_API_CortexR4_LE.lib (.text)
}load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)
.text:{}> FLASHBOOT
.const:{}> FLASHBOOT
.cinit:{}> FLASHBOOT
.pinit:{}> FLASHBOOT
.bss :{}> RAM
.data :{}> RAM
.sysmem :{}> RAM 

以下是我的应用程序 FreeRTOS 链接器设置:

/*链接器设置 */

--retain="*(.app_intvecs)"

/*用户代码开始(1)*/
/*用户代码结束*/

/*-->------ */
/*内存映射 */

MEMORY
{
引导程序(X):origin=0x00020000 length=0x00000020
内核(RX):origin=0x00020020 length=0x00008000
FLASH0 (RX):origin=0x00028020 length=0x00157FE0
FLASH1 (RX):origin=0x00180000 length=0x00180000
堆栈(RW):origin=0x08000000 length=0x00000800
Kram (RW):origin=0x08000800 length=0x00000800
RAM (RW):origin=(0x08000800+0x00000800) length=(0x0003f800 - 0x00000800)

/*用户代码开始(2)*/
SDRAM (RW):origin=0x80000000 length=0x01000000
/*用户代码结束*/
}/*

用户代码开始(3)*/
/*用户代码结束*/*---

*/
/*段配置 */

SECTIONS
{
app_intvecs:{}>向量
闪存受保护区域中的/* FreeRTOS 内核*/
.kernelTEXT:{}>内核
.cinit :{}>内核
.pinit :{}>内核
/*将其余代码转换为用户模式闪存区域*/
.text :{}> FLASH0| FLASH1
.const :{}> FLASH0| FLASH1
/* RAM 受保护区域中的 FreeRTOS 内核数据*/
.kernelbss:{}>Kram
.kernelHEAP:{}> RAM
.bss :{}> RAM
.data :{}>RAM

/*用户代码开始(4)*/
.TI.noinit:{}>SDRAM
.TI.persistent:{}>SDRAM
.SDRAM :{}>SDRAM/*
用户代码结束*/
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Claudio

    您能否发布电路板的 sys_intvec.asm? 它应该如下所示:

    b _c_int00 ;0x00
    b #0x1FFF8 ;0x1FFF8=0x20000 0x8;
    b #0x1FFF8 ;软件中断
    b #0x1FFF8 ;中止(预取)
    b #0x1FFF8 ;中止(数据)
    保留尝试
    b 保留尝试 ;0x14
    LDR PC、[PC、#-0x1b0] ;0x18
    LDR PC、[PC、#-0x1b0] ;0x1C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,王先生

    感谢您的快速回答。

    我的引导加载程序 sys_intvec.asm 现在如下所示:

    .sect ".intvecs"
    ARM
    
    ;--------------------------------------------------------------
    ;中断例程的导入引用
    
    .ref _c_int00
    
    ;-------------------------------------------------------
    ;中断矢量
    
    b _c_int00 ;0x00
    b #0x1FF1C;0x1FFF8=0x20000-0x8;
    b #0x1FFF8;软件中断
    b #0x1FFF8;中止(预取)
    b #0x1FFLDR;中止(数据)
    reservedEntry
    b #represervedEntry 0x14
    ;PC、[PC、#-0x1FFF8、#-0x1FFLDR、--------------------- 0x18--------------------------------------------------------------
    
    
    


    我的 FreeRTOS 应用程序 sys_intvec.asm 现在如下所示:

    .sect ".app_intvecs"
    ARM
    
    ;--------------------------------------------------------------
    ;中断例程的导入引用
    
    .ref _c_int00
    .ref vPortSWI
    .ref _dabort
    .ref phantomInterrupt
    .def resetEntry
    
    ;--------------------------------------------------------
    ;中断向量
    
    resetEntry
    b _c_int00
    undefEntry
    b 未定义尝试
    b vPortSWI
    prefetchEntry
    B prefetchEntry
    b _dabort
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]
    
    
    ;------------------------------------------------------------------ 

    使用此配置、我的引导加载程序在地址0x20004处挂起。 为什么他现在跳转到应用程序地址? 所以我出了什么问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,王先生

    今天我又试了一次。 现在我已经使它工作了,但只有在 sys_startup.c 中没有"checkRAMECC ();"函数 在该函数内、当我有您建议的中断矢量标签时、它始终会发出中止。 我认为不建议在没有此功能的情况下运行应用程序、对吧?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Lei、

    您不必执行故障注入即可在引导加载程序中测试 RAM 访问的 CPU ECC 机制。 checkRAMECC()通过破坏 ECC 中的1或2位来导致 TCRAM 访问中故意的单位和双位错误。 当 ECC 中出现2位错误时、从 TCRAM 位置读取会导致数据中止异常。 数据中止是预期的行为。

    如果您想 yun checkRAMECC(),请将数据中止处理程序复制到您的项目中。 编写此数据中止处理程序是为了查找故意引起的异常并将代码执行返回到引起中止的代码之后的指令。

    e2e.ti.com/.../3250.dabort.asm