如何在FreeRTOS中重启任务

时间:2016-06-24 12:41:35

标签: c arm freertos

我有两个任务(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);
    }
}

1 个答案:

答案 0 :(得分:0)

第一个问题是你想要这样做的原因。您真的想要删除任务并重新创建它 - 或者只是再次分支到任务的开头?删除任务并重新创建它是低效的,几乎从来没有真正需要。

假设您确实要删除任务并重新创建它,那么如果一个任务想要重新启动另一个任务,那么它只需要删除该任务并再次创建它。

另一方面,如果您想要删除一个任务并重新创建自己,那么实现这一目标的一种方法是使用xTimerPendFunctionCall()

实现一个创建要重启的任务的函数,如下所示:

void vPendableFunction( void * pvParameter1, uint32_t ulParameter2 )
{
    [xTaskCreate][2]( whatever );
}

然后当一个任务想要重新创建自己时,如果首先使用上述函数调用xTimerPendFunctionCall()作为相应的xTimerPendFunctionCall()参数,则删除自身。这个功能是“#”;将再次执行并创建任务。