я выпил 0,5 литра неплохого французского вина, и теперь я добрый
mas123 писал(а):Не совсем "в очередь", не суть.
Кнопки обладают интересной особенностью - "дребезг контактов", т.е. выдачи пачки импульсов при нажатии или отпускании.
Разрешение прерывания позволит контроллеру снова среагировать на импульс от кнопки и повторно войти в обработчик прерывания.
это достаточно страшная вещь, если рассматривать ее абстрактно. крови попортить может много, но не часто - нужно еще уметь попасть в соответствующую ситуацию.
в том и беда, что стопитцот раз на столе все будет работать, а в стопитцотпервый раз в изделии - перестанет. поэтому следует избегать даже
потенциальной возможности наступления этих граблей.
mas123 писал(а):А помимо этого, функция "_delay_ms" выполняется при запрещенных прерываниях - достаточно изучить её код.
а вот это вы зря. никакого запрета прерываний в этой функции нет, но, разумеется, никто не запретит "настоящему программисту" запретить их перед обращением к этой функции
daaar писал(а):А вы уверены? Тут то явно "сквозь пальцы" смотрят
лично я сразу написал, что не в силах заставить себя смотреть сквозь пальцы - у меня пальцев не хватает.
COKPOWEHEU писал(а):Ладно задержка - антидребезг (и изредка это может быть оправдано), но зачем разрешать прерывания?
вообще-то для архитектуры AVR это может быть оправдано, ведь эта архитектура имеет единственный уровень обработки... но, справедливости ради, для avr-gcc следует использовать соответствующие атрибуты макроса, а не принудительное sei():
Код: Выделить всё
ISR(TIMER1_OVF_vect, ISR_NOBLOCK){} // этот обработчик будет выполняться ПРИ РАЗРЕШЕННЫХ прерываниях - sei() в нем не требуется
COKPOWEHEU писал(а):Пара отличий все-таки будет
функция, которая не возвращает значения, это процедура - смотрите определение паскаля, если уж на то пошло. логически и функционально между ними нет никакой разницы. тип void для функции Си всего лишь дань синтаксису, на самом деле НИКАКОГО РЕЗУЛЬТАТА физически не существует, так что от процедуры паскаля это ничем не отличается (конечно, если не лезть в глубины передачи параметров через стек). смотреть в ассемблерную реализацию бессмысленно, т.к. она апаратно- и компиляторо-зависима.
daaar писал(а):Во время выполнения прерывания все другие прерывания ставятся в очередь
это не так для платформы AVR, в которой
не существует очереди запросов прерываний.
daaar писал(а):Я задал вопрос конкретно описав проблему, а мне начали говорить, что...
извините, но наступает такой момент, когда для того, чтобы тебе помогли, следует добиться определенного уважения. отказ слушать - одна из главных причин, по которым желание помогать пропадает и может превратиться в желание гнобить.
daaar писал(а):Вы действительно считаете что это смешно?
я считаю, что действительно смешно вот это:
daaar писал(а):Там была не совсем отрицательная задержка, там была -.55
COKPOWEHEU писал(а):В контроллерах этим не пользуются, а разговор именно про них
ну почему же, можно и переопределить операторы... если захочется... однако, оператор в контексте ООП - это всего лишь метод класса, соответствующего определенному объекту. например, оператор сложения для экземпляра класса "вектор" будет осуществлен путем обращения к соответствующему методу этого класса. так что переопределение операторов - это ЧАСТЬ ООП, и, следовательно, я не исказил истину, когда говорил
ARV писал(а):С++ пахнет ООП, т.е. классами и их экземплярами