如何理解uxtaskgetstackhighlwatermark()的return值
How to understand the return value of uxtaskgetstackhighlwatermark()
根据官方文档 :
“uxTaskGetStackHighWaterMark() 用于查询任务离溢出分配给它的堆栈 space 有多近。”
我正在使用 rtl8720,一个 32 位芯片 运行 FreeRTOS_v10.2.0。
我写了一个测试程序如下,main()函数会调用TestTaskEntry():
static void TestStack()
{
char buff[500] = {0};
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[2] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
return;
}
static void TestTask()
{
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[1] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
TestStack();
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[3] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
vTaskDelete(NULL);
}
void TestTaskEntry(void)
{
if(xTaskCreate(TestTask, ((const char*)"test task"), 500, NULL,
tskIDLE_PRIORITY + 3 + PRIORITIE_OFFSET, NULL) != pdPASS) {
printf("\n\rcreate stack failed\n\r");
}
}
程序打印如下:
[1] Min available stack size 485 * 4 bytes
[2] Min available stack size 424 * 4 bytes
[3] Min available stack size 424 * 4 bytes
我觉得[1]应该更接近TestTask的任务深度(500 * 4字节)。但是 [2] 和 [3] 应该比 [1] 小 500 字节,因为有一个 500 字节大小的本地数组。
我应该如何理解我的程序的实际执行结果?为什么 StackHighWater 不是 TestTask 历史上最小的剩余堆栈?
我认为您的 buff
变量已被编译器优化,因为它从未被使用过,因此不需要任何堆栈。您可以尝试通过编写 volatile char buff[500] = {0};
来阻止优化。
出于测试目的,我还会在调用 xTaskCreate
.
时增加堆栈大小
常见问题解答中还有一个关于堆栈使用估计的重要章节:https://www.freertos.org/FAQMem.html#StackSize
根据官方文档
我正在使用 rtl8720,一个 32 位芯片 运行 FreeRTOS_v10.2.0。 我写了一个测试程序如下,main()函数会调用TestTaskEntry():
static void TestStack()
{
char buff[500] = {0};
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[2] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
return;
}
static void TestTask()
{
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[1] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
TestStack();
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
printf("\n\r[3] Min available stack size %d * %d bytes\n\r", uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
#endif
vTaskDelete(NULL);
}
void TestTaskEntry(void)
{
if(xTaskCreate(TestTask, ((const char*)"test task"), 500, NULL,
tskIDLE_PRIORITY + 3 + PRIORITIE_OFFSET, NULL) != pdPASS) {
printf("\n\rcreate stack failed\n\r");
}
}
程序打印如下:
[1] Min available stack size 485 * 4 bytes
[2] Min available stack size 424 * 4 bytes
[3] Min available stack size 424 * 4 bytes
我觉得[1]应该更接近TestTask的任务深度(500 * 4字节)。但是 [2] 和 [3] 应该比 [1] 小 500 字节,因为有一个 500 字节大小的本地数组。 我应该如何理解我的程序的实际执行结果?为什么 StackHighWater 不是 TestTask 历史上最小的剩余堆栈?
我认为您的 buff
变量已被编译器优化,因为它从未被使用过,因此不需要任何堆栈。您可以尝试通过编写 volatile char buff[500] = {0};
来阻止优化。
出于测试目的,我还会在调用 xTaskCreate
.
常见问题解答中还有一个关于堆栈使用估计的重要章节:https://www.freertos.org/FAQMem.html#StackSize