【发布时间】:2020-01-15 15:39:30
【问题描述】:
我正在使用状态机任务来处理我的程序流程。 When a state is selected (other than STAND BY), the State Machine wake up the associated task with the “xTaskNotifyGive” function as all other tasks are locked by “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”语句进行了一些研究,但我无法确定是否可以使用,因为有些人不同意这个主题,而没有给出额外的解释。
【问题讨论】:
-
为什么不能考虑到另一个函数和
return而不是goto?