Embed Toolkit

任务栈深度估算器

基于常见经验值(ISR 压栈 32B、printf ≈ 512B、FreeRTOS minimal 128 words)给出栈大小的起点参考。实际值依赖编译器、优化级别、库版本,结果仅作起点参考,必须用 uxTaskGetStackHighWaterMark() 动态测量验证。

录入调用链各函数局部变量字节数,勾选 ISR / printf 修正项,自动加 30% 余量并对齐到 configMINIMAL_STACK_SIZE,生成 xTaskCreate 代码片段。

快速预设
一键加载典型场景
任务调用链
添加任务执行路径上调用的所有函数及其局部变量字节数
#1
bytes
额外修正
根据使用场景增加固定栈开销
目标 RTOS
最终栈大小将向上取整到 128 words (512 bytes) 的整数倍
计算结果
调用链累加64 B
ISR 修正
printf 修正
修正后总需求64 B
加 30% 余量84 B
推荐栈大小
FreeRTOS
最终 StackSize
128 words
= 512 bytes = 1 × configMINIMAL_STACK_SIZE
代码片段
c
xTaskCreate(taskFunc, "task", 1 * configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
用动态测量校准
上面的估算是起点,真实值请用 FreeRTOS 内置 API 测

任务跑稳后调用 uxTaskGetStackHighWaterMark(NULL) 获取“历史最低剩余 words”。推荐栈大小 ≈ 历史最低 × 1.3。

c
/* 在任务主循环的关键路径后调用 */
void measure_stack(void)
{
    /* 传 NULL 测当前任务;或传 TaskHandle_t 测他人 */
    UBaseType_t free_words = uxTaskGetStackHighWaterMark(NULL);
    printf("stack free: %u words (min over lifetime)\n",
           (unsigned)free_words);
    /* 剩余过小(< 32 words)→ 增加 StackSize;
       长期富余 > 50% → 可下调节省 RAM。 */
}

⚠️ 必须让任务跑过所有 最深调用分支(含异常路径、 printf、DMA 完成回调等)才能得到可信水位。