Цикл loop()
- Войдите на сайт для отправки комментариев
Втр, 04/08/2020 - 12:11
Привет всем.На Ардуино только начинаю, и вот возник такой вопрос-сильно не пинайте)
Есть цикл
void loop() {
}
Если в теле цикла я вызову свою подпрограмму- цикл остановится и будет ждать окончания выполнения моей подпрограммы?
да, контроллер может выполнять одновременно только одну задачу. поэтому пока будет выполняться ваша подпрограмма - цикл loop() будет ждать
Это не цикл. Это подпрограмма. Такая же как все Ваши. Она вызывается из основной программы main. Поэтому поведение loop такое же как и остальных подпрограмм. Если Вы вызвали свою подпрограмму то возврат из Вашей подпрограммы произойдёт в точку вызова из loop. Система не мнгозадачная. В текуший момент времени может исполняться только одна инструкция процессора.
Спасибо)
Через гардероб (setup) вы попали в кольцевой коридор (loop).
Вот вы ходите по кольцевому коридору.
Вдруг сошлись звезды и открылась боковая дверь.
Через боковую дверь вы вышли в комнату, покрутились как-то там и вернулись в коридор через ту же дверь, через которую выходили. В идеальном случае в коридоре при этом ничего не изменилось.
Продолжаете ходить по кольцевому коридору.
Ходите... вы всюду бродите...
Как будто ваш аппендицит от хожденья будет сыт...
В этом коридоре есть двери назад в main. Выйдя в неё в любой точке Вы опять опять попадаете снова в начало loop через несколько микросекунд. Это бывают используют что бы loop начать сначала.
Если в теле цикла я вызову свою подпрограмму- цикл остановится и будет ждать окончания выполнения моей подпрограммы?
1) еще ассоциация, программа выполняется линейно по кругу, некоторые участки своей программы вы завязываете в узелок с петелькой (подпрограмма). написать вы ее можете где угодно, присвоив узелку имя и в "петле" вы блуждая по кругу написанного кода будете видеть только его имя, а МК не только видеть но и прилежно заходить в нее и выполнять.
2) так как вы только начинаете, может попасться очень страшная вещь - GO-TO бегите от нее далеко и быстро, НИКОГДА не используйте (пока не просветлеете и не будете считать себя новичком). пост 9 (и весь топик)/пост 71 и в низ до упора и вообще весь топик перечитайте - вам, как новичку очень полезно будет.
3) прерывания - они могут нагло залезь в код вашей программы в любом месте НО потом программа должна продолжиться с этого места!!! если вы не описали иного действия...
как видите, вариантов масса, думаю ребята еще много могли бы добавить. Но основное - в один момент времени только что-то одно.
2) так как вы только начинаете, может попасться очень страшная вещь - GO-TO бегите от нее далеко и быстро, НИКОГДА не используйте
Нет.
да, контроллер может выполнять одновременно только одну задачу.
Подключусь с вопросом на эту тему (поскольку всё еще ламер в тяжелой форме): влияет ли на работу ШИМа объем выполняемой работы в лупе и подпрограммах? В частности, на 4-й ноге Меги ШИМ где-то близко к 1 кГц, то есть, период - одна мсек. А если луп выполняется (в связи с загруженностью) дольше, то... Или команда AnalogWrite сама управляет ШИМом, "незаметно" для нас вклиниваясь в работу процессора?
Заранее спасибо!
Не может такого быть. Она организована через аппаратный таймер, частота которого не зависит от загруженности loop.
да, контроллер может выполнять одновременно только одну задачу.
Подключусь с вопросом на эту тему (поскольку всё еще ламер в тяжелой форме): влияет ли на работу ШИМа объем выполняемой работы в лупе и подпрограммах? В частности, на 4-й ноге Меги ШИМ где-то близко к 1 кГц, то есть, период - одна мсек. А если луп выполняется (в связи с загруженностью) дольше, то... Или команда AnalogWrite сама управляет ШИМом, "незаметно" для нас вклиниваясь в работу процессора?
Заранее спасибо!
Обычно, когда говорят про ШИМ имеют в виду аппаратный. Аппаратный ШИМ реализуется таймером, т.е. периферийным устройством, и к работе процессора никакого отношения не имеет. Соответственно, ресурса процессор а не отбирает.
AnalogWrite никак не "вклинивается" в работу процессора - она один раз настраивает таймер, после чего он (таймер) работает независимо от процессора.
На всякий случай: микроконтроллер - это микроЭВМ, т.е. устройство, состоящее из нескольких узлов: процессора, памяти, а также целого набора периферийный устройств.
Хм двери в майн. Я знаю только люк в ребут.
void
(* resetFunc) (
void
) = 0;
А как вернуться в начало лупа?
Через "return".
:)))))))))))))
и почему так сразу только одну, если используем таймера в автономном режиме, то уже и не одну )))
Вот насчёт дверей, лупов, входов-выходов, смысла жизни и всего такого: https://www.youtube.com/watch?v=BFiFVNS_cDU
Ну тут на многозадачность похоже). Круто для 80-го.
Аппаратный ШИМ реализуется таймером, т.е. периферийным устройством, и к работе процессора никакого отношения не имеет. Соответственно, ресурса процессор а не отбирает.
Все понял, спасибо. разложилось по полочкам.
Продолжаете ходить по кольцевому коридору.
Но всё это можно прекратить через exit(0);)
Ладно, с loop() разобрались, есть еще вопрос)
Планирую использовать мегу 328 без загрузчика - т.е просто повесить на контроллер кварц с двумя конденсаторами и шить через USBasp программатор.
Т.е. я хочу дополнительно использовать пространство загрузчика под код.При написании кода как мне указать,что скетч не использует загрузчик?Или среда сама это определит при выборе программатора и скомпилирует код при выборе платы без Old Bootloader?
Т.е. я хочу дополнительно использовать пространство загрузчика под код.При написании кода как мне указать,что скетч не использует загрузчик?Или среда сама это определит при выборе программатора и скомпилирует код при выборе платы без Old Bootloader?
среда сама ничего не определяет, надо прописывать.
Почитайте вот эту тему примерно с 26 сообщения - там как раз про избавление от загрузчика и про настройку Ардуино ИДЕ