我创建了2个消耗一些RAM的任务,当他们完成他们必须做的事情时,我需要自动重启它们,甚至可以这样做吗?我已阅读了很多文章但仍未找到答案,请帮助。
答案 0 :(得分:1)
如何消耗RAM。如果是from the FreeRTOS heap,那么在重新启动或删除任务之前,您需要手动释放堆RAM。
当你说'#34;重启"任务,你到底是什么意思?
1)删除任务然后再创建它?如果是,那么您可以使用vTaskDelete()和xTaskCreateStatic API函数。然而,虽然人们通常想要这样做,但实际上人们很少需要这样做 - 更好地保持相同的任务并使任务结构化以便它可以循环回到其实现的顶部而不是重新创建。
2)根据上面第(1)点的后半部分,如果您只是意味着任务从其实现的开始再次开始,您可以将任务放在一个循环中,当您到达底部时循环,你回到顶部,等待信号重新开始。
如果绝对必须删除任务然后再次自动重新启动,则创建一个创建任务的函数,然后使用xTimerPendFunctionCall() API函数在任务删除之前暂停函数[通过调用vTaskDelete(NULL) )。
答案 1 :(得分:1)
通常U不应该重启任务。那不是个好主意。更好地在无限循环中运行它们。使用最小的堆栈大小创建,在工作时分配和释放内存。
void* create_taskX()
{
xTaskCreate( ..., configMINIMAL_STACK_SIZE, ...);
}
void taskX(void*arg)
{
// Do not create big variables on stack to prevent overflow
while(1)
{
void *resource = malloc(resource_size); // Allocate resources before job
// Do the work. Repeat with delay
free(resource); // Free resources after job
vTaskDelay(timeout_ticks);
// or xSemaphoreTake(); // Wait for event from another task or interrupt
// There are many other ways to block task, make it wait some event
}
}
创建任务时
heap_4.c
和heap_5.c
中实现了良好的内存释放(免费)。或者使用heap_3.c
将FreeRTOS malloc
和free
重定向到STL函数。如果您想经常使用malloc / free或重新创建任务,请不要使用堆1和2.
您还可以创建互斥锁以在task2工作时阻止task1,反之亦然。这将允许当时通过一个任务使用内存。
最后。你的问题非常笼统。答案也是。具体。详细说明。