工具与软件:
尊敬的 TI 专家:
我在 Jacinto HIGH (J784S4)上的 MCU 内核上运行一些裸机测试代码时观察到一些奇怪的行为、但我得出的结论是编译器会从有效的 C++源代码生成无效汇编。
附加了同一 C++文件的两个版本、以及编译器设置和生成的汇编代码。 我已在编译器版本3.2.2 LTS 和4.0.0 LTS 上验证了相同的行为。
e2e.ti.com/.../reordering_5F00_bug_5F00_v1.txte2e.ti.com/.../reordering_5F00_bug_5F00_v2.txt
编译器似乎正在尝试在 main 函数的末尾将一个最终的空无限循环与它前面的任何循环合并在一起(在第一种情况下、一个加载其他内核的循环、在第二种情况下、一个 print 语句)。
无论哪种方式、这都会导致非法行为。 在第一种情况下、最多20个内核的有界循环加载实际上是无限循环的-不生成边界检查、循环迭代到不存在的内核、导致为加载请求提供服务的 MCU1_0失败。
在第二种情况下、代码手动在函数末尾之后设置一个返回地址(MOV R14、PC 导致 PC+8在 LR (R14)中结束)、然后 nop 滑入一些随机代码(在本例中为标准库中的 atoi)、并最终损坏堆栈以至于崩溃。
您能否验证/告诉我是否会有编译器修复程序。