YM

Back

如果在 STM32CubeIDE 环境下使用 C++ 开发 STM32 程序,需要用到异常捕获功能的话,使用默认的编译器设置会遇到编译不通过的问题(编译器报错 error: exception handling disabled, use '-fexceptions' to enable)。这时需要对默认的设置作一些修改即可正常使用异常捕获功能。如果不是使用 STM32CudeIDE 来开发,也可以作为参考。

首先需要在 Properties 的 MCU G++ Compiler 中取消勾选 Disable handling exceptions (-fno exceptions)以启用关于异常代码的编译。要记得不同的配置都要取消勾选,避免 Debug 配置取消勾选了但是 Release 配置还是勾上的情况。

编译器选项

通常来说做完了上述步骤之后,编译关于异常的代码都不会报错了,但是实际跑起来的时候其实是不能捕获到任何异常的,一旦 throw 异常的话,单片机程序最终会跑到 _exit() 函数。

造成这种情况的原因是链接器的 flags 中包含了 --specs=nano.specs 这个选项,需要将这个 flag 去掉。但是去掉之后会大幅增加编译后的程序体积,如果使用 STM32CubeIDE 自带的 GNU Tools for STM32 工具链的话,可以考虑将其替换为 --specs=nano_c_standard_cpp.specs

在 STM32CubeIDE 中的具体操作是:进入 Properties 中的 MCU Settings,找到 Runtime library,修改其值为 Standard C, standard C++ 或者 Reduced C, standard C++ (—specs=nano_c_standard_cpp.specs)。最后点击保存即可。

链接器选项

完成了上面两部分操作之后,STM32 单片机即可正常执行异常捕获的代码了。但是启用异常捕获代码的代价是编译出来的程序占用 FLASH 极大。

在 STM32 中启用 C++ 的异常捕获
https://yanming.link/blog/enable-exception-handling-in-cpp-in-stm32
Author YM
Published at December 21, 2022