当前位置: 首页 > news >正文

【STM32】CUBEMX下FreeRTOS 任务栈管理与栈溢出检测(CMSIS_V2接口)

一、FreeRTOS 中的栈管理机制

在 FreeRTOS 中,每个任务都会分配一个独立的栈空间用于保存局部变量、上下文等。

✅ 相关宏配置:
宏名称含义
configMINIMAL_STACK_SIZE最小任务栈大小(单位:words)
uxTaskGetStackHighWaterMark()获取当前任务历史上最小的剩余栈空间(越小越危险)
uxTaskGetSystemState()获取所有任务的栈使用情况
configCHECK_FOR_STACK_OVERFLOW是否开启栈溢出检测(值为 1 或 2)
configUSE_TRACE_FACILITY开启任务信息追踪(如任务名、栈)
configUSE_STATS_FORMATTING_FUNCTIONS开启格式化任务状态打印支持

二、FreeRTOS 栈溢出检测机制

🧪 启用检测:

CUBEMX配置参数:
在这里插入图片描述

#define configUSE_TRACE_FACILITY        1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configCHECK_FOR_STACK_OVERFLOW  2

configCHECK_FOR_STACK_OVERFLOW :

  • 1:简单检测方法,只在任务切换时检查栈顶哨兵值是否被改写。
  • 2:更强的检测方法,除了栈顶哨兵值,还检查栈底向上是否越界。
🛠 栈溢出钩子函数(CUBEMX自动生成):
extern void MX_LWIP_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) *//* Hook prototypes */
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName);/* USER CODE BEGIN 4 */
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
{/* Run time stack overflow checking is performed ifconfigCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function iscalled if a stack overflow is detected. */printf("\r\n");printf("=============================================================\r\n");printf("!!!!                 STACK OVERFLOW DETECTED             !!!!\r\n");printf("=============================================================\r\n");printf(">>> Task causing overflow : %s\r\n", pcTaskName);printf(">>> Taking emergency action: system halted\r\n");printf("=============================================================\r\n");// 关闭中断,进入死循环taskDISABLE_INTERRUPTS();for (;;);
}
/* USER CODE END 4 */

三、如何查看任务的剩余栈空间

使用 uxTaskGetSystemState()usStackHighWaterMark 获取每个任务曾经最小剩余栈空间

🧾 自定义打印函数:
void printTaskStackInfo(void)
{TaskStatus_t taskStatusArray[24];UBaseType_t taskCount, i;taskCount = uxTaskGetSystemState(taskStatusArray, 24, NULL);qsort(taskStatusArray, taskCount, sizeof(TaskStatus_t), compareTaskName);printf("\r\n+------------------+------------------------+------------------+\r\n");printf("| %-16s | %-22s | %-16s |\r\n", "任务名", "剩余栈空间 (words)", "剩余栈空间 (bytes)");printf("+------------------+------------------------+------------------+\r\n");for (i = 0; i < taskCount; i++){const char *name = taskStatusArray[i].pcTaskName;UBaseType_t highWater = taskStatusArray[i].usStackHighWaterMark;printf("| %-16s | %-22u | %-16u |\r\n", name, highWater, highWater * sizeof(StackType_t));}printf("+------------------+------------------------+------------------+\r\n");
}
  • 输出结果:
    在这里插入图片描述

四、FreeRTOS 任务模板函数(带栈使用示例)

void myTask(void *argument)
{while (1){// 模拟工作vTaskDelay(pdMS_TO_TICKS(1000));// 检查自身栈剩余空间(单位:words)UBaseType_t stackLeft = uxTaskGetStackHighWaterMark(NULL);if (stackLeft < 50)  // 阈值根据实际栈大小设定{printf("⚠️ Warning: task '%s' low stack: %lu words\r\n", pcTaskGetName(NULL), stackLeft);}}
}

五、建议:如何设置合适的任务栈大小?

  1. 开发初期可以设得大一点,如 512 words
  2. 启动任务后运行一段时间,调用 printTaskStackInfo()
  3. 看实际 剩余栈空间,酌情缩小分配。
  4. 建议保留 安全边际(>50 words),避免任务创建失败或运行中溢出。

http://www.dtcms.com/a/298329.html

相关文章:

  • 【软件工程】构建软件合规防护网:双阶段检查机制的实践之道
  • 双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥
  • LeetCode51~70题解
  • 多模态大模型研究每日简报(2025-07-24)
  • [硬件电路-85]:一款高集成度热电制冷器(TEC)控制器芯片ADN8835ACPZ
  • 深入解析 Vue.js 中的 `ref` 和 `shallowRef`:响应式编程的核心与优化实践
  • Web开发传参的四种常见方式介绍
  • 数据结构系列之哈希表
  • 无人机机体结构设计要点难点分析
  • 滚珠导轨:手术机器人与影像设备的精密支撑
  • 【AJAX】Promise详解
  • 202507亲测可用,剪映官方内测版本SVIP功能都可以用支持数字人和自动识别字幕
  • 基于讯飞星火AI的文学作品赏析系统开发实战:从通用聊天到专业文学分析的完整技术方案
  • Axios基本使用
  • JS逆向 - (国外)SHEIN站 - 请求头(armorToken、Anti-in)
  • 【05】C#入门到精通——C# 面向对象、类、静态变量static、类与类之间的调用
  • [SV]在 Verilog 中,对某个信号施加一个弱下拉,但又不能影响后续的正常驱动
  • CSS 盒子模型学习版的理解
  • 【论文阅读51】-CNN-LSTM-安全系数和失效概率预测
  • Multiscale Structure Guided Diffusion for Image Deblurring 论文阅读
  • 【论文阅读】-《GenAttack: Practical Black-box Attacks with Gradient-Free Optimization》
  • 零售收银系统开源代码全解析:连锁门店一体化解决方案(含POS+进销存+商城)
  • 深入理解 Linux 进程信号
  • Linux 桌面市场份额突破 5%:开源生态的里程碑与未来启示
  • [MMU]四级页表查找(table walk)的流程
  • 流式接口,断点续传解决方案及实现
  • 前端核心进阶:从原理到手写Promise、防抖节流与深拷贝
  • iOS 抓包工具有哪些?模块化功能解析与选型思路
  • 容器化环境下的服务器性能瓶颈与优化策略
  • ubuntu22.04.4锁定内核应对海光服务器升级内核无法启动问题