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.

[参考译文] MSP430-GCC-opensource:CRT .bss 初始化期间看门狗超时

Guru**** 2589275 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/948357/msp430-gcc-opensource-watchdog-timeout-during-crt-bss-initialisation

器件型号:MSP430-GCC-opensource

在.bss 初始化期间使用的 newlib 中的 memset()实现效率非常低。

因此、当 RAM 中的.bss 大于~3kBytes 时、.bss 初始化时间太长、并且看门狗最初以 SMCLK=MCLK 速度运行、在我的 MSP430F5XXX 系列 MCU 上超时。 这是因为 memset()使用9个 CPU 周期(!) 内核循环中的每个字节进行编程。

作为一种权变措施、我已将一些变量移至.noinit 段、该段适用于我的用例。 但这只是一种权变措施。

由于 memset()真的不会使看门狗配置混乱(这由应用程序用户决定),因此 CRT 必须在没有 memset()的情况下实现此初始.bss 清除,并在清除的内存段太大时定期复位看门狗计时器。

此外,MSP430的正确 memset()实现每字节只需3个周期。

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

    使用 CCS 编译器/库、用户可以定义_system_pre_init()来停止看门狗(在 C 初始化之前)。  

    我没有将 GCC 用于 MSP430、但基于此:

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/503358/1829576

    我认为该 GCC 函数的名称是__low_level_init()。 (这也是 IAR 的用途。)

    否则、也会出现这种情况、这种情况有点旧、但可能仍然适用:

    https://e2e.ti.com/support/tools/ccs/f/81/t/472090

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

    分发中包含一个文件,该文件描述了要执行的操作:./ti/gcc/examples/watchdog.txt

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

    好的。 但我永远不想保持看门狗计时器。 只需将其切换到 ACLK、而不是 SMCLK、这将产生~2-3秒的超时

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

    MSP430-GCC 用户指南的第5.3节 还详细介绍了 C 运行时库启动行为、还介绍了如何在大型.data 或.bss 段初始化之前禁用看门狗。

    库的性能优化型 memset 和 memcpy 例程的实现会积压待办事项。

    此致、

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

    抱歉。 这是一个 RTFM 肯定会有所帮助的问题,尽管我仍然认为应用程序编写人员在进入 main()之前不需要担心看门狗。 因此、我仍然认为 CRT 应该定期复位看门狗、例如在每30000 MCLK 之间

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

    没问题。

    在 CRT 库中输入禁用看门狗的代码存在一些技术限制。

    器件之间的看门狗地址可能会有所不同、因此该命令不能硬编码到所有 MSP430器件共享的库中。 我们不希望一开始包含许多不同的目标特定版本的 CRT 库来解决此问题。

    我们也无法使用将由链接器解析的符号、因为用户可能不会使用 TI 提供的 MSP430-GCC 链接器脚本。

    创新的解决方案可能可以解决这些问题、但并不是优先考虑的问题。

    很不幸、因为这是一个常见的问题、但这就是为什么它现在在最新版本的用户指南中明确记录了它的原因。

    此致、

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

    [引用 user="Jozef_Lawrynowicz"]我们也无法使用链接器解析的符号,因为用户可能不会使用 TI 提供的 MSP430-GCC 链接器脚本。

    这是足够公平的。

    CRT 是否已经对链接器脚本做出假设? 例如、需要用户定义的链接器脚本来定义诸如"_stack"等符号 就个人而言、我尝试将工具链提供的链接器脚本视为不可更改的脚本、在覆盖这些脚本时、我确实使用 GNU 链接器脚本的"include"指令将其包括在内。

    [引用 user="Jozef_Lawrynowicz"]在输入代码以禁用 CRT 库中的看门狗方面存在一些技术限制。

    我认为像这里经常建议的那样、完全禁用看门狗是有害的。 它应该继续运行、并且只能由启动软件定期复位。 这样、如果 CRT 初始化期间的干扰导致 MSP 处于未定义状态、则恢复的机会会更好。 正如我已经说过的,当用户无法修改 memcpy()时,他可以增加看门狗超时,但设备仍会恢复。

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

    几个月前、RTFM 不会提供帮助、因为这是该手册的第一个修订版、其中包含了这些信息。 逾期未交的加法。