freertos系统栈溢出检测机制简述

2023-05-16

FreeRTOS 提供了多种特性来辅助跟踪调试栈相关的问题。

uxTaskGetStackHighWaterMark()函数

每个任务都独立维护自己的栈空间,栈空间总量在任务创建时进行设定。
uxTaskGetStackHighWaterMark() 主要用来查询指定任务的运行历史中,其栈空间还差
多少就要溢出。这个值被称为栈空间的”高水线(High Water Mark)”。

uxTaskGetStackHighWaterMark() API 函数原型如下:

unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask);
参数名描述
xTask被查询任务的句柄——欲知如何获得任务句柄,详情请参见 API 函数xTaskCreate()的参数 pxCreatedTask。如果传入 NULL 句柄,则任务查询的是自身栈空间的高水线
返回值任务栈空间的实际使用量会随着任务执行和中断处理过程上下浮动。uxTaskGetStackHighWaterMark()返回从任务启动执行开始的运行历史中,栈空间具有的最小剩余量。这个值即是栈空间使用达到最深时的剩下的未使用的栈空间。这个值越是接近 0,则这个任务就越是离栈溢出不远了。

运行时栈侦测

概述

FreeRTOS 包含两种运行时栈侦测机制,由 FreeRTOSConfig.h 中的配置常量
configCHECK_FOR_STACK_OVERFLOW 进行控制。这两种方式都会增加上下切换开销

栈溢出钩子函数(或称回调函数)由内核在侦测到栈溢出时调用。要使用栈溢出钩子函数,需要进行以下配置:

  • 在 FreeRTOSConfig.h 中把 configCHECK_FOR_STACK_OVERFLOW 设为 1 或 2。
  • 提供钩子函数的具体实现,采用如下的函数名和函数原型。
 void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
  1. 栈溢出钩子函数只是为了使跟踪调试栈空间错误更容易,而无法在栈溢出时对其进
    行恢复。函数的入口参数传入了任务句柄和任务名,但任务名很可能在溢出时已经遭到
    破坏。
  2. 栈溢出钩子函数还可以在中断的上下文中进行调用。
  3. 某些微控制器在检测到内存访问错误时会产生错误异常,很可能在内核调用栈溢出
    钩子函数之前就触发了错误异常中断

运行时栈侦测方法

方法1

当 configCHECK_FOR_STACK_OVERFLOW 设置为 1 时选用方法 1。

任务被交换出去的时候,该任务的整个上下文被保存到它自己的栈空间中。这时任 务栈的使用应当达到了一个峰值。当configCHECK_FOR_STACK_OVERFLOW 设为 1时,内核会在任务上下文保存后检查栈指针是否还指向有效栈空间。 一旦检测到栈指 针的指向已经超出任务栈的有效范围,栈溢出钩子函数就会被调用。

方法 1 具有较快的执行速度,但栈溢出有可能发生在两次上下文保存之间,这种情
况不会被侦测到。

方法2

将 configCHECK_FOR_STACK_OVERFLOW 设为 2 就可以选用方法 2。方法 2
在方法 1 的基础上进行了一些补充。

当创建任务时,任务栈空间中就预置了一个标记。方法 2 会检查任务栈的最后 20 个字节,查看预置在这里的标记数据是否被覆盖。如果最后20 个字节的标记数据与预 设值不同,则栈溢出钩子函数就会被调用。

方法 2 没有方法 1 的执行速度快,但测试仅仅 20 个字节相对来说也是很快的。这
种方法应该可以侦测到任何时候发生的栈溢出,虽然理论上还是有可能漏掉一些情况,
但这些情况几乎是不可能发生的。

局限性

无论方法1、方法2都是在任务进行切换时执行,存在局限性:

  • 任务执行的过程中出现过栈溢出,但任务切换前栈指针又恢复到了正常水平(方法1)
  • 任务栈末尾的 16 个字节没有用到,即不会被修改,但是任务栈已经溢出了(方法2)
  • 任务栈溢出后,把系统中的重要数据修改了导致系统直接进入Hardfault(方法1、2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freertos系统栈溢出检测机制简述 的相关文章

  • 如何把 ubuntu 16.04.7 命令行界面下的系统语言更改为中文?

    如果你的 ubuntu 16 04 7 系统在命令行下的默认语言是英文 xff0c 比如下面这样 xff1a 怎么更改才能让某些输出单词显示成中文呢 xff1f 可以修改 etc default locale 这个文件 xff0c 先看一下
  • 小程序云开发实现订阅消息

    链接 简书博主示例 xff1a https www jianshu com p d90f22dac001 官方文档 xff1a 官方文档1 文档2 云调用 使用方法demo 假如这是一个点餐系统 xff0c 想让顾客下单以后 xff0c 派
  • ue4 常见问题解答

    1 如何让客户端自动连接服务器 span style color 0000aa MyGame span span style color 000066 span span style color 000066 exe span span s
  • Freertos代码之互斥信号量

    信号量用于限制对共享资源的访问和多任务之间的同步 三个信号量API函数都是宏 xff0c 使用现有的队列实现 使用例子 typedef void QueueHandle t typedef QueueHandle t SemaphoreHa
  • C语言冒泡排序和快速排序的思想和实现

    冒泡排序 基本思想 对有n个记录的序列进行冒泡排序 xff0c 首先将第一个数字与第二个数字进行比较 xff0c 若为逆序 xff0c 则将两个数字的顺序交换 然后比较第二个数字与第三个数字 xff0c 若为逆序 xff0c 则将两个数字的
  • CVPR2023最新论文 (含语义分割、扩散模型、多模态、预训练、MAE等方向)

    CVPR2023论文最新速递 xff01 含分割 VIT 点云等多个方向 2023 年 2 月 28 日凌晨 xff0c CVPR 2023 顶会论文接收结果出炉 xff01 CVPR 2023 收录的工作中 34 扩散模型 多模态 预训练
  • 【Hadoop基础教程】6、Hadoop之单表关联查询

    本blog主要通过输入文件中的child字段和parent字段进行单表关联查询 xff0c 推导出哪些用户具有child与grandparent关系 开发环境 硬件环境 xff1a Centos 6 5 服务器4台 xff08 一台为Mas
  • 自己完成一个简单的mapreduce程序

    hdfs上的数据源 search txt 我们这里依然使用讲解hive案例的那个数据源 xff0c 通过把hive执行的结果与我们自己写的mapreduce的结果作比较 xff0c 来验证是否编码正确 xff0c 以及能否正确理解mapre
  • ubuntu安装Beyond Compare 4 并破解

    1 官网下载 http www scootersoftware com download php ubuntu选择Linux下的Debian xff0c 32还是64位根据自己的系统下载 2 安装 sudo dpkg i 安装包 deb 3
  • Android部分监听器使用方法总结(一)之OnCLickListener

    ps 写在之前 1 小弟是以为android初学者 xff0c 在学习过程中遇到过一些新手都会遇到的问题 xff0c 希望能借助CSDN这个平台和各位前辈大牛已经同是菜鸟的同学们交流 这也是小弟第一次写博客 xff0c 名副其实的处女座吧
  • Welcome to Xiao

    Welcome to Xiao Hello Everyone xff01 这是我第一次使用 Markdown编辑器 所展示的欢迎页
  • QT_地图导航

    QT 地图导航 代码已经更新 xff1a http www cnblogs com douzujun p 6272667 html 1 地图显示功能 2 ifndef MAPWIDGET H 3 define MAPWIDGET H 4 5
  • 深度学习目标检测2013-2018单双阶段主流模型概览及详解

    背景 xff1a 深度学习引入目标检测领域以来 xff0c 给目标检测领域带来了很多突破性的进展 xff0c 文章 Deep Learning for Generic Object Detection A Survey 由香港中文大 国防科
  • NMS

    NMS 非极大值抑制 def NMS dects threshold dects x1 y1 x2 y2 score x1 61 dects 0 y1 61 dects 1 x2 61 dects 2 y2 61 dects 3 score
  • 我的2014点点滴

    我的2014点点滴 毕业篇 经历了6 43 3 43 3 43 4 43 2 5 61 18 5年的学校生活 xff0c 终于研究生毕业啦 xff01 2014年4月2日 xff0c 赶一晚上的火车 xff0c 回到了母校 xff0c 去领
  • OpenCV小例程——火焰检测(完整代码)

    火焰检测小程序 前几天 xff0c 偶然看到了An Early Fire Detection Method Based on Image Processing The Author is Thou Ho Chao Ho Chen Ping
  • “认知反映测试”——衡量一个人是“在短暂的思考后迅速解决问题”还是“通过一段长反射弧深思熟虑后再做决定”

    认知反映测试 衡量一个人是 在短暂的思考后迅速解决问题 还是 通过一段长反射弧深思熟虑后再做决定 有三个问题 xff1a 1 一副球拍和球成本1 10美元 球拍比球成本高1 00美元 问球多少美元 xff1f 2 如果五台机器生产五个零件需
  • 【选择排序的稳定版本与非稳定版本】

    选择排序 非稳定版本与稳定版本 排序过程中选择一个比较大 xff08 大到小排序 xff09 的数 xff0c 然后把它放到数组中指定的位置 xff1b 这时候可以直接与数组中指定位置交换数据 xff0c 但是可能会导致同值的数据的顺序发生
  • 机器人路径规划_人工势场法

    机器人路径规划 人工势场法 原理 人工势场法是由Khatib提出的一种虚拟力法 原理是 xff1a 将机器人在环境中的运动视为一种机器人在虚拟的人工受力场的运动 障碍物对机器人产生斥力 xff0c 目标点对机器人产生引力 xff0c 引力和
  • python中调用 imread 报错: ImportError: cannot import name imread

    现象 xff1a from scipy misc import imread imresize 报错 提示错误 ImportError cannot import name imread 但是import scipy的时候 显示正确 解决方

随机推荐

  • 改变python的默认路径为当前的工作路径

    改变python的默认路径为当前的工作路径 通过os模块来进行python中路径的更改 默认路径为 xff1a span class hljs prompt gt gt gt span span class hljs keyword imp
  • 无人驾驶技术——无人车的感官(激光雷达,雷达,摄像机)

    文章目录 激光雷达LIDAR什么是LIDARLIDAR原理LIDAR优点LIDAR缺点Velodyne激光雷达传感器HDL64每秒大约收集多少点 xff1f 雷达 RADARRADAR工作原理RADAR优点RADAR缺点 激光雷达 xff0
  • 机器学习——KNN

    机器学习算法 KNN KNN算法和KD Tree 思维导图
  • MATLAB:执行程序时调用bin文件夹下的.m文件,却显示找不到该文件

    在运行程序时 xff0c 明明要被调用的函数脚本就在当前文件夹bin 下面 xff0c 但是程序出错找不到对应的文件 xff0c 经过查询发现 xff1a 在命令行窗口输入 xff1a rehash toolboxcache 即可
  • 什么是定时器计数器

    定时器 计数器实际就是加1计数器 1 定时器和计数器的区别 xff1a 区别很小 xff0c 本质上都是计数器 xff0c 但定时器只是计数固定周期的脉冲 xff0c 所以根据频率可以计算出准确的时间 定时器模式 xff1a 对内部机器周期
  • 面试中问到动态库和静态库相关知识

    1 动态库相比较于静态库的优缺点 xff1f 动态库优点 xff1a 节省内存和代码重用 xff0c 当应用程序使用动态链接库时 xff0c 多个应用程序可以共享磁盘上的DLL xff08 windows xff09 和so linux 副
  • 【c++语法大全】

    C 43 43 基础入门 xff08 转载自黑马程序员 xff09 1 C 43 43 初识 1 1 第一个C 43 43 程序 编写一个C 43 43 程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1 1 1 创建项目 Visu
  • Ubuntu20.04 USB网卡驱动安装 - MT7601u

    型号 xff1a TL WN725N 1 0 免驱版 芯片 xff1a MT7601u 具体型号可使用 96 lsusb 96 命令查看 确认型号为mt7601u后 执行如下命令 sudo apt install git build ess
  • 【浅谈插入排序】

    浅谈插入排序 插入排序 xff0c 是把无序数列中的数一个个插入到有序数列中 xff0c 直到无序数列没有数为止 比如有这么一个数列 xff1a 2 4 6 1 3 5 14 2 0 10 一共有10个数 xff0c 我们可以把第一个数当做
  • Meta Learning(元学习)详解

    元学习 概述基本概念基本分类 基本流程模型结构 概述 元学习 xff08 Meta Learing xff09 的提出是针对传统神经网络 模型的泛化性能不足 对信种类任务适应性较差的特点 主要表现为通过少量的计算和新训练数即可用于模型上实现
  • 2022 *CTF REVERSE 的 NaCl

    2022 CTF REVERSE 的 NaCl 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff1a 照例扔入虚拟机中运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码 xff0c
  • python编码问题的一点笔记

    Python编码 xff1a 中文乱码问题 xff1a 如果开头不声明保存编码的格式是什么 xff0c 那么它会默认使用 ASCII 码保存文件 这时如果你的代码中有中文就会出错了 xff0c 即使你的中文是包含在注释里面的 声明中文编码格
  • 对 IDA 结构体操作的一些理解

    对 IDA 结构体操作的一些理解 前言 xff1a 刚学逆向时把 IDA pro 权威指南过了一遍 xff0c 但读得并不是很细 xff0c 满足日常使用还是没问题的 xff0c 但是对于一些细节的操作或提高效率的方法倒是没能掌握 比如 I
  • 第二届广东省大学生网络攻防大赛 pyre

    第二届广东省大学生网络攻防大赛 pyre 以前做过 pyc 逆向 xff0c 直接的 python exe 逆向还是第一次 xff1a 第一种方法 xff1a 用 pyinstxtractor py 将 exe 文件转换成 pyc 文件 用
  • 2022 年网刃杯 ez_algorithm

    2022 年网刃杯 ez algorithm 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff0c 64 位无壳 xff1a 照例运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码
  • Base-N 算法加密解密实现:

    目录 Base N 算法加密解密实现 xff1a Base64 加密解密 xff1a xff08 C 语言 python xff09 Base32 加密解密 xff1a xff08 C 语言 xff09 Base N 算法加密解密实现 xf
  • 第二届广东省大学生网络攻防大赛 simple_re

    第二届广东省大学生网络攻防大赛 simple re 流程总结 xff1a xff08 思路原文出自 JANlittle 师傅 xff09 程序将关键函数以对象元素的形式存在对象里 xff0c 然后在申请内存中搭配指针间接调用 xff0c 关
  • 解析 DES 加密算法(C语言):

    目录 解析 DES 加密算法 C语言 xff1a DES 简介 xff1a DES 算法整体流程 xff1a DES 解密 xff1a C 语言代码实现加密解密逻辑 xff1a 解析 DES 加密算法 C语言 xff1a 内容修改自博客 x
  • x64dbg 基本使用技巧

    x64dbg 基本使用技巧 最近使用 DBG 多了起来 xff0c 所以查了一些资料来学习并整理成自适应的笔记 本文摘抄自 xff1a x64dbg 使用技巧与实用插件合集 官方网站 xff1a https x64dbg com DBG 根
  • freertos系统栈溢出检测机制简述

    FreeRTOS 提供了多种特性来辅助跟踪调试栈相关的问题 uxTaskGetStackHighWaterMark 函数 每个任务都独立维护自己的栈空间 xff0c 栈空间总量在任务创建时进行设定 uxTaskGetStackHighWat