【RTOS】FreeRTOS中的任务堆栈溢出检测机制
前言
注意:本笔记发布时可能忘记补充查看dump方法,可使用TRACE32来查看dump时的各个任务信息,方便分析。
李柱明博客:https://www.cnblogs.com/lizhuming/p/15487221.html
任务堆栈
在 FreeRTOS 中,每个任务都拥有自己的堆栈,该堆栈的大小由创建任务时 xTaskCreate 函数的函数参数所决定。
堆栈溢出
当任务所使用的堆栈空间超出分配给它的空间时,则会发生堆栈溢出。
堆栈溢出可能修改超过合法访问地址范围外的数据,严重时会导致 Hardfault 令系统崩溃。
任务堆栈溢出检测机制
API
在 FreeRTOS 中,也提供了一些 API 函数用来检测任务堆栈的使用情况:
uxTaskGetStackHighWaterMark (TaskHandle_t xTask);:- 返回自任务运行以来剩余可用堆栈空间的最小值。
- 开启方法:在 FreeRTOSConfig.h 头文件中使能宏:
#define INCLUDE_uxTaskGetStackHighWaterMark 1
两种堆栈溢出检测方式
方式 1:
- 开启方法:
#define configCHECK_FOR_STACK_OVERFLOW 1 - 在任务切换是检测任务栈指针是否越界,如果越界,在任务切换的时候触发堆栈溢出钩子函数。
- 开启方法:
方式 2:
- 开启方法:
#define configCHECK_FOR_STACK_OVERFLOW 2 - 在任务创建的时候将任务栈所有数据初始化为 0xA5,在任务切换时检测任务栈底 16 个字节是否都为 0xa5。
- 开启方法:
堆栈溢出钩子函数
void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName)
{
// 溢出后的操作
}
内核何时检测任务堆栈溢出
任务上下文切换的时候做检测:
- 代码说明:因为在 FreeRTOS 源码 tasks.c 文件中可以查到 taskCHECK_FOR_STACK_OVERFLOW 在 void vTaskSwitchContext( void )函数中被调用了。
- 滞后性:任务堆栈溢出时并不能马上检测到问题,因为任务堆栈溢出在任务上下文切换的时候才做检测。

任务堆栈溢出检测存在的局限性
根据两种方式的原理及执行任务堆栈溢出的位置得出包括但不限于以下情境会检测不到任务堆栈溢出:
任务执行的过程中出现过栈溢出,但任务切换前栈指针又恢复到了正常水平。(方式 1)
任务栈末尾的 16 个字节没有用到,即不会被修改,但是任务栈已经溢出了。(方式 2)
任务栈溢出后,把系统中的重要数据修改了导致系统直接进入 Hardfault。(方式 1、2)
- 该方式进入了 Hardfault,就不能直接判断是任务堆栈溢出的问题。
【RTOS】FreeRTOS中的任务堆栈溢出检测机制的更多相关文章
- FreeRTOS 任务栈大小确定及其溢出检测
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的任务栈设置不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要. 局部变量,函数调 ...
- 【算法】main函数的堆栈溢出
main函数的堆栈的大小默认为1mb 如果把数组int x[1000][1000]定义在main函数里 则int为4byte,8bit为1byte,1024byte为1kb,1024kb为1mb 4* ...
- Javascript中递归造成的堆栈溢出及解决方案
关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...
- arcgis engine 中出现的内存堆栈溢出问题。
两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...
- CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】
转自:https://yq.aliyun.com/articles/1723 摘要: 作者:王智通 CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防 ...
- [转] GCC 中的编译器堆栈保护技术
以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...
- GCC 中的编译器堆栈保护技术
GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...
- STM32堆栈溢出
在使用STM32读取SD Card的文件时,总是会卡死在读函数那里 res = f_read(&fsrc, gbuffer, sizeof(gbuffer)-1, &br); 而且出现 ...
- 程序员---C语言细节7(增加两个整数溢出检测)
主要内容:增加两个整数溢出检测 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) ...
随机推荐
- Atcoder Grand Contest 021 F - Trinity(dp+NTT)
Atcoder 题面传送门 & 洛谷题面传送门 首先我们考虑设 \(dp_{i,j}\) 表示对于一个 \(i\times j\) 的网格,其每行都至少有一个黑格的合法的三元组 \((A,B, ...
- 55张图吃透Nacos,妹子都能看懂!
大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第1篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得 ...
- 【R shiny】一些应用记录
目录 DT和downloadButton应用 downloadButton 中验证结果输出 添加进度条 如何确保仅在使用Shiny按下操作按钮时才触发操作 其他 DT和downloadButton应用 ...
- 毕业设计之mysql+主从复制+keepalived
环境介绍 mysql_VIP:192.168.111.123 mysql_M!:192.168.111.151 mysql_M2:192.168.111.152 安装mysql可以查看 两个数据库都需 ...
- Redis篇:单线程I/O模型
关注公众号,一起交流,微信搜一搜: 潜行前行 redis 单线程 I/O 多路复用模型 纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别.因此 redis 进 ...
- 振鹏同学正式学习java的第一天!
一.今日收获 1.最棒的莫过于运行Java的HelloWorld! 2.在同学的帮助下历经坎坷困苦安装完成了Eclipse软件并设置好环境变量. 3.最最最开始了解了Java的前世今生,编程语言发展的 ...
- Yarn的Tool接口案例
目录 Yarn的Tool接口案例 Tool接口环境准备 1 新建Maven项目YarnDemo 编写代码 打包jar上传到集群 Yarn的Tool接口案例 Tool接口环境准备 之前写wordcoun ...
- linux "/tmp/crontab.14QJ49":1: bad minute errors in crontab file, can't install" 错误
目录 报错及原因 crontab语句格式 报错及原因 这个错误的原因是crontab格式错误 "/tmp/crontab.sdXvj4":5: bad minute errors ...
- 【MPI环境配置】 vs2019配置MPI环境
MPI 即 Message-Passing Interface,提供了一系列并行编程的接口,为了在本机能够学习和使用并行编程,需要提前安装MPI; 配置环境: Microsoft Visual Stu ...
- Android 高级UI组件(三)
一.popupWindow 1.AlertDialog和PopupWindow最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManage ...