Я знаю, что в компьютерах значение, возвращаемое main()
функцией, получает операционная система. Но что происходит в main()
функции микроконтроллера?
microcontroller
avr
c
user18118
источник
источник
main
с двумя разными сигнатурами, обе из которых возвращаютсяint
. Если вы используете автономную реализацию C, эта реализация диктует, как вы должны написать функцию запуска. Вы не можете написатьvoid
возвращающую функцию только потому, что она не возвращает. Поведение не возврат отличается от функции типа , которая влияет на общие соглашения о вызовах.Ответы:
На микроконтроллере
main()
не ожидается, что он когда-либо завершится, а поведение, если оно не определено, - это зависит от того, кто написал время выполнения C для микроконтроллера. Я видел системы, которые:main()
, так что если он выходит, он просто вызывается снова.main()
когда-либо выйдет.main()
. Это называется "убегать в сорняки".Я никогда не видел такой, которая вообще что-то делает с возвращаемым значением
main()
. Если это то, что вас действительно волнует, то вам следует взглянуть - и, возможно, изменить - исходный код библиотеки времени выполнения C вашей системы.источник
main()
иметьint
возвращаемое значение , очевидно , не был разработан с OS-менее микроконтроллером в виду. Так что это неопределенное поведение, и может произойти все что угодно в зависимости от вашей среды выполнения C, как перечислил Дейв.main()
, гораздо меньше , определить ее возвращаемое значение. Это зависит от разработчика.void main( void )
является реализация определяется поведение , не определено поведение .main()
.Распространенное недоразумение / миф о том, что
int main
это единственная действительная форма, указанная в стандарте. Это неправда.Стандарт C говорит о двух реализациях: размещенный и автономный. «Реализация» в данном случае означает компилятор. Размещенные компиляторы компилируются для конкретной ОС, а автономные компиляторы компилируются для конкретного приложения с открытым исходным кодом. Встраиваемые системы почти всегда являются автономными системами - даже в случае RTOS.
Отдельно стоящие реализации могут использовать любую форму
main()
, им даже не нужно иметь функцию с именем main. Чаще всего они используют формуvoid main (void)
, поскольку возвращать что-либо бессмысленно.Важно понимать, что компилятор всегда определяет форму,
main()
а не программист.Отдельно стоящие реализации, которые действительно что- то возвращают
main()
, очень сомнительны. Заставляет задуматься, действительно ли люди, создавшие компилятор, читают стандарт ...Подробности здесь .
источник
Стандарт языка C допускает изменение, определяемое реализацией,
void main( void )
и это обычная форма во встроенных системах - просто потому, что они не должны возвращаться.Если вы посмотрите на настройку компилятора, обычно есть фрагмент кода начальной загрузки, вызываемый из вектора сброса, который выполняет некоторую базовую инициализацию (включая, например, копирование значений инициализации в переменные) перед вызовом main ().
Это также (обычно) будет в бесконечном цикле, или, возможно, выполнить сброс, если
main()
возвращаетисточник
Это (как упоминалось в других ответах) зависит от вашей цепочки инструментов, но, например, в GCC
main
компилируется как другие функции, поэтому его возвращаемое значение будет сохраняться в соответствии с соглашениями о вызовах (в ARM я использую право, а не в GCC, оно будет помещено в R0 как раз перед возвращением).Я полагаю, что это аналогично AVR-GCC, поэтому пользовательский скрипт может использовать это значение после основного возврата.
источник
main
может получить его возвращаемое значение. Конечно, это игнорируется в 99,9% ситуациях, но ответ предоставляет информацию, кто может получить это возвращаемое значение.