我在 2 个目标上编译“相同”代码(一个飞思卡尔,一个 STM32 都带有皮质 M4)。我使用--specs=nano.specs
并且我已经将该_write
函数实现为一个空函数,这会导致整个printf
被 GCC 优化掉,-Wno-unused-function
即使-O0
在 STM32 目标上也是如此(见地图)。这很好,我想在飞思卡尔目标上重现它。
但是在飞思卡尔目标(具有相同的编译标志)上, printf 会导致硬故障。但是,如果我使用调试器(程序集步进)一步一步printf
地通过库而不会出现硬故障。简单的断点断点有时不会从任何位置命中并运行也会printf
导致硬故障(因此它不太可能是外围问题)。
到目前为止,我检查了堆栈和堆没有重叠以及其他一些牵强的反汇编。
为什么 printf 没有在 freescale 目标上优化?什么会导致库代码出现硬故障?为什么一步步调试组装就可以了?
编辑:
- 对具有相同库的两个 MCU 使用 arm-none-eabi-gcc 5.4.1。
- 我不想删除 printf,这只是能否使用它们的第一步。
- 向量表有所有 ISR 的默认弱向量,所以应该没问题
- 使用寄存器转储,错误指令似乎位于地址 4(复位向量),所以现在的新问题是:为什么芯片会复位?