使用“ goto”停止C / freeRTOS中的任务

安托万·波雷(AntoineBoré)

我正在使用状态机任务来处理程序流。当选择了(比STAND BY等)的状态,状态机醒来的“xTaskNotifyGive”功能相关的任务,所有其他任务由锁定“ulTask​​NotifyTake(pdTRUE,portMAX_DELAY);”

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

目前,代码的结构如下所示:

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”语句进行了一些研究,但是由于有些人在不加解释的情况下对此主题持不同意见,因此我无法确定是否可以使用。

阿贝伦基

对我来说,这是使用短路布尔逻辑的好情况

也就是说:如果该标志曾经设置为false,则&&表达式的第二部分将不被求值。该功能ContinueTaskCopy()将不会运行。

只要标记为true,所有代码都将运行。
该标志为时false,它将跳过所有if语句和所有ContinueTaskCopy语句,直到函数结束。

使您的代码如下所示:

bool ContinueTaskInterally = true;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在重复的FreeRtos任务中使用静态函数

来自分类Dev

如何明确告诉任务在FreeRTOS中死亡

来自分类Dev

从 FreeRTOS 列表中定期分派任务

来自分类Dev

使用块中的C#任务返回方法

来自分类Dev

C#中的任务-使用Random不清楚结果

来自分类Dev

ReportProgress不使用C#中的任务调用progressChanged

来自分类Dev

使用C#的SSIS中任务的逻辑顺序

来自分类Dev

使用块中的C#任务返回方法

来自分类Dev

使用等待处理任务中的 C# 异常

来自分类Dev

使用在任务数组中使用的令牌停止任务

来自分类Dev

C ++中的goto语句对堆栈的影响

来自分类Dev

GOTO如何在C#中工作

来自分类Dev

从 freertos 中的数据获取有关发送任务的信息

来自分类Dev

如何仅在使用C ++中的boost完成所有任务后才向线程池添加新任务

来自分类Dev

FreeRTOS任务未恢复

来自分类Dev

使用在C#中声明的虚拟异步任务并在F#中覆盖它

来自分类Dev

c# - 如何使用任务在c#中并行运行n次调用相同的方法?

来自分类Dev

使用goto case(variable); 在C#开关中

来自分类Dev

使用goto case(variable); 在C#开关中

来自分类Dev

在 C 中使用 goto 进行错误处理的奇怪行为

来自分类Dev

Rakefile-停止多任务中的所有任务

来自分类Dev

在C#中的for循环中使用任务时出现IndexOutOfRangeException异常

来自分类Dev

如何使用Winform C#4.5在任务栏中显示进度

来自分类Dev

在C Sharp或VB .Net中使用ASANA API在任务中添加附件

来自分类Dev

C#如何使用等待在不阻止UI的情况下捕获任务中的异常

来自分类Dev

在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

来自分类Dev

WPF C#:使用任务

来自分类Dev

如何从任务中停止Capistrano部署

来自分类Dev

在ItemProcessor中引发异常时停止任务

Related 相关文章

  1. 1

    在重复的FreeRtos任务中使用静态函数

  2. 2

    如何明确告诉任务在FreeRTOS中死亡

  3. 3

    从 FreeRTOS 列表中定期分派任务

  4. 4

    使用块中的C#任务返回方法

  5. 5

    C#中的任务-使用Random不清楚结果

  6. 6

    ReportProgress不使用C#中的任务调用progressChanged

  7. 7

    使用C#的SSIS中任务的逻辑顺序

  8. 8

    使用块中的C#任务返回方法

  9. 9

    使用等待处理任务中的 C# 异常

  10. 10

    使用在任务数组中使用的令牌停止任务

  11. 11

    C ++中的goto语句对堆栈的影响

  12. 12

    GOTO如何在C#中工作

  13. 13

    从 freertos 中的数据获取有关发送任务的信息

  14. 14

    如何仅在使用C ++中的boost完成所有任务后才向线程池添加新任务

  15. 15

    FreeRTOS任务未恢复

  16. 16

    使用在C#中声明的虚拟异步任务并在F#中覆盖它

  17. 17

    c# - 如何使用任务在c#中并行运行n次调用相同的方法?

  18. 18

    使用goto case(variable); 在C#开关中

  19. 19

    使用goto case(variable); 在C#开关中

  20. 20

    在 C 中使用 goto 进行错误处理的奇怪行为

  21. 21

    Rakefile-停止多任务中的所有任务

  22. 22

    在C#中的for循环中使用任务时出现IndexOutOfRangeException异常

  23. 23

    如何使用Winform C#4.5在任务栏中显示进度

  24. 24

    在C Sharp或VB .Net中使用ASANA API在任务中添加附件

  25. 25

    C#如何使用等待在不阻止UI的情况下捕获任务中的异常

  26. 26

    在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

  27. 27

    WPF C#:使用任务

  28. 28

    如何从任务中停止Capistrano部署

  29. 29

    在ItemProcessor中引发异常时停止任务

热门标签

归档