Цикл loop()

Billy Bons
Offline
Зарегистрирован: 13.06.2019

Привет всем.На Ардуино только начинаю, и вот возник такой вопрос-сильно не пинайте)

Есть цикл 

void loop() {

}

Если в теле цикла я вызову свою подпрограмму- цикл остановится и будет ждать окончания выполнения моей подпрограммы?

 

b707
Offline
Зарегистрирован: 26.05.2017

да, контроллер может выполнять одновременно только одну задачу. поэтому пока будет выполняться ваша подпрограмма - цикл loop() будет ждать

nik182
Offline
Зарегистрирован: 04.05.2015

Это не цикл. Это подпрограмма. Такая же как все Ваши. Она вызывается из основной программы main. Поэтому поведение loop такое же как и остальных подпрограмм. Если Вы вызвали свою подпрограмму то возврат из Вашей подпрограммы произойдёт в точку вызова из loop. Система не мнгозадачная. В текуший момент времени может исполняться только одна инструкция процессора.

Billy Bons
Offline
Зарегистрирован: 13.06.2019

Спасибо)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Через гардероб (setup) вы попали в кольцевой коридор (loop).
Вот вы ходите по кольцевому коридору.
Вдруг сошлись звезды и открылась боковая дверь.
Через боковую дверь вы вышли в комнату, покрутились как-то там и вернулись в коридор через ту же дверь, через которую выходили. В идеальном случае в коридоре при этом ничего не изменилось.
Продолжаете ходить по кольцевому коридору.

b707
Offline
Зарегистрирован: 26.05.2017

Ходите... вы всюду бродите...
Как будто ваш аппендицит от хожденья будет сыт...

nik182
Offline
Зарегистрирован: 04.05.2015

В этом коридоре есть двери назад  в main. Выйдя в неё в любой точке Вы опять опять попадаете  снова в начало loop через несколько микросекунд. Это бывают используют что бы loop начать сначала. 

Гриша
Offline
Зарегистрирован: 27.04.2014

Billy Bons пишет:

Если в теле цикла я вызову свою подпрограмму- цикл остановится и будет ждать окончания выполнения моей подпрограммы?

1) еще ассоциация, программа выполняется линейно по кругу, некоторые участки своей программы вы завязываете в узелок с петелькой (подпрограмма). написать вы ее можете где угодно, присвоив узелку имя и в "петле" вы блуждая по кругу написанного кода будете видеть только его имя, а МК не только видеть но и прилежно заходить в нее и выполнять.

  2) так как вы только начинаете, может попасться очень страшная вещь - GO-TO  бегите от нее далеко и быстро, НИКОГДА не используйте (пока не просветлеете и не будете считать себя новичком). пост 9 (и весь топик)/пост 71 и в низ до упора и вообще весь топик перечитайте - вам, как новичку очень полезно будет. 

 3) прерывания - они могут нагло залезь в код вашей программы в любом месте НО потом программа должна продолжиться с этого места!!! если вы не описали иного действия...

как видите, вариантов масса, думаю ребята еще много могли бы добавить. Но основное - в один момент времени только что-то одно.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Гриша пишет:

  2) так как вы только начинаете, может попасться очень страшная вещь - GO-TO  бегите от нее далеко и быстро, НИКОГДА не используйте 

Нет. 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

b707 пишет:

да, контроллер может выполнять одновременно только одну задачу.

Подключусь с вопросом на эту тему (поскольку всё еще ламер в тяжелой форме): влияет ли на работу ШИМа объем выполняемой работы в лупе и подпрограммах? В частности, на 4-й ноге Меги ШИМ где-то близко к 1 кГц, то есть, период - одна мсек. А если луп выполняется (в связи с загруженностью) дольше, то... Или команда AnalogWrite сама управляет ШИМом, "незаметно" для нас вклиниваясь в работу процессора?

Заранее спасибо!

nik182
Offline
Зарегистрирован: 04.05.2015

Не может такого быть. Она организована через аппаратный таймер, частота которого не зависит от загруженности loop.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sonologist пишет:

b707 пишет:

да, контроллер может выполнять одновременно только одну задачу.

Подключусь с вопросом на эту тему (поскольку всё еще ламер в тяжелой форме): влияет ли на работу ШИМа объем выполняемой работы в лупе и подпрограммах? В частности, на 4-й ноге Меги ШИМ где-то близко к 1 кГц, то есть, период - одна мсек. А если луп выполняется (в связи с загруженностью) дольше, то... Или команда AnalogWrite сама управляет ШИМом, "незаметно" для нас вклиниваясь в работу процессора?

Заранее спасибо!

ШИМ может быть программным и аппаратным. Аппаратный ШИМ на AVR ограничен диапазоном от 0 до 255 и может быть реализован лишь на некоторых (не на всех) ногах. Программный ШИМ таких ограничений не имеет.

Обычно, когда говорят про ШИМ имеют в виду аппаратный. Аппаратный ШИМ реализуется таймером, т.е. периферийным устройством, и к работе процессора никакого отношения не имеет. Соответственно, ресурса процессор а не отбирает.

AnalogWrite никак не "вклинивается" в работу процессора - она один раз настраивает таймер, после чего он (таймер) работает независимо от процессора.

На всякий случай: микроконтроллер - это микроЭВМ, т.е. устройство, состоящее из нескольких узлов: процессора, памяти, а также целого набора периферийный устройств.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Хм двери в майн. Я знаю только люк в ребут.

void(* resetFunc) (void) = 0;

А как вернуться в начало лупа?

sadman41
Offline
Зарегистрирован: 19.10.2016

Через "return".

Гриша
Offline
Зарегистрирован: 27.04.2014

sadman41 пишет:
Через "return".

:)))))))))))))

void loop(){
 
  // здесь блестящая идея тестирования кода
 
  return;
 
  // оставшаяся часть неправильно функционирующего варианта здесь
  // этот код никогда не будет выполняться
 
}

 

Izvekoff
Offline
Зарегистрирован: 02.03.2020

и почему так сразу только одну, если используем таймера в автономном режиме, то уже и не одну  )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот насчёт дверей, лупов, входов-выходов, смысла жизни и всего такого: https://www.youtube.com/watch?v=BFiFVNS_cDU

Green
Offline
Зарегистрирован: 01.10.2015

Ну тут на многозадачность похоже). Круто для 80-го.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

andriano пишет:

Аппаратный ШИМ реализуется таймером, т.е. периферийным устройством, и к работе процессора никакого отношения не имеет. Соответственно, ресурса процессор а не отбирает.

Все понял, спасибо. разложилось по полочкам.

Green
Offline
Зарегистрирован: 01.10.2015

inspiritus пишет:

Продолжаете ходить по кольцевому коридору.


Но всё это можно прекратить через exit(0);)

Billy Bons
Offline
Зарегистрирован: 13.06.2019

Ладно, с loop() разобрались, есть еще вопрос)

Планирую использовать мегу 328 без загрузчика - т.е просто повесить на контроллер  кварц с двумя конденсаторами и шить через USBasp программатор.

Т.е. я хочу дополнительно использовать пространство загрузчика под код.При написании кода как мне указать,что скетч не использует загрузчик?Или среда сама это определит при выборе программатора и скомпилирует код при выборе платы без Old Bootloader?

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Billy Bons пишет:

Т.е. я хочу дополнительно использовать пространство загрузчика под код.При написании кода как мне указать,что скетч не использует загрузчик?Или среда сама это определит при выборе программатора и скомпилирует код при выборе платы без Old Bootloader?

среда сама ничего не определяет, надо прописывать.

Почитайте  вот эту тему примерно с 26 сообщения - там как раз про избавление от загрузчика и про настройку Ардуино ИДЕ