c - FreeRTOS 应用程序堆栈可用内存随着时间的推移而减少

标签 c stack freertos msp432

我有一个任务在 freeRTOS 上运行,我正在检查该应用程序中有多少应用程序堆栈未使用。我看到的是,可用堆栈内存在一段时间后会减少,并在很长一段时间内保持在该值。该任务有一个 while(1) 循环,并且应该使用相同数量的堆栈,但是,我不明白为什么堆栈在循环的一些迭代后会被用完。 这就是我的任务:

void Task A(void *arg)
{
    Initialize_some_variables;
    while(1)
    {
         print(uxTaskGetStackHighWaterMark( NULL ));
         sem_wait(some_sem);
         xQueueReceive(some_q);
         process_q_data();
         send_response_over_uart();
         print(uxTaskGetStackHighWaterMark( NULL ));
    }
}

我的堆栈应该具有​​与 while 循环的第一次迭代相同的自由字。但是,我发现一段时间后,GetStackHighWaterMark 返回的免费字数减少了,我无法解释这一点。

最佳答案

好吧,在阅读了 FreeRTOS 的文档之后,我现在了解到 uxTaskGetStackHighWaterMark 始终返回自任务开始执行以来剩余的最小堆栈量。因此,它不是给定实例中可用的堆栈量。这解释了我所看到的。

https://www.freertos.org/uxTaskGetStackHighWaterMark.html

关于c - FreeRTOS 应用程序堆栈可用内存随着时间的推移而减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434050/

相关文章:

c - Linux内核UDP接收时间戳

c - 结果似乎是 0.00001 而不是我分配的值。为什么?

c++ - 使用 memcpy 时出现 "Stack ........ was corrupted"错误

c++ - 移除栈中的空元素

c - 防止 GCC LTO 删除函数

c - 有谁知道像 C 中的 cron 那样解码字符串的 API 吗?

c - 无法初始化结构数组

java - 什么是串行版本 UID?

ram - STM32F407 内存布局

c - AWS IoT - JSON 格式不正确