经验教训 | STM32 异常之BFARVALID,PRECISERR,INVSTATE
最近有一个项目基于STM32F446ZE MCU使用FREERTOS操作系统开发,之前有部分功能代码是基于MCU裸机开发的,移植过程种发现程序老出错,DEBUG模式条件发现程序停在了HardFault_Handler中断服务程序中:
查看对应的错误报告显示BFARVALID和PRECISERR错:
查看了两个错误的对应说明(感觉还是不知道是什么原因):
通过将任务逐个屏蔽,然后代码块逐个屏蔽方式最终定位到了一下函数,函数中对一个结构体对像进行了赋值操作后就会触发该错误,这些代码都是之前要无FREERTOS时运行好好的,现在就会出现这个错:
思考好久,可以是任务堆栈太小导致,于试偿试将任务堆栈从128增加到512,
编译下载运行OK,果然不再出错了。
长了教训!记录一下问题分析过程,也为后续类似的问题提供思路。
顺便记录了一下在调试过程中遇到的另一个硬件错INVSTATE,对应的解释如下,
我是因为数组越界超作也产生该错误,如下图,当message->len > 8 时,如果没有下面红框中的长度限制,就有可能在memcpy函数中引起数组越界产生INVSTATE硬件错!