Цикл while (1) в функции - работает ли?
- Войдите на сайт для отправки комментариев
Подскажите по следующему вопросу. Будет ли работать цикл while (1) в функции, которая вызывается из основной loop? Суть в следующем. Вызывается функция из loop, в этой функции организован цикл while (1), который должен ожидать нажатие кнопок и выбирать что делать дальше. Выход из while (1) происходит при нажатии на определенную кнопку что по идее должно вернуть управление основному циклу loop. Но почему-то не получается. Похоже что цикл while (1) просто игнорируется. Если в мою функцию (в которой есть цикл while (1)) добавить задержку, то видно, что сама функция вызывается, но цикл while (1) не обрабатывается, функция завершается без ожидания нажатия на кнопки и процесс возвращается обратно в loop.
while (1) вообще доложен работать в функциях или он только в loop работает?
Ничего не могу сказать по поводу while (1) в среде Arduino IDE, но у Вас в корне неверный подход. Заставлять микроконтроллер впустую гонять цикл в ожидании нажатия кнопки без возможности выполнять другие задачи - это плохая практика. Используйте прерывания. Пусть лучше гоняет loop (), а в обработчике прерывания выполняйте нужные Вам действия или вызывайте другие функции. Если в обработчике прерывания будете менять значения каких-то переменных, не забудьте объявить их с квалификатором volatile.
while(1) - ничего вам не должен, это бесконечный цикл, а прервается он только от того, что вы сами его прерываете.
... у Вас в корне неверный подход. ...
Если в программе больше ничего не делает, то зачем городить огород?
Какая разница в каком бесконечном цикле крутиться в loop или while?
Если в программе больше ничего не делает, то зачем городить огород?
Прикрутить несчастное прерывание это городить огород? А вдруг ему потом захочется расширить функционал. Кроме ожидания нажатия кнопки ещё что-нибудь выполнять.
Какая разница в каком бесконечном цикле крутиться в loop или while?
Не знаю... Это ж топикстартёру loop'a оказалось мало и он пытается нагородить еще один бесконечный цикл...
Тоесть реализовать ожидание нажатия на кнопки и действия по ним в цикле loop?
С прерываниями увы не знаю как работать.
С прерываниями увы не знаю как работать.
Информации полно:
http://arduino.ru/Tutorial/Arduino_Interrupts
http://arduino.ru/Reference/AttachInterrupt
http://robocraft.ru/blog/arduino/45.html
https://sites.google.com/site/vanyambauseslinux/arduino/ispolzovanie-preryvanij-arduino
http://www.customelectronics.ru/arduino-vneshnie-preryivaniya-podklyuchenie-enkodera/
http://compblog.vlukyanov.com/?p=435
Вот даже видео запилили. Джереми Блюм плохого не посоветует :)
https://www.youtube.com/watch?v=wjB2qZ3Zkh0
https://www.youtube.com/watch?v=OKnXFLIFyG4
Прикрутить несчастное прерывание это городить огород?
Не знаю... Это ж топикстартёру loop'a оказалось мало и он пытается нагородить еще один бесконечный цикл...
А вдруг ему потом захочется расширить функционал. Кроме ожидания нажатия кнопки ещё что-нибудь выполнять.
Да и вопрос не в этом.
странные обсуждения while (1).... похоже на 1-ое апреля....
while (1) вообще доложен работать в функциях или он только в loop работает?
...он ни чё не должен, кроме как озадачить МК - сколько ему это выполнять ? секунду, месяц, три года ?
это бессрочный режим работы для МК.....
Тоесть реализовать ожидание нажатия на кнопки и действия по ним в цикле loop?
С прерываниями увы не знаю как работать.
while (1) - замените на while (условие) - проверяемое/вычислямое условие внутри while (условие)
странные обсуждения while (1).... похоже на 1-ое апреля....
while (1) вообще доложен работать в функциях или он только в loop работает?
...он ни чё не должен, кроме как озадачить МК - сколько ему это выполнять ? секунду, месяц, три года ?
это бессрочный режим работы для МК.....
Так в том то и дело, что он должен крутить цикл до бесконечности пока не будет выполнено определенное условие (в данном случае нажата кнопка, тогда цикл будет прерван командой break). Но он просто игнорируется. Почему-то программа его пропускает и просто завершает вызванную функцию, в которой этот цикл крутится. Я поэтому и спросил работает ли он в функции.
Почему-то программа его пропускает и просто завершает вызванную функцию, в которой этот цикл крутится. Я поэтому и спросил работает ли он в функции.
Потому, что вы программе указываете, что бы она прервала цикл.
while(1) - хоть и выглядит на первый взгляд странно, используется достаточно часто. Просто программа так иногда получается понятнее - часть кода выделяется в отдельный структурный блок.
И да, правильно написали - выйти из этого блока можно в любой момент с помощью break, по определённому условию.
loop( ) - такая же функция как все остальные. И конечно, while можно использовать в любой функции.
В чём-то другом ошибка, ищите. Или код давайте сюда - посмотрим, а то что мы всё на словах...
Потому, что вы программе указываете, что бы она прервала цикл.
Да указываю - только по нажатию кнопки.
Вот сама функция как выгдяжит. При нажатии 4-й кнопки цикл должен завершиться, но при обращении к функции цикл while (1) просто игнорируется.
Может из-за того, что вход в саму функцию из основного цикла по этой же кнопке происходит....
Происходит из за того что условие выполняется
Что вам мешает проверить это?
А уж по какой причине это происходит известно только вам.
А уж по какой причине это происходит известно только вам.
Заменил кнопку входа в функцию на другую - и стало работать. Видно происходил конфликт с переменными, которые отслеживают нажатие кнопок поэтому условие выхода из цикла соблюдалось и цикл пропускался.
А уж по какой причине это происходит известно только вам.
Заменил кнопку входа в функцию на другую - и стало работать. Видно происходил конфликт с переменными, которые отслеживают нажатие кнопок поэтому условие выхода из цикла соблюдалось и цикл пропускался.
Ардуина достаточно шустрый зверек и если вы не предусмотрите отслеживание отпускания кнопки, он раз двадцать успеет вашу кнопку отработать.
to Datak
while(1) - хоть и выглядит на первый взгляд странно, используется достаточно часто. Просто программа так иногда получается понятнее - часть кода выделяется в отдельный структурный блок.
И да, правильно написали - выйти из этого блока можно в любой момент с помощью break, по определённому условию.
....вроде бы
while(условие) { .............; ................; ........................; изменение переменной входящей в условие; }
более читабельно ?
SU-27-16, зависит от ситуации. Аналогично for(;true;) {...}, do {...} while(1), варианты есть разные. И даже банальный looper: ... goto looper; И каждый вариант по своему читабелен для автора, так что.. се ля ви.
на вкус и цвет - кода нет !
:)
.....будем толерантны к коду автора :)
...вроде бы
while(условие) { .............; ................; ........................; изменение переменной входящей в условие; }
более читабельно ?
Иногда да, а иногда наоборот. Так что согласен:
зависит от ситуации
Например, если условий выхода несколько, перечисление их всех в скобках у while( ..... ) может выглядеть громоздко и непонятно.
Иногда удобней "выпрыгивать" из разных мест цикла, не выполняя его до конца - по-моему, вполне подходящая ситуация для использования while( 1 ).
Например, если условий выхода несколько, перечисление их всех в скобках у while( ..... ) может выглядеть громоздко и непонятно.
аха :)
велик и могуч CPP.... паскаль отдыхает :(
Переделал программу по-другому, без while(1). Вместо него использую теперь основной цикл loop.
Всем спасибо за разъяснения.