Зачем мне нужен бесконечный цикл в программировании STM32?

Я программирую STM32F4 на C (gcc), это ARM Cortex M4, я вижу, что все примеры завершают свою функцию main() бесконечным циклом, даже когда остальная часть программы будет выполняться из-за прерываний. Если я попытаюсь удалить цикл из своей программы, прерывания также перестанут запускаться.

Почему я не могу просто удалить этот цикл и выйти из основного потока?

вот сборка (думаю, это большой палец, но я не могу его прочитать даже с документом):

LoopFillZerobss:
ldr  r3, = _ebss
cmp  r2, r3
bcc  FillZerobss

/* Call the clock system intitialization function.*/
bl  SystemInit 
/* Call the application's entry point.*/
bl  main
bx  lr    
.size  Reset_Handler, .-Reset_Handler

person nraynaud    schedule 27.04.2013    source источник
comment
Что вы ожидаете от процессора, когда вы вернетесь из main?   -  person Carl Norum    schedule 27.04.2013
comment
@CarlNorum, ты должен сделать это ответом.   -  person    schedule 27.04.2013
comment
@CarlNorum ничего, в том-то и дело. Ничего не делать между перерывами.   -  person nraynaud    schedule 27.04.2013
comment
Ну, это и есть бесконечный цикл, верно?   -  person Carl Norum    schedule 27.04.2013
comment
это крутится комп, жрёт часы и т.д. далеко не зря.   -  person nraynaud    schedule 27.04.2013
comment
Я не знаком с этой частью, но разве в ней нет инструкции ожидания прерывания или чего-то, что вы могли бы поместить в цикл? Возврат из main не означает, что код перестает выполняться, это означает, что вы передаете управление обратно какому-то другому коду.   -  person Carl Norum    schedule 27.04.2013
comment
Быстрый поиск в Google показывает, что эта часть — ARM Cortex-M4. Так что у него определенно есть инструкция WFI. Используйте это, если вы хотите войти в состояние пониженного энергопотребления в цикле простоя: infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/   -  person Carl Norum    schedule 27.04.2013
comment
Я добавил сборку к своему вопросу, но, честно говоря, я не понимаю документ для «bx». Я действительно, хотя мой вопрос был общим, похоже, что кроличья нора глубже.   -  person nraynaud    schedule 27.04.2013
comment
bx — это инструкция «ветвления и обмена». В данном случае это эквивалентно оператору return в программе на C. Это означает, что этот код пытается вернуться к какому-то другому коду. Если нет вызывающего кода, регистр ссылок (lr), вероятно, является мусором, и его выполнение вызывает сбой/исключение.   -  person Carl Norum    schedule 27.04.2013
comment
Поскольку bl main поместит PC+4 в ссылочный регистр, ваше следующее bx lr будет бесконечным циклом; умышленно или нет.   -  person artless noise    schedule 27.04.2013


Ответы (2)


Взгляните на код установки, который выполняется до main в вашем проекте. Это может быть какой-то тонкий ассемблерный код или что-то более сложное, но в целом он довольно близок к минимальному количеству настроек процессора, необходимому для инициализации стека и запуска среды выполнения C.

Если вы вернулись из main, что должен делать ваш процессор? Перезагрузить? Вешать? Единого правильного ответа не существует, поэтому вам придется взглянуть на код поддержки времени выполнения, связанный с вашей программой, чтобы узнать, что решили ее разработчики. В вашем случае похоже, что они не сделали никаких поправок на возврат main, поэтому процессор просто дает сбой/выдает исключение, и ваша программа перестает работать.

Редактировать: похоже, что вы на самом деле ищете способ войти в состояние низкого энергопотребления во время цикла простоя. Это, безусловно, возможно — поскольку ваш процессор — ARM Cortex-M4, для этого есть простая инструкция:

while (1)
{
    asm("wfi");
}

Если вы используете CMSIS (и похоже, что вы используете SystemInit), сборка, вероятно, уже сделана за вас:

while(1)
{
   __WFI();
}

Более подробная информация доступна по этой ссылке.

person Carl Norum    schedule 27.04.2013
comment
большое спасибо, я приму это как ответ, а также этот бесконечный цикл интеллектуально неудовлетворителен, вы много об этом отвечали. - person nraynaud; 27.04.2013
comment
Надеюсь, WFI сделает то, что вы хотите. Часто существуют определенные регистры, отображаемые в памяти процессора, которые управляют конкретным поведением, которое имеет место при выполнении этой инструкции. Прочтите документацию по процессору для получения дополнительной информации. - person Carl Norum; 27.04.2013

вы не работаете в операционной системе. main() — это такая же функция, как и любая другая, она возвращается из того места, где была вызвана. Однако с такой голой металлической системой это не операционная система. Итак, если ваше программное обеспечение полностью управляется прерываниями, а функция main() предназначена просто для настройки, то вам необходимо поддерживать процессор в контролируемом состоянии либо в бесконечном цикле, либо в режиме пониженного энергопотребления. вы можете сделать это в конце main() или как бы ни называлась ваша функция установки, или сборка, которая вызывает main:

bl main
b . ;@ an infinite loop

или если вы хотите, чтобы wfi был там:

bl main
xyz:
wfi
b xyz
person old_timer    schedule 28.04.2013