在C / freeRTOS中使用“转到”来停止任务

问题描述 投票:0回答:1

我正在使用状态机任务来处理程序流程。当选择状态(STAND BY除外)时,状态机将使用“ xTaskNotifyGive”功能唤醒关联的任务,因为所有其他任务都被“ ulTask​​NotifyTake(pdTRUE,portMAX_DELAY);”锁定

在执行那些与状态相关的任务期间,可能会发生问题,并且与状态相关的任务必须停止。为此,安全任务设置一个标志“ ContinueTask”。在与状态相关的任务中,我们定期检查此标志。如果为假,则不会执行以下代码。

目前,代码的结构如下:

ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally){
    //some code
}
ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally){
    //some code
}
...
ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally){
    //some code
}

问题是,如果在我们第一次检查该标志时就设置了该标志,它将在代码的下一部分继续检查它。

解决此问题的方法是使用级联的if / else语句,如下所示:

ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally){
    //code
}
else{
    ContinueTaskInternally = ContinueTaskCopy();
    if (ContinueTaskInternally){
        //code
    }
    else{
        ContinueTaskInternally = ContinueTaskCopy();
        if (ContinueTaskInternally){
            //code
        }
        else{
            ....
        }
    }
}

但是如果我们在任务中花很多时间检查此标志,则缩进的数量将非常多,并且无法读取。

我想知道在这种情况下是否可以使用“ goto”语句,如下所示:

ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally) goto exitTask;
//some code

ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally) goto exitTask;
//some code
...

ContinueTaskInternally = ContinueTaskCopy();
if (ContinueTaskInternally) goto exitTask;
//some code

exitTask:
//code before exiting task

您对此有何看法?我对这些“ goto”语句进行了一些研究,但由于有些人在不加解释的情况下对此主题表示异议,因此我无法确定是否可以使用。

我正在使用状态机任务来处理程序流程。选择状态(STAND BY以外的状态)后,状态机将使用“ xTaskNotifyGive”函数将关联的任务唤醒为...

c goto freertos
1个回答
0
投票

对我来说,这是使用short circuit boolean logic的好情况。


0
投票

[我不对“ goto”关键字的用法发表意见,我认为您可以使用以下代码实现相同的行为并避免循环复杂性:

© www.soinside.com 2019 - 2024. All rights reserved.