收藏官网首页
查看: 1603|回复: 0

[经验分享] 利用freertos回调函数监测堆栈溢出

106

主题

107

帖子

7261

积分

论坛元老

Rank: 8Rank: 8

积分
7261
跳转到指定楼层
楼主
 楼主| 发表于 2023-8-4 18:11:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
    我们编写的程序,堆栈溢出并不能完全避免,某些特定的情况下,程序可能会发生堆栈溢出,溢出内存覆写了重要的内存区域可能导致我们整个设备死机或者程序作出一些不可预测的行为。
为了保障程序正常运行,堆栈监测和对溢出及时采取行动是必要的,刚好freertos就有为我们提供了一个api,可以在堆栈溢出时自动调用,我们可以使用vApplicationStackOverflowHook()这个回调函数或者称钩子函数得知发生了堆栈溢出,并及时采取行动,例如挂起任务。
首先,我们要在cubemx里开启堆栈溢出检测功能

这里有两个选项,选项1是检测堆栈的指针是否指向了分配堆栈外的内存 选项2是分配堆栈的时候为堆栈赋一个初始值,后续监测堆栈末尾20个字节的数据是否被修改来判断是否发生溢出。这里我选择选项2,选项2靠谱一点,选项1只是检测指针的位置,有可能在某一时刻溢出后又跳回未溢出的地址,那么就检测不到了。
接下来,我们打开user组里的freertos.c文件,编写具体溢出的时候要执行的代码,使用printf注意包含头文件stdio.h

回调函数freertos已经帮我们写好了,我们剩下的是实现里面的功能,这里我使用printf通过串口输出溢出的任务名,并且挂起任务。
然后,我们手动为任务分配一个较小的堆栈,来测试具体的情况。

最后,通过串口查看输出信息。

可以看到,堆栈溢出后输出任务名称并且任务被挂起。其实这时其他任务还是可以运行的,假设溢出的内存并没有覆写重要的区域。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表