FreeRtos——15、查看freeRTOS堆栈使用情况——非常重要
在使用freeRTOS做多任务的时候总是担心任务会出现Bug导致任务死机或其他异常情况这些很多都是由于堆栈分配不合理出现的问题那就要了解每个任务的堆栈使用情况。FreeRTOS 本身提供了专门的 API 来监控堆栈使用核心思路是通过查询任务控制块TCB中的堆栈信息计算已使用的堆栈空间。下面我会分步骤讲解具体实现方法。一、核心 API 介绍FreeRTOS 提供了两个关键函数来获取堆栈信息uxTaskGetStackHighWaterMark()获取任务堆栈的 “高水位线”即任务运行至今堆栈剩余空间的最小值返回值是剩余的堆栈字数32 位系统中 1 个字 4 字节。vTaskList()生成一个包含所有任务状态、优先级、堆栈使用等信息的文本列表需要开启宏配置。二、基础配置必须首先需要在FreeRTOSConfig.h中开启相关宏否则 API 无法使用/* 开启堆栈高水位线检测 */ #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 // 配合vTaskList使用 #define configGENERATE_RUN_TIME_STATS 0 // 非必需若仅看堆栈可设0三、具体实现方法方法 1单个任务堆栈查询最常用适用于针对性查看某个任务的堆栈使用情况示例代码如下#include FreeRTOS.h #include task.h // 定义任务句柄创建任务时保存 TaskHandle_t xTestTaskHandle NULL; // 测试任务函数 void vTestTask(void *pvParameters) { for(;;) { // 任务业务逻辑 vTaskDelay(pdMS_TO_TICKS(1000)); } } // 查看堆栈使用的函数可在主任务/调试任务中调用 void vCheckStackUsage(void) { // 1. 获取当前任务的堆栈高水位线 UBaseType_t uxCurrentTaskStack uxTaskGetStackHighWaterMark(NULL); // 2. 获取指定任务的堆栈高水位线需传入任务句柄 UBaseType_t uxTestTaskStack uxTaskGetStackHighWaterMark(xTestTaskHandle); // 3. 计算堆栈使用情况假设创建任务时分配了1024字的堆栈 const UBaseType_t uxTestTaskStackSize 1024; UBaseType_t uxUsedStack uxTestTaskStackSize - uxTestTaskStack; float fStackUsage (float)uxUsedStack / uxTestTaskStackSize * 100; // 打印结果需实现串口打印函数如printf printf(当前任务剩余堆栈%lu 字\r\n, uxCurrentTaskStack); printf(测试任务剩余堆栈%lu 字已使用%.1f%%\r\n, uxTestTaskStack, fStackUsage); } // 任务创建示例 void vCreateTasks(void) { xTaskCreate(vTestTask, // 任务函数 TestTask, // 任务名 1024, // 堆栈大小字 NULL, // 参数 tskIDLE_PRIORITY 1,// 优先级 xTestTaskHandle); // 任务句柄 }方法 2批量查看所有任务堆栈vTaskList适用于全局监控所有任务的状态示例代码#include FreeRTOS.h #include task.h #include stdio.h // 缓冲区需足够大建议至少1024字节 static char pcWriteBuffer[1024]; void vPrintAllTaskStack(void) { // 获取所有任务信息并写入缓冲区 vTaskList(pcWriteBuffer); // 打印任务列表格式任务名 状态 优先级 剩余堆栈 任务编号 printf(任务名\t状态\t优先级\t剩余堆栈\t任务编号\r\n); printf(----------------------------------------------------\r\n); printf(%s\r\n, pcWriteBuffer); }输出示例任务名 状态 优先级 剩余堆栈 任务编号----------------------------------------------------IDLE R 0 120 1TestTask B 1 896 2UARTTask B 2 512 3状态说明R(运行)、B(阻塞)、S(挂起)、D(删除)。四、关键注意事项堆栈单位FreeRTOS 中堆栈大小以 “字” 为单位32 位 CPU4 字节 / 字例如配置 1024 字 4096 字节。高水位线意义剩余堆栈最小值越小说明任务运行时堆栈越接近溢出建议保留至少 20% 的余量。API 调用上下文uxTaskGetStackHighWaterMark()可在任务中调用传 NULL 查当前任务也可在中断外查其他任务。vTaskList()不能在中断中调用且会暂时关闭调度器建议在低优先级任务中调用。栈溢出检测除了主动查询还可开启configCHECK_FOR_STACK_OVERFLOW1 或 2让 FreeRTOS 在检测到栈溢出时调用钩子函数vApplicationStackOverflowHook()。总结查看 FreeRTOS 堆栈的核心是使用uxTaskGetStackHighWaterMark()单任务或vTaskList()全任务需先开启configUSE_TRACE_FACILITY宏。堆栈高水位线是判断栈溢出风险的关键指标剩余值越小风险越高。批量查看任务列表时vTaskList()输出的 “剩余堆栈” 即为该任务的高水位线值可直接反映堆栈使用情况。通过以上方法你可以精准监控每个任务的堆栈使用避免栈溢出问题同时优化内存分配。

相关新闻

物联网开发全链路能力拆解:从设备端到云端的五大关键环节

物联网开发全链路能力拆解:从设备端到云端的五大关键环节

这几年做物联网定制项目,感触最深的一件事是:绝大多数客户对"物联网开发"的理解是破碎的。有人以为买个模组、写个固件、连上Wi-Fi就万事大吉;有人觉得只要找到能画PCB的硬件工程师,剩下的云端、APP、运维都能用现成平台…

2026/10/9 1:48:13 阅读更多 →
ESP32+GY-30光照传感器入门:I2C通信与Arduino实战教程

ESP32+GY-30光照传感器入门:I2C通信与Arduino实战教程

1. 项目概述:为什么我推荐从光照传感器开始玩ESP32很多朋友第一次接触ESP32,第一反应就是“我能用它做什么”。点灯太简单,做物联网又怕一步到位学不会,这时候一个“看得见反馈”的传感器项目就是最好的过渡。GY-30光照传感器就是…

2026/10/9 1:48:13 阅读更多 →
AI日报从0到1:筛选逻辑、工具链配置与90分钟生产流程

AI日报从0到1:筛选逻辑、工具链配置与90分钟生产流程

1. AI日报这个栏目到底在做什么做AI日报这件事,我从2024年底开始坚持到现在,中间断更过两次,一次是因为信息源太杂导致筛选成本失控,一次是因为写得太像新闻通稿自己都不想看。后来我把整个流程重新拆了一遍,才找到可持…

2026/10/9 1:47:12 阅读更多 →

最新新闻

Linux eBPF Security Tracer 架构深度解析:从内核 tracepoint 到用户空间检测引擎的完整设计

Linux eBPF Security Tracer 架构深度解析:从内核 tracepoint 到用户空间检测引擎的完整设计

【免费下载链接】Cybersecurity-Projects Building 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 👇 项目地址: https://git…

2026/10/9 2:15:27 阅读更多 →
Sapling 测试体系全指南:从 .t 测试到 Rust/Python 测试的编写规范

Sapling 测试体系全指南:从 .t 测试到 Rust/Python 测试的编写规范

开发工具CLI后端 【免费下载链接】sapling A Scalable, User-Friendly Source Control System. 项目地址: https://gitcode.com/gh_mirrors/sa/sapling 点击查看 免费下载 本篇技术指南围绕 Sapling(开源的可扩展、易用的源码控制系统)的测试…

2026/10/9 2:15:27 阅读更多 →
为 models.dev 设计安全的自动化 PR 审查 Agent:pr-reviewer 的职责、判定规则与实现剖析

为 models.dev 设计安全的自动化 PR 审查 Agent:pr-reviewer 的职责、判定规则与实现剖析

人工智能大模型后端前端 【免费下载链接】models.dev An open-source database of AI models. 项目地址: https://gitcode.com/gh_mirrors/mo/models.dev 点击查看 免费下载 models.dev 是一个开源的 AI 模型数据库,仓库以 AGENTS.md 作为权威的模型/Pr…

2026/10/9 2:15:27 阅读更多 →
批量域名解析提速实战:massdns + aiodns 组合拳

批量域名解析提速实战:massdns + aiodns 组合拳

前几天晚上我盯着一份三千多行的域名列表发呆,任务是把它全部解析到IP,再按网段和用途归类。刚开始天真地以为写个脚本循环调解析接口就完事了,结果跑完一等就是四十多分钟,还动不动卡住,某个域名解析超时就能让整个脚…

2026/10/9 2:15:27 阅读更多 →
Xtreme Toolkit Pro v15.3.1 在 VS2017 下 MFC 界面换肤全攻略

Xtreme Toolkit Pro v15.3.1 在 VS2017 下 MFC 界面换肤全攻略

简介:Codejock.Xtreme.Toolkit.Pro.v15.3.1完整源码包,专为VS2017开发环境重新配置,面向需要开发专业MFC界面的C开发者。包内.sln工程属性已统一修改为32位与64位VS2017工程属性,打开即可直接编译,免去手动升级工程和调…

2026/10/9 2:15:27 阅读更多 →
刷穿 LeetCode 20:有效的括号——栈 + 哈希表与栈 + ASCII 差值的双解法全解析

刷穿 LeetCode 20:有效的括号——栈 + 哈希表与栈 + ASCII 差值的双解法全解析

教程文档 【免费下载链接】LogicStack-LeetCode 公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码 项目地址: https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode 点击查看 免费下载 本文是「宫水三叶的刷题日记」系列(LogicStack-LeetCod…

2026/10/9 2:14:27 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →