FreeRTOS学习(三十一)——调试与追踪
上一节学习了FreeRTOSConfig配置知道了很多FreeRTOS功能都需要先在FreeRTOSConfig.h中开启。程序真正运行以后我们经常会遇到一些比较头疼的问题任务为什么没有运行 程序为什么突然卡死 某个任务是不是一直占着CPU 任务栈到底够不够裸机程序中我们可能通过LED或者printf()判断程序运行到了哪里。但是FreeRTOS存在多个任务仅靠这种方式有时候很难定位问题。因此本节学习几个比较实用的FreeRTOS调试方法。本节学习目标能够查看任务当前状态、剩余栈空间和Heap空间并建立一个基本的FreeRTOS问题排查思路。一、先从任务状态开始排查假设创建了三个任务LEDTask SensorTask UartTask程序运行以后发现SensorTask好像不工作了。这时首先需要知道SensorTask现在到底是什么状态FreeRTOS中的任务可能处于Running Ready Blocked Suspended例如SensorTask正在vTaskDelay( pdMS_TO_TICKS(1000) );那么它暂时不运行其实很正常因为它现在处于Blocked所以任务没有运行不一定代表程序出错。二、使用vTaskList查看任务FreeRTOS提供vTaskList();可以把当前任务的信息输出到字符串中。首先在FreeRTOSConfig.h中根据所用版本配置相关功能例如#define configUSE_TRACE_FACILITY 1以及#define configUSE_STATS_FORMATTING_FUNCTIONS 1然后定义数组char TaskInfo[512];使用vTaskList(TaskInfo); printf(%s\r\n, TaskInfo);可能得到类似结果TaskName State Priority Stack Num LEDTask B 2 100 2 SensorTask R 3 80 3 IDLE R 0 110 1这样就可以直接看到每个任务的大致运行情况。三、任务状态字母是什么意思vTaskList()输出中常见X R B S其中X ↓ Running 正在运行R ↓ Ready 就绪B ↓ Blocked 阻塞S ↓ Suspended 挂起例如LEDTask B不一定有问题。它可能正在vTaskDelay();因此正常进入了阻塞态。但如果你原本认为LEDTask应该一直运行结果发现LEDTask S那就需要检查程序中是不是执行过vTaskSuspend();四、检查任务栈FreeRTOS程序出现莫名其妙HardFault 运行一段时间死机 局部变量异常一个非常重要的检查对象就是任务栈。前面学习过uxTaskGetStackHighWaterMark();例如UBaseType_t StackRemain; StackRemain uxTaskGetStackHighWaterMark( SensorTaskHandle );然后printf( Sensor Stack %lu\r\n, (unsigned long)StackRemain );这个值表示任务运行以来栈最紧张的时候 至少还剩多少栈空间。如果这个值已经非常小2 3 4就说明任务栈已经比较危险。五、检查Heap空间如果程序在xTaskCreate();或者xQueueCreate();时创建失败就应该检查Heap是不是不够了。可以使用xPortGetFreeHeapSize();例如printf( Free Heap %lu\r\n, (unsigned long)xPortGetFreeHeapSize() );还可以查看系统运行以来最紧张时剩余的HeapxPortGetMinimumEverFreeHeapSize();例如printf( Min Heap %lu\r\n, (unsigned long) xPortGetMinimumEverFreeHeapSize() );如果Free Heap非常小就要检查任务是不是创建太多 任务栈是不是设置太大 队列是不是设置太长 configTOTAL_HEAP_SIZE是不是太小六、不要忘记检查函数返回值这是初学FreeRTOS时非常容易忽略的问题。例如xTaskCreate( LEDTask, LED, 128, NULL, 2, NULL );很多人写完以后直接不管返回值。但是xTaskCreate();本身有返回值。可以这样写BaseType_t Result; Result xTaskCreate( LEDTask, LED, 128, NULL, 2, NULL ); if(Result ! pdPASS) { printf(LED Task Create Failed\r\n); }如果Heap不足导致任务创建失败就可以马上发现。同样xQueueCreate();创建以后也应该判断if(QueueHandle NULL) { printf(Queue Create Failed\r\n); }很多所谓的任务为什么不运行实际上任务从一开始就没有创建成功。七、检查任务是不是一直占用CPU假设写了void SensorTask(void *pvParameters) { while(1) { ReadSensor(); } }这里没有vTaskDelay();也没有等待队列 等待信号量 等待任务通知那么只要它处于最高可运行优先级就可能长时间占用CPU。如果另一个低优先级任务一直得不到运行机会就要检查高优先级任务是不是缺少阻塞操作。上一节学习的运行时间统计vTaskGetRunTimeStats();也可以帮助判断到底哪个任务占用了大量CPU。八、使用断点调试除了FreeRTOS自己的调试APISTM32开发中最直接的方法仍然是ST-Link Keil / STM32CubeIDE进行断点调试。例如怀疑任务没有进入void LEDTask(void *pvParameters) { while(1) { GPIO_ToggleBits( GPIOE, GPIO_Pin_3 ); vTaskDelay( pdMS_TO_TICKS(500) ); } }可以在GPIO_ToggleBits();位置设置断点。如果程序能够进入断点任务确实运行了。如果完全进不来↓ 检查任务是否创建成功 ↓ 检查任务是否被挂起 ↓ 检查更高优先级任务是否长期占用CPU这样比盲目修改代码有效得多。九、建立固定的排查顺序以后遇到某个任务不运行可以按照下面顺序检查任务创建成功了吗 ↓ 任务现在是什么状态 ↓ 是不是被挂起了 ↓ 是不是正在正常阻塞 ↓ 高优先级任务是否一直占CPU ↓ 任务栈是否不足 ↓ Heap是否不足 ↓ 是否出现HardFault等异常不要一看到LED不亮就直接怀疑FreeRTOS调度器出问题了。很多时候只是任务没创建成功 GPIO配置错误 任务处于阻塞状态 优先级设置不合理这些普通问题。十、总结这一节学习了FreeRTOS中几个非常实用的调试方法。查看任务信息可以使用vTaskList();检查任务剩余栈uxTaskGetStackHighWaterMark();检查当前剩余HeapxPortGetFreeHeapSize();检查历史最小剩余HeapxPortGetMinimumEverFreeHeapSize();同时创建任务时不要忽略xTaskCreate()的返回值。因此以后FreeRTOS程序出现问题不要只依赖LED printf去猜。更合理的思路是先看任务状态 ↓ 再看优先级和阻塞关系 ↓ 再检查Stack和Heap ↓ 最后结合断点定位具体代码掌握这些方法以后FreeRTOS出现的很多“莫名其妙的问题”实际上都可以一步一步定位出来。

相关新闻

LRCGET 歌词批量下载实操指南:从首次安装到上千首歌一键同步

LRCGET 歌词批量下载实操指南:从首次安装到上千首歌一键同步

LRCGET 歌词批量下载实操指南:从首次安装到上千首歌一键同步 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget LRCGET 是一款为普通音乐爱好者…

2026/8/18 21:01:36 阅读更多 →
基于SpringBoot的校园二手交易平台系统(源码+文档+部署+讲解)

基于SpringBoot的校园二手交易平台系统(源码+文档+部署+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/18 21:01:36 阅读更多 →
如何在 ComfyUI ControlNet Aux 中用好 Depth Anything V2:深度估计预处理器的完整实现指南

如何在 ComfyUI ControlNet Aux 中用好 Depth Anything V2:深度估计预处理器的完整实现指南

如何在 ComfyUI ControlNet Aux 中用好 Depth Anything V2:深度估计预处理器的完整实现指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 一…

2026/8/18 21:01:35 阅读更多 →

最新新闻

Claude Code高效使用指南:Token与会话管理实战技巧

Claude Code高效使用指南:Token与会话管理实战技巧

在开发过程中,你是否遇到过这样的场景:向 Claude Code 提出一个复杂的代码重构需求,结果它只回复了一半就戛然而止,提示“上下文已满”;或者,你精心构思了一个多步骤的调试请求,得到的回复却偏离…

2026/8/18 21:41:04 阅读更多 →
容器镜像安全加固,先从一个可运行镜像开始

容器镜像安全加固,先从一个可运行镜像开始

容器镜像安全加固,先从一个可运行镜像开始 $ trivy image --severity HIGH,CRITICAL web-app:v1.4.2 web-app:v1.4.2 (debian 11.6)Total: 42 (HIGH: 35, CRITICAL: 7)┌────────────────┬────────────────┬──────────…

2026/8/18 21:41:04 阅读更多 →
LLM Agent记忆版本管理:ChronoMem架构与语义回滚实践

LLM Agent记忆版本管理:ChronoMem架构与语义回滚实践

1. 从“健忘”到“可控”:为什么Agent需要记忆版本管理? 最近在折腾LLM智能体(Agent)项目时,我遇到了一个挺典型的问题:我的Agent在和用户进行多轮对话后,经常“忘记”之前的关键信息&#xff0…

2026/8/18 21:41:04 阅读更多 →
海外业务 GEO 实战思路

海外业务 GEO 实战思路

在当今 AI 搜索迅猛发展的时代,搜索引擎领域正经历着翻天覆地的变化。传统的搜索方式已难以满足用户日益多样化和个性化的需求,AI 技术的融入让搜索变得更加智能、高效。在这样的大背景下,GEO(Generative Engine Optimization&…

2026/8/18 21:40:03 阅读更多 →
新款逍客上市:15.49万起,合资SUV如何应对新能源与自主品牌竞争?

新款逍客上市:15.49万起,合资SUV如何应对新能源与自主品牌竞争?

1. 新车上市,逍客的变与不变 又一款合资紧凑型SUV迎来了中期改款。最近,东风日产新款逍客正式上市,价格区间定在了15.49万到18.59万。这个价格一出来,我身边不少关注这个级别车型的朋友都在讨论:在如今这个新能源和自主…

2026/8/18 21:40:03 阅读更多 →
基于LLM Agent的心智理论涌现:非完全信息博弈中的多层信念推理实践

基于LLM Agent的心智理论涌现:非完全信息博弈中的多层信念推理实践

1. 项目概述:当LLM牌手学会“读心” 最近在捣鼓大语言模型(LLM)智能体(Agent)时,一个特别有意思的课题跳了出来:如何让这些AI在非完全信息博弈里,比如德州扑克,展现出类似…

2026/8/18 21:40:03 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →