【RTOS】FreeRTOS中的任务堆栈溢出检测机制
2024-08-31 11:29:33
前言
注意:本笔记发布时可能忘记补充查看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,就不能直接判断是任务堆栈溢出的问题。
最新文章
- Flexible 弹性盒子模型之CSS flex-shrink 属性
- Struts 中 ActionContext ctx.put()把数据放到ValueStack里之数据传输背后机制:ValueStack(值栈)
- 使用paramikoHelper类实现MySQL安装和数据恢复
- MySQL重构查询的方式
- asp.net 面试基础题
- hdu4864Task(馋)
- SGI STL 内存分配方式及malloc底层实现分析
- Java Swing项目专栏之项目业务流程与业务逻辑
- 【特效】select美化
- PHP 实例 - AJAX 实时搜索
- Swift基础之侧滑Cell显示操作按钮
- CentOS 7下使用Gitolite搭建Git私服
- 协程 及 libco 介绍
- kali linux android木马(内网+外网)
- Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信
- jedis常用API
- php 5.0 新字符串
- HDOJ1003
- react-music React全家桶项目,精品之作!
- Rundeck概况
热门文章
- java 适配器模式实现代码
- Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)
- R 语言实战-Part 4 笔记
- R语言与医学统计图形-【34】绘制统计表格
- 金蝶EAS——我的EAS报销流程怎么能让另一个人看到呢?即如何设置流程传阅功能?设置“代理报销”
- TCP三次握手与Linux的TCP内核参数优化
- 框架学习-MyBatis(01)
- 使用clion阅读eos源码
- HashMap有几种遍历方法?推荐使用哪种?
- day03 Django目录结构与reques对象方法