前言

注意:本笔记发布时可能忘记补充查看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. 方式 1:

    1. 开启方法:#define configCHECK_FOR_STACK_OVERFLOW 1
    2. 在任务切换是检测任务栈指针是否越界,如果越界,在任务切换的时候触发堆栈溢出钩子函数。
  2. 方式 2:

    1. 开启方法:#define configCHECK_FOR_STACK_OVERFLOW 2
    2. 在任务创建的时候将任务栈所有数据初始化为 0xA5,在任务切换时检测任务栈底 16 个字节是否都为 0xa5。

堆栈溢出钩子函数

void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName)
{
// 溢出后的操作
}

内核何时检测任务堆栈溢出

任务上下文切换的时候做检测:

  • 代码说明:因为在 FreeRTOS 源码 tasks.c 文件中可以查到 taskCHECK_FOR_STACK_OVERFLOW 在 void vTaskSwitchContext( void )函数中被调用了。
  • 滞后性:任务堆栈溢出时并不能马上检测到问题,因为任务堆栈溢出在任务上下文切换的时候才做检测。

任务堆栈溢出检测存在的局限性

根据两种方式的原理及执行任务堆栈溢出的位置得出包括但不限于以下情境会检测不到任务堆栈溢出:

  1. 任务执行的过程中出现过栈溢出,但任务切换前栈指针又恢复到了正常水平。(方式 1)

  2. 任务栈末尾的 16 个字节没有用到,即不会被修改,但是任务栈已经溢出了。(方式 2)

  3. 任务栈溢出后,把系统中的重要数据修改了导致系统直接进入 Hardfault。(方式 1、2)

    • 该方式进入了 Hardfault,就不能直接判断是任务堆栈溢出的问题。

【RTOS】FreeRTOS中的任务堆栈溢出检测机制的更多相关文章

  1. FreeRTOS 任务栈大小确定及其溢出检测

    以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的任务栈设置不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要. 局部变量,函数调 ...

  2. 【算法】main函数的堆栈溢出

    main函数的堆栈的大小默认为1mb 如果把数组int x[1000][1000]定义在main函数里 则int为4byte,8bit为1byte,1024byte为1kb,1024kb为1mb 4* ...

  3. Javascript中递归造成的堆栈溢出及解决方案

    关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...

  4. arcgis engine 中出现的内存堆栈溢出问题。

    两种解决方案: 1.循环加载mxd文档的时候出现的堆栈溢出,解决办法是每次循环结束时清空FeatureLayer,感觉并不好,但是确实可以实现功能. 2.循环调取featureclass的search ...

  5. CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】

    转自:https://yq.aliyun.com/articles/1723 摘要: 作者:王智通   CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防 ...

  6. [转] GCC 中的编译器堆栈保护技术

    以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...

  7. GCC 中的编译器堆栈保护技术

    GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...

  8. STM32堆栈溢出

    在使用STM32读取SD Card的文件时,总是会卡死在读函数那里 res = f_read(&fsrc, gbuffer, sizeof(gbuffer)-1, &br); 而且出现 ...

  9. 程序员---C语言细节7(增加两个整数溢出检测)

    主要内容:增加两个整数溢出检测 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) ...

随机推荐

  1. SpringBoot集成邮件发送

    一:简述 在日常中的工作中难免会遇到程序集成邮件发送功能.接收功能:此篇文章我将使用SpringBoot集成邮件发送功能和接收功能:若对邮件一些基本协议和发送流程不懂的请务必参考我之前写的博客或者浏览 ...

  2. [源码解析] PyTorch 分布式 Autograd (1) ---- 设计

    [源码解析] PyTorch 分布式 Autograd (1) ---- 设计 目录 [源码解析] PyTorch 分布式 Autograd (1) ---- 设计 0x00 摘要 0x01 分布式R ...

  3. Mac Maven 安装及配置

    一.下载 打开 Maven 官方下载页面:https://maven.apache.org/download.cgi#,点击下载链接即可开始下载:     以 Maven 3.8.4 为例,解压后可以 ...

  4. CF1368E Ski Accidents

    读懂题是第一要素. 考虑把点集分割为:\(A,B,C\) 首先把所有入度为\(0\)的点加入\(A\) 然后对所有入边只来自\(A\)的点加入\(B\) 然后对所有入边只来自\(B\)的点加入\(C\ ...

  5. Topcoder 12519 ScotlandYard(点对 dp+最长路)

    题面传送门 题意: 有两个人 A 和 B 玩一个游戏.游戏规则大致是这样的: 有 \(n\) 个城市和三种交通工具公交.地铁和出租车. 给出三个 \(n\times n\) 的字符矩阵 \(b,m,t ...

  6. Codeforces 639E - Bear and Paradox(二分+贪心)

    Codeforces 题目传送门 & 洛谷题目传送门 原来 jxd 作业里也有我会做的题 i 了 i 了 首先这种题目的套路就是先考虑对于一个固定的 \(c\),怎样求出得分最高的策略,而类似 ...

  7. Oracle-连接多个字段

    0.函数concat(A,B)作用:链接字符串 区别: Oracle中:CONCAT()只允许两个参数:(貌似可以内嵌) Mysql中:CONCAT()可以连接多个参数: 1.用||符号进行拼接 例子 ...

  8. Ubuntu 和 windows1下文件夹共享的指令

    第一个是通过拖拉的方式将文件放到当前的目录下面,即 mv +路径 + . 第二个是将文件放到了硬盘里面/mnt/hgfs/linusshare/里面

  9. 33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 & ...

  10. 日常Java 2021/9/20

    Java随机数 运用Java的random函数实现猜数字游戏 随机产生一个1-50之间的数字,然后让玩家猜数,猜大猜小都给出提示,猜对后游戏停止 package pingchangceshi; imp ...