Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: winavr и прерывания
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
stapleman
Здравствуйте.
Пишу на СИ в WINAVR. Компилятор генерит по вектору прерывания стандартные rjmp .
У меня возникла необходимость вместо rjmp поместить одну ассемблерную команду.
Полагаю, что можно создать ассемблерынй файл с это командой.
И сказать линкеру, заменить часть таблицы прерываний этой командой.
Подскажите, пожалуйста, правильно ли я рассуждаю, и как конкретно это реализовать.
Сергей Борщ
Цитата(stapleman @ Feb 15 2010, 14:25) *
Подскажите, пожалуйста, правильно ли я рассуждаю, и как конкретно это реализовать.
Рассуждаете правильно. Но таблица прерываний линкуется одним куском и заменить команду по одному вектору не получится. Если вас не устраивает ваша команда, вызываемая через rjmp примерно вот таким методом:
Код
__attribute__((signal, naked))
void ADC_vect (void)
{
    asm volatile("RETI");
}
то можно либо при помощи утилиты вроде SRecord в выходном файле заменить код команды rjmp на код вашей команды, либо на этапе линковки дать ключ -Wl, -nostartfiles и прилинковать свою ассемблерную таблицу прерываний с нужной вам командой. Правда в этом случае придется кроме таблицы добавлять и весь стартап, по примеру штатного: http://cvs.savannah.gnu.org/viewvc/avr-lib...amp;view=markup
sonycman
Хм, а в чём смысл размещать команду RETI по вектору прерывания?
Зачем тогда вообще его разрешать?
demiurg_spb
sonycman
Элементарно, Ватсонsmile.gif
Для безопасного возврата из случайно-ошибочно разрешённого прерывания.
А так действительно незачем.
Сергей Борщ
Цитата(demiurg_spb @ Feb 24 2010, 13:42) *
Для безопасного возврата из случайно-ошибочно разрешённого прерывания.
Ошибочно разрешеное прерывание UDR или RXC с такой затычкой приводит к зацикливанию, переполнению стека и перезапуску. Без затычки - будет выполнен обработчик следующего прерывания, тоже с катастрофическими последствиями. Не вижу смысла в таких затычках. Вот сделать по каждому неиспользованному вектору rjmp на себя, чтобы отладчиком можно было сразу же увидеть, в какой вектор влетели - гораздо полезнее. Да и позволит сразу же заметить даже "безобидное" случайно/ошибочно разрешенное прерывание вместо маскирования его последствий.

Родной обработчик __bad_interrupt делает тот же RETI, разница лишь в промежуточном ( R ) JMP.
demiurg_spb
Цитата(Сергей Борщ @ Feb 24 2010, 16:12) *
...сделать по каждому неиспользованному вектору rjmp на себя...
Мудро!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.