Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неиспользуемые прерывания. IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
demiurg1978
Можно ли задать компилятору, чтобы он вместо перехода на начало программы векторы неиспользуемых прерываний забил командами reti?
megajohn
General options->System->Initialize unused interrupts vectors with RETI= TRUE
demiurg1978
Благодарю! Оказывается, эта галка у меня стоит. Просто последний раз в векторы прерываний я заглядывал в AVR Toolchain, и там были переходы на начало программы. Думал, что и у IAR также. И не посмотрел, прежде чем спросить. С другой стороны, я теперь знаю, что такая настройка есть.
demiurg1978
Хотелось бы выслушать мнение профессионалов. На одном форуме высказались, что неиспользуемые векторы прерываний забитые reti - это не есть хорошо.
Ваше мнение?
Сергей Борщ
Да, это не есть хорошо.
demiurg1978
Цитата(Сергей Борщ @ Feb 6 2015, 14:06) *
Да, это не есть хорошо.

Подробнее можно?
megajohn
если на не используемые прерывания стоят reti
1. вы не контролируете свою программу и не контролируете что в ней происходит само собой
2. процессорное время тратиться в пустую на обслуживание ненужных прерываний
demiurg1978
Цитата(megajohn @ Feb 6 2015, 14:17) *
если на не используемые прерывания стоят reti
1. вы не контролируете свою программу и не контролируете что в ней происходит само собой
2. процессорное время тратиться в пустую на обслуживание ненужных прерываний

Что же получается. Варианты.

1 - Все неиспользуемые прерывания забить обработчиками с указанием каким-либо способом, что произошло неконтролируемое прерывание.

2 - В начале программы ставим флаг или еще что. Когда произошло неконтролируемое прерывание, программа видит что флаг установлен, значит ошибка.
Сергей Борщ
Цитата(demiurg1978 @ Feb 6 2015, 10:13) *
Подробнее можно?
Разумеется.
Если программа никогда не попадает в такой вектор, значит и reti там не нужен. Если программа туда попадает - значит в ней ошибка и лечить надо именно эту ошибку. а не маскировать ее последствия.

Как мы помним, прерывания делятся на два типа - прерывания, флаг которых сбрасывается самим фактом перехода на обработчик и прерывания, которые сбрасываются специальными действиями в обработчике.

Если у вас в программе случайно возникает прерывание первого типа и его вектор заглушен reti - это означает, что вы победили не причину, а следствие.
Если возникло прерывание второго типа, то ваша программа просто зациклится на постоянном входе-выходе из прерывания, в случае AVR она еще сможет после каждого выхода выполнить одну команду основной программы. Такое изменение поведения не заметить невозможно и оно заставит вас искать и исправлять ошибку.

Поэтому наиболее правильным, с моей точки зрения, является расстановка на неиспользуемых прерываниях ловушек из бесконечных циклов, возможно с выводом каким-то образом информации о том, в какой именно вектор попали. Или, при наличии отладчика - просто свой пустой цикл на каждом обработчике. Обнаружив программу в таком цикле, сразу становится понятно направление поиска ошибки.

После окончания отладки можно либо убрать эти заглушки и использовать память для чего-то полезного (раз мы туда не попадаем - reti не нужен. Совсем.), либо оставить - тогда попадание в такой цикл позволит сработать собаке.
ILYAUL
Если в программе хоть раз сработает собака - то это г... код. Собака и была придумана для С. Т.ч Жень, disasm тебе в помощь. Не зря же ты ASM знаешь как "Отче Наш"
demiurg1978
Цитата(ILYAUL @ Feb 8 2015, 06:11) *
...

Речь не о говнокоде. Сергей Борщ сам говорит: делать глухое зацикливание. Разговор идет о гипотетической возможности срабатывания неиспользуемого прерывания.
Сергей Борщ
Цитата(ILYAUL @ Feb 8 2015, 02:11) *
Собака и была придумана для С.
Смелое утверждение. Источниками информации поделитесь?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.