我正在使用状态机任务来处理程序流。当选择了(比STAND BY等)的状态,状态机醒来的“xTaskNotifyGive”功能相关的任务,所有其他任务由锁定“ulTaskNotifyTake(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] 删除。
我来说两句