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.

[参考译文] TM4C1294NCPDT:FreeRTOS 应用程序链接到在非零地址运行

Guru**** 2524370 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1312563/tm4c1294ncpdt-freertos-app-linked-to-run-at-non-zero-address

器件型号:TM4C1294NCPDT

在更改 APP_BASE 位置后、在调试已经在运行的 FreeRTOS 应用程序时遇到问题。   调试器不会运行到符号"main"、它只是挂起。  但是、在取消选择 Run To symbol 选项后、将在 PC = 0x0100xxxx 处平面、ROM 引导加载程序。

我已经通读了各种引导加载程序示例。  我可以调试 TI 示例 boot_deme1并验证 PC = 0x00004xxx。  运行至符号"main"并逐步执行应用程序。  为了进行比较,如果禁用 boot_deme1 Run to symbol 选项,则 PC=_c_int00_noargs()。

欣赏任何想法或技巧。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    在更改 app_base 位置后、我在调试已经在运行的 FreeRTOS 应用程序时遇到问题

    您好!

     如果您将 APP_BASE 从0x0更改为非零地址、那么0x0处是什么? 通常、您在0x0处有某种类型的引导加载程序、以便它可以跳转到新的 APP_BASE 处的应用程序。 如果您在0x0处没有任何内容、那么它将不起作用。 复位后、处理器从0x0开始、期望在0x0处有一个有效的堆栈指针、在0x04处有一个有效的复位矢量。  

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

    感谢您的答复。

    那么0x0处是什么?

    闪存引导加载程序将位于0x00000000、与 我试验的引导加载程序示例类似。

    复位后,处理器从0x0开始,期望有效的堆栈指针位于0x0,而有效的复位向量位于0x04。

    我懂了。  您能解释一下我为什么能够 使用调试器加载 TI 示例 boot_deme1吗?  (注意程序地址为0x00000000)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能解释为什么我能够 使用调试器加载 TI 示例 boot_demo1吗?  (注释编程为0x00000000)

    这更多是一个调试器(例如 CCS)、它在您首次加载 boot_deme1后强制 PC (程序计数器)进入 main ()。 有关详细说明、CCS 团队可以比我更好地回答、因为我可能对 CCS 如何操控 PC 不正确。 我知道、如果0x0处没有任何内容、那么无论在 CCS 内还是使用外部复位引脚、只要你进行复位、它就不会工作。 如前所述、如果0x0和0x4处无任何内容、处理器不知道如何处理代码执行。 请确保您在0x0处有一个引导加载程序。 我建议您运行库存示例:boot_serial (引导加载程序)和 boot_deme1 (示例应用程序)、以了解 TivaWare 引导加载程序的工作原理、尽管这是一种没有 RTOS 的裸机实现。 如果您查看 boot_demo1.cmd 文件中的 app_BASE、boot_serial 将位于0x0、boot_demo1将位于0x4000。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您运行常用示例:boot_serial (bootloader)和 boot_deme1 (示例应用)以了解 TivaWare bootloader 的工作原理

    好的、 我处理过几个引导加载程序示例。  TI boot_xxxxx 以及 Chester Gillon 的一个很好的示例<https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1024278/tm4c1294ncpdt-rtos-bios-not-working/3787593#3787593>  Chester 的示例非常接近我的想法。

    我能够调试来自 TI 和 Chester Gillon 的两个应用示例。  TI 工具在链接器 blah_blah.cmd 文件中定义的给定地址加载应用。  例如 FLASH (RX):origin = 0xXXXXXXXX,其中 0xXXXXXXXX != 0x00000000。

    我可以开始调试其中一个 TI FreeRTOS 示例(ssi_simple_xfer)、但 当其试图 从 NVIC_NVIC_VTABLE 中加载矢量表和栈指针地址时、portasm.asm 函数 vStartFirstTask 发生崩溃 。  这 是因为 NVIC_NVIC_VTABLE 寄存器为0x00000000。   

    就像

    如果0x0和0x4处没有任何内容,处理器不知道如何处理代码执行。

    临时权变措施:  为了进行测试、我手动 设置  NVIC_NVIC_VTABLE =链接器.cmd 文件中的 app 位置、这样就会开始!  

    FreeRTOS 的 vPortStartFirstTask 从向量表加载栈指针。  

    作为参考、  在启动时、boot_demo1和 TI RTOS boot.asm 似乎都没有引用 NVIC_VTABLE。
    TI RTOS boot.asm 从符号 c_stack 加载栈指针。  它还通过符号 c_reset 参考复位向量。