Пришелец 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба Интересно какая максимальная задержка может быть между появлением запроса на прерывание и его выполнением т.е. переходом на вектор прерывания. например прерывания по таймеру маскируются записью в TIMSK и далее выполняется работа которая должна происходить при запрещённых прерываниях таймера по идее после TIMSK=0 нужно поставить несколько NOP т.к. во время этой команды уже может быть начата подготовка к переходу на прерывание так вот вопрос сколько нопов здесь нужно? по-моему трёх должно хватить - но может я ошибаюсь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Duhas 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба время выполнения команды... по идее.. т.е. если выполняется двухтактовая команда.. на первом такте пришло прерывание.. команда довыполнится и начнется обработчик.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба вы хоть сами то поняли что написали? TIMSK=0 запретит прерывания по таймерам. Если его поставить в программе - прерывания не будет. Если его поставить внутри прерывания - будут запрещены дальнейшие прерывания. Что не понятно? И при чем тут NOPы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба по идее после TIMSK=0 нужно поставить несколько NOP т.к. во время этой команды уже может быть начата подготовка к переходу на прерывание так вот вопрос сколько нопов здесь нужно? по-моему трёх должно хватить - но может я ошибаюсь... Не поняла вопрос. Если вы успели установить TIMSK=0 (т.е. когда обнуление этого регистра состоялось), то никакого прерывания от таймера больше не будет, как не будет и никакой "подготовки к прерыванию". Зачем вообще нопы ставить? В архитектуре AVR, по моему мнению, не бывает никаких "подготовок", а вопрос быть прерыванию или не быть, решается в промежутках между инструкциями. Вот тогда-то и будет решен вопрос о том, переходить ли к следующей по порядку инструкции или вылететь на прерывание. Проверка на совпадение флага прерывания и его маски производится, несомненно, аппаратно. Так что если некая инструкция обнуляет маску прерывания, то следом за ней прерывание уже не последует, даже в том случае, если бит прерывания оказался к этому моменту уже взведен. Точно так же прерывание не может случиться во время выполнения какой-либо инструкции. Отсюда следует, что ставить нопы не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Пришелец 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 (изменено) · Жалоба после возврата из прерывания следующее прерывание начинает обрабатываться не сразу это говорит о том что подготовка к переходу на прерывание существует (видимо одна команда) если в момент обнуления TIMSK (в момент исполнения этой команды или за одну команду до неё) начнёт обрабатываться запрос на прерывание по таймеру то он будет обработан проще конечно не гадать а на время обнуления TIMSK запретить все прерывания cli а потом разрешить _CLI(); TIMSK=0; _SEI(); наверное ... ??? время выполнения команды... по идее.. т.е. если выполняется двухтактовая команда.. на первом такте пришло прерывание.. команда довыполнится и начнется обработчик.. т.е. одного nop достаточно видимо. Изменено 3 ноября, 2009 пользователем Пришелец Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба проще конечно не гадать а на время обнуления TIMSK запретить все прерывания cli а потом разрешить _CLI(); TIMSK=0; _SEI(); Тогда, следуя вашей логике, надо и после CLI ставить нопы :), поскольку CLI точно так же стирает маску, как и TIMSK=0 (только в другом регистре масок - в SREG). И по своей аппаратной реализации ничем не отличается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Пришелец 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба Тогда, следуя вашей логике, надо и после CLI ставить нопы :), поскольку CLI точно так же стирает маску, как и TIMSK=0 (только в другом регистре масок - в SREG). И по своей аппаратной реализации ничем не отличается. После CLI не надо :rolleyes: я думаю эти два механизма по разному работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба после возврата из прерывания следующее прерывание начинает обрабатываться не сразу это говорит о том что подготовка к переходу на прерывание существует (видимо одна команда) Имхо, то, что после возврата из прерывания выполнится одна команда до следующего прерывания, не факт того, что подготовка к прерыванию занимает один такт! Сделано это для того, чтобы успеть выполнить некие действия между прерываниями. Как пример: после выхода из "спячки" запретить прерывания, и, даже если "висит" другое прерывание - команда cli его отложит до sei. Ваше обнуление регистра TIMSK снимет прерывание от таймера в любом случае: т.е. в процедуру прерывания с обнулённым регистром TIMSK МК не перейдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба я думаю эти два механизма по разному работают. С чего бы это вдруг, если оба выставляют или снимают маски с прерываний? CLI это вроде рубильника, отключающего электричество во всем доме, а TIMSK - для отдельной квартиры. И с точки зрения отдельной квартиры, все равно как в ней свет отключили - главным домовым рубильном (CLI) или тем, что стоит на лестничной клетке рядом со счетчиком (TIMSK). Никаких дополнительных задержек не возникнет ни в том, ни в другом случае. А вы собрались пред тем, как отключить от сети свой телевизор, предварительно обесточить всех жильцов в доме :). И расчитывете, что так ваш телевизор отключится быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба по моему это обсуждение не имеет смысла. Я на пример так и не понял чего добивается автор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Пришелец 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 (изменено) · Жалоба про cli явно написано что после него не выполнится ни одно прерывание про флаги индивидуальных запретов прерываний такого не написано. после появления запроса прерывания выполняется текущая команда так вот если этой командой окажется TIMSK=0 то запрос будет принят на обработку или нет ??? по моему это обсуждение не имеет смысла. Я на пример так и не понял чего добивается автор добиваюсь ясности в своей голове - может и не только мне а и другим это будет полезно. Изменено 3 ноября, 2009 пользователем Пришелец Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vetal-Soft 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 (изменено) · Жалоба ))) Даже если допустить, что произойдет так, что сигнал прерывания от таймера поступит во время выполнения TIMSK=0 и после ее выполнения, все таки, выполниться переход на подпрограмму его обработки, то после возврата из нее при выполнении следующей за "TIMSK=0;" команды, прерывания от таймера уже будут запрещены. Зачем нужны NOP ? Изменено 3 ноября, 2009 пользователем Vetal-Soft Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Пришелец 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба сдаюсь :rolleyes: согласен убедили Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 3 ноября, 2009 Опубликовано 3 ноября, 2009 · Жалоба я думаю эти два механизма по разному работают. Проц __заканчивает выполнение текущей комады__, после чего если есть хотя бы одно активное прерывание, осуществляет неявную команду JMP на соответвующий активному прерыванию вектор. Спите спокойно, после команды TIMSK = 0 активных прерываний от таймера не будет, но следует отметить, что сишное выражение TIMSK = 0; скорее всего разобъется на две команды, например ldi Rd, 0 out TIMSK, Rd После ldi - прерывание от таймера еще может случиться, а после out - однозначно нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
501-й 0 4 ноября, 2009 Опубликовано 4 ноября, 2009 · Жалоба ldi Rd, 0 out TIMSK, Rd После ldi - прерывание от таймера еще может случиться, а после out - однозначно нет. После out в течении ещё одной команды прерывания от таймера могут быть. Практика. И документация. После команды sei ещё одна команда защищина от прерываний. Тоже практика и докумнтация. Т.е. вот так работать не будет: ldi Rd, 0 sei out TIMSK, Rd -- вот здесь ещё может быть прерывание от таймера А вот так -- работает: ldi Rd, 0 out TIMSK, Rd sei -- здесь прерываний от таймера не будет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться