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.

[参考译文] CCS/TM4C123BH6ZRB:CCS 无法使用位于0x0的自定义 UART 引导加载程序调试主应用。

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/780313/ccs-tm4c123bh6zrb-ccs-cannot-debug-main-application-with-custom-uart-bootloader-at-0x0

器件型号:TM4C123BH6ZRB
主题中讨论的其他器件:TM4C123DK-TM4C123G

工具/软件:Code Composer Studio

您好、Team CCS、

客户报告..

"此问题适用于 TM4C123的引导加载程序。 发现我们无法使用引导加载程序在0x0调试应用软件、应用软件将提升到0xc00。 不过奇怪的是、应用软件在闪存之外运行、而不使用调试器。

当 main()启用中断时,应用软件会在调试器上崩溃。 虽然在启用中断后很难判断代码的位置,但在我停止调试器后,程序计数器位于0x02FC。 Call Stack 窗口显示[_IAR_systems$MODULE + 0x2fb]。 该地址与程序计数器一致。 任何到向量表的跳转应该位于地址0xc00或更高。 由于这个错误引用了一个 IAR 符号、我找不到这个符号的信息、我们用 IAR 进行了检查。

 IAR 说他们以前看到过这个问题、建议 CPU 制造商提供的启动代码经常将 VTABLE 重置回0x0、覆盖在 IAR 链接器文件中所做的更改。 但是、看不到 TI 提供的代码在哪里执行此操作。 IAR 通过在 main()内将 VTABLE 设置回0xc00的第一项来提供了一个部分解决方案。 我们使用了 TI 提供的 CPU_RegisterWrite()函数将 VTABLE 设置回0c00。 我不确定这是最佳解决方案。 我们认为,我们需要更改 TI 提供的启动代码,以便 VTABLE 不会改回0x0。   

 IAR 建议的解决方案似乎略低于最佳解决方案。

 您以前是否见过此问题?

 我们是否已经对此有权变措施?

 源是否可用于启动功能? 如果是、在哪里?"

 谢谢、Merril

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不使用 IAR。 TI 提供的启动代码的源代码可在中找到:
    C:\ti\TivaWare_C_Series-2.1.4.178\examples\project\startup_ewarm.c

    如果应用程序代码在未连接 IAR 调试器的情况下从加电复位开始正常工作、我看不到启动代码是如何出现故障的。 IAR 工具是否支持执行系统复位(如 Code Composer Studio)? 问题可能是在运行应用程序之前需要在引导加载程序中完成一些初始化。 引导加载程序可能负责更改矢量表的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据您的上述建议、我从 ProcessorInit 开始调试引导加载程序。 但引导加载程序不是开箱即用的调试。 我收到"警告:未找到__vector_table 符号。 E_Entry 值0x200002b4与复位矢量值0x000002b4不匹配。 初始 SSP_MAIN 值:0x200005f4不确定。" 当调试器在闪存中配置为"Run to ProcessorInit"时、它不会在那里停止。 它在 RAM 中以0x200002b4的速度上升。

    无论如何、我看不到引导加载程序代码在何处"更改" VTABLE 寄存器。 实际上、引导加载程序或我的应用程序似乎都没有将 VTABLE 寄存器设置为0xc00。 它始终为0x0、直到我根据 IAR 的建议将其写入我的应用程序的 main()。 BTW、引导加载程序是 TI 的:TivaWare_C_Series-2.1.4.178/examples/boards/dk-tm4c123g/boot_serial。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    boot_serial 工程的"bl_config.h"中的"vtable_start_address"定义是否也指向地址0xC00?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我看到引导加载程序应在何处更改矢量表的起始地址。 它位于从537行开始的 BL_STARTUP_ewarm.S 中   317.不确定为什么还没有发生这种情况。 我还在看。

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

    在我的情况下、 APP_START_ADDRESS 和 VTABLE _START_ADDRESS 都是0xc00。 矢量表从闪存复制到 RAM 的位置看起来是这样的、但我看不到 VTABLE 寄存器的任何初始化。 因此、它只保留在0x0、但引导加载程序似乎应该在调用应用程序之前执行此操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用 Code Composer Studio 和 boot_serial、我看到 NVIC_VTABLE 在传输到应用程序代码之前由引导加载程序初始化。 我无法理解为什么使用 IAR 会不一样。 在您尝试调试应用程序代码时、IAR 调试器是否从应用程序入口点启动而不是从系统复位执行? 在这种情况下、引导加载程序将不会运行、并且不会初始化 NVIC_VTABLE 寄存器。 这也将解释它在没有调试器的情况下工作的原因。