我有两个任务(task1和task2)。当我收到来自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);
}
}
答案 0 :(得分:0)
第一个问题是你想要这样做的原因。您真的想要删除任务并重新创建它 - 或者只是再次分支到任务的开头?删除任务并重新创建它是低效的,几乎从来没有真正需要。
假设您确实要删除任务并重新创建它,那么如果一个任务想要重新启动另一个任务,那么它只需要删除该任务并再次创建它。
另一方面,如果您想要删除一个任务并重新创建自己,那么实现这一目标的一种方法是使用xTimerPendFunctionCall()。
实现一个创建要重启的任务的函数,如下所示:
void vPendableFunction( void * pvParameter1, uint32_t ulParameter2 )
{
[xTaskCreate][2]( whatever );
}
然后当一个任务想要重新创建自己时,如果首先使用上述函数调用xTimerPendFunctionCall()作为相应的xTimerPendFunctionCall()参数,则删除自身。这个功能是“#”;将再次执行并创建任务。