Я использую задачу State Machine для управления потоком моей программы. Когда выбрано состояние (кроме 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», но не смог определить, можно ли его использовать, так как некоторые люди не согласны по этому вопросу, не дав дополнительного объяснения, почему.