我有两个任务(任务1和任务2)。当我收到来自 CAN 的消息时,我需要重新启动第二个任务。知道怎么做吗?
好的。我解决了这个问题。
volatile uint8_t restart = 0;
extern void task1(void *pvParameters)
{
UNUSED(pvParameters);
const portTickType xDelayTime = 5 / portTICK_RATE_MS;
int16_t stop = 0;
int16_t fast= 0;
for (;;)
{
if (xQueueReceive(can_message, &stop, 100) == pdPASS)
restart = 1;
vTaskDelay(xDelayTime);
}
}
extern void task2(void *pvParameters)
{
UNUSED(pvParameters);
const portTickType xDelayTime = 15 / portTICK_RATE_MS;
for (;;)
{
/*inits of task, vatiable set,...*/
while(restart != 1)
{
/*function loop*/
restart = 0;
}
vTaskDelay(xDelayTime);
}
}
最佳答案
第一个问题是你为什么要这样做。您是否真的要删除任务并重新创建它 - 或者只是再次分支到任务的开头?删除任务并重新创建它效率很低,而且几乎从来没有真正需要。
假设您确实想要删除一项任务并重新创建它,那么如果一个任务想要重新启动另一项任务,则只需删除该任务并重新创建它即可。
另一方面,如果您希望一个任务删除并重新创建自身,那么实现这一目标的一种方法是使用 xTimerPendFunctionCall() .
实现一个函数来创建您想要重新启动的任务:
void vPendableFunction( void * pvParameter1, uint32_t ulParameter2 )
{
[xTaskCreate][2]( whatever );
}
然后,当任务想要重新创建自身时,如果首先使用上述函数作为适当的 xTimerPendFunctionCall() 参数调用 xTimerPendFunctionCall(),然后删除自身。 “挂起”的函数将执行并再次创建任务。
关于c - 如何在 FreeRTOS 中重新启动任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38013728/