C18: Будет ли компилятор знать, что вызов функции никогда не вернется?

Я строю FSM с 16 состояниями на PIC18 с C18. Я рассматриваю каждое состояние как свою собственную функцию, которая переходит в другие состояния и перескакивает через них. У меня возникает соблазн просто написать ветки "state##();" в конце каждого состояния, чтобы определить, куда должна идти программа, но я думаю, что это умрет довольно быстро, поскольку компилятор, вероятно, ожидает этого вернуться, а не разветвляться навсегда; стек на моем микроконтроллере быстро заполнялся и, в конце концов, переполнялся.

Достаточно ли умен C18, чтобы знать, что мой вызов функции никогда не вернется обратно, и соответственно заменить инструкцию на GOTO/JMP вместо CALL/BRANCH? Я знаю, что GOTO существует в C (и обычно его настоятельно не рекомендуют из соображений удобочитаемости), но я не могу придумать более подходящей причины для его использования, чем здесь. Я знаю, что могу просто заставить его перейти к блоку _asm _endasm, но я избавлю себя от проблем, если в этом нет необходимости. Как лучше всего в C сказать, чтобы перейти к функции и никогда не возвращаться?

Естественно, любая помощь приветствуется


person BB ON    schedule 08.03.2013    source источник
comment
На такой вопрос нет общего ответа, некоторые компиляторы не будут. Обычно у компиляторов есть параметр командной строки для создания ассемблера вместо объектного кода. (например, для gcc это -S). Проверьте этот ассемблер, и вы узнаете. В современном языке C, также известном как C11, даже есть ключевое слово, позволяющее указать это: _Noreturn.   -  person Jens Gustedt    schedule 08.03.2013
comment
Лучший способ ИМО - не беспокоиться об этом. Что вы хотите спасти? Использование памяти будет лишь тривиальной оптимизацией.   -  person kenny    schedule 08.03.2013
comment
Я почти уверен, что должен беспокоиться об этом. Если компилятор использует вызов, то он продолжает сохранять счетчик программ, когда я путешествую по fsm, и никогда не возвращаюсь. Goto не сохраняет счетчик команд в стеке, поэтому мне не нужно беспокоиться о переполнении.   -  person BB ON    schedule 08.03.2013


Ответы (1)


Похоже, то, о чем вы говорите, будет своего рода рекурсивным дизайном, который является единственным способом, которым вызовы функций будут продолжать складываться. Я не думаю, что у вас есть правильное представление о том, как работает конечный автомат. Попробуйте взглянуть на это для отличного шаблона для FSM в C:

Конечный автомат C

Если вы хотите опубликовать свой пример кода или то, как вы думаете о его реализации, мы могли бы помочь больше.

person ThePosey    schedule 08.03.2013
comment
Да, рассматривать каждое состояние как функцию было не лучшим способом думать об этом. Цикл while и переключатель регистра намного проще. Спасибо - person BB ON; 09.03.2013