我正在使用状态机任务来处理程序流程。当选择状态(STAND BY除外)时,状态机将使用“ xTaskNotifyGive”功能唤醒关联的任务,因为所有其他任务都被“ ulTaskNotifyTake(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”函数将关联的任务唤醒为...
对我来说,这是使用short circuit boolean logic的好情况。
[我不对“ goto”关键字的用法发表意见,我认为您可以使用以下代码实现相同的行为并避免循环复杂性: