【发布时间】:2021-01-23 12:45:43
【问题描述】:
我创建了几个任务,它们的主体是相同的功能。在函数内部,每个任务都有一个相同的延迟。所以,当这个延迟足够大的时候,每个任务的栈都比延迟小的时候少了6个字。
据我了解,当存在多个状态为Ready 的任务的情况时,任务堆栈会增加。
1.在这种情况下,一些额外的 6 字上下文被写入任务堆栈?
2.在我的例子中,结果是 6 个字(24 个字节),这个值可以改变吗?
3.还有什么会影响栈的增加,比如跳转到中断处理程序?
int main(void){
xTaskCreate(Task_PrintCountString, "Task_1", mySTACK_SIZE, ¶m1, 1, NUUL);
xTaskCreate(Task_PrintCountString, "Task_2", mySTACK_SIZE, ¶m2, 1, NUUL);
xTaskCreate(Task_PrintCountString, "Task_3", mySTACK_SIZE, ¶m3, 1, NUUL);
vTaskStartScheduler();
}
#define myDELAY 100
void Task_PrintCountString(void *pParams){
uint16_t c=0;
for(;;){
if(xSemaphoreTake(WriteCountMutex, portMAX_DELAY) == pdTRUE){
PrintCountString(*(uint8_t *)pParams, c++);
xSemaphoreGive(WriteCountMutex);
}
vTaskDelay(myDELAY/portTICK_PERIOD_MS);//When myDELAY=1, the task stack is 6 words more than when myDELAY= 100!
}
}
地址 0x20000158 是其中一项任务的堆栈顶部。其他人也一样!
唯一的函数PrintCountString 总是相同的深度。但与此同时,堆栈可以在几个阶段中增长到其最大知识,经历数十次任务循环的迭代!原来不仅context被保存到stack中,还有别的东西?
附:
我使用ARM CM0 port 和heap_1。
我做了一个观察:
在PrintCountString 函数中有一个等待SPI 标志的块-while()。我替换了 DMA 传输方法并删除了while() 循环。无论延迟如何,两个任务的堆栈都立即开始填充到最大值。
【问题讨论】:
-
您如何衡量任务堆栈的使用情况? portTICK_PERIOD_MS 的值是多少?
-
我查看栈顶,统计剩余字节数为
0xA5。 portTICK_PERIOD_MS = 1 -
如果在所有任务中使用相同的延迟会怎样?可能是答案中提到的信号量函数的不同嵌套。
标签: freertos