c - 如何在 FreeRTOS 中重新启动任务

标签 c arm freertos

我有两个任务(任务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/

相关文章:

c++ - 表示任何 double 值所需的最大字符长度是多少?

android - 将 android 移植到自定义 arm 设备需要哪些知识/专长?

freertos - 获取 esp32 天线的信号量(蓝牙/wifi 双模)

c - 字符串数组问题

c - 如何解析每行包含一长串数字的文件?

linux - Linux 中如何访问控制寄存器

c - 增加 ARM i.MX287 上的 Linux DMA_ZONE 内存

c - GCC 别名在翻译单元之外运行 -AKA- 这甚至是完成这项工作的正确工具吗?

c - 共享变量[RTOS]

c - 使用 C 中的 fgets 和 strtok 读取文件并将信息保存在喜欢的列表中