利用freertos回调函数监测堆栈溢出
我们编写的程序,堆栈溢出并不能完全避免,某些特定的情况下,程序可能会发生堆栈溢出,溢出内存覆写了重要的内存区域可能导致我们整个设备死机或者程序作出一些不可预测的行为。为了保障程序正常运行,堆栈监测和对溢出及时采取行动是必要的,刚好freertos就有为我们提供了一个api,可以在堆栈溢出时自动调用,我们可以使用vApplicationStackOverflowHook()这个回调函数或者称钩子函数得知发生了堆栈溢出,并及时采取行动,例如挂起任务。
首先,我们要在cubemx里开启堆栈溢出检测功能
这里有两个选项,选项1是检测堆栈的指针是否指向了分配堆栈外的内存 选项2是分配堆栈的时候为堆栈赋一个初始值,后续监测堆栈末尾20个字节的数据是否被修改来判断是否发生溢出。这里我选择选项2,选项2靠谱一点,选项1只是检测指针的位置,有可能在某一时刻溢出后又跳回未溢出的地址,那么就检测不到了。
接下来,我们打开user组里的freertos.c文件,编写具体溢出的时候要执行的代码,使用printf注意包含头文件stdio.h
回调函数freertos已经帮我们写好了,我们剩下的是实现里面的功能,这里我使用printf通过串口输出溢出的任务名,并且挂起任务。
然后,我们手动为任务分配一个较小的堆栈,来测试具体的情况。
最后,通过串口查看输出信息。
可以看到,堆栈溢出后输出任务名称并且任务被挂起。其实这时其他任务还是可以运行的,假设溢出的内存并没有覆写重要的区域。
页:
[1]