记录一个ESP32 S3/P4 上奇怪的问题

最终请教天杀先生,他查看生成的代码发现 for 循环被生成为一个死循环。

编译期出现这个动作的原因是,前面 uint8_t WriteData() {} 定义是一个函数,但是却没有返回值。按照 C++规则,执行流如果达到了非 void 函数的末尾却没有返回值,就属于 Undefined Behavior(未定义行为)。一旦触发 UB ,编译器就有权做任何它认为合适的事情—包括把函数当成永不返回的死循环来处理。在 Xtensa gcc 中,优化器会试图推断“落空的return ”到底应该怎么处理。结果就是在反汇编里看到的那段“自跳”循环。

解决方法:函数加上返回值,或者声明为 void WriteData() {}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注