在.bss 初始化期间使用的 newlib 中的 memset()实现效率非常低。
因此、当 RAM 中的.bss 大于~3kBytes 时、.bss 初始化时间太长、并且看门狗最初以 SMCLK=MCLK 速度运行、在我的 MSP430F5XXX 系列 MCU 上超时。 这是因为 memset()使用9个 CPU 周期(!) 内核循环中的每个字节进行编程。
作为一种权变措施、我已将一些变量移至.noinit 段、该段适用于我的用例。 但这只是一种权变措施。
由于 memset()真的不会使看门狗配置混乱(这由应用程序用户决定),因此 CRT 必须在没有 memset()的情况下实现此初始.bss 清除,并在清除的内存段太大时定期复位看门狗计时器。
此外,MSP430的正确 memset()实现每字节只需3个周期。