Я строю FSM с 16 состояниями на PIC18 с C18. Я рассматриваю каждое состояние как свою собственную функцию, которая переходит в другие состояния и перескакивает через них. У меня возникает соблазн просто написать ветки "state##();" в конце каждого состояния, чтобы определить, куда должна идти программа, но я думаю, что это умрет довольно быстро, поскольку компилятор, вероятно, ожидает этого вернуться, а не разветвляться навсегда; стек на моем микроконтроллере быстро заполнялся и, в конце концов, переполнялся.
Достаточно ли умен C18, чтобы знать, что мой вызов функции никогда не вернется обратно, и соответственно заменить инструкцию на GOTO/JMP вместо CALL/BRANCH? Я знаю, что GOTO существует в C (и обычно его настоятельно не рекомендуют из соображений удобочитаемости), но я не могу придумать более подходящей причины для его использования, чем здесь. Я знаю, что могу просто заставить его перейти к блоку _asm _endasm, но я избавлю себя от проблем, если в этом нет необходимости. Как лучше всего в C сказать, чтобы перейти к функции и никогда не возвращаться?
Естественно, любая помощь приветствуется
-S
). Проверьте этот ассемблер, и вы узнаете. В современном языке C, также известном как C11, даже есть ключевое слово, позволяющее указать это:_Noreturn
. - person Jens Gustedt   schedule 08.03.2013