реклама на сайте
подробности

 
 
> Неиспользуемые прерывания. IAR
demiurg1978
сообщение Jan 31 2015, 19:13
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Можно ли задать компилятору, чтобы он вместо перехода на начало программы векторы неиспользуемых прерываний забил командами reti?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
megajohn
сообщение Jan 31 2015, 21:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



General options->System->Initialize unused interrupts vectors with RETI= TRUE


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Jan 31 2015, 22:29
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Благодарю! Оказывается, эта галка у меня стоит. Просто последний раз в векторы прерываний я заглядывал в AVR Toolchain, и там были переходы на начало программы. Думал, что и у IAR также. И не посмотрел, прежде чем спросить. С другой стороны, я теперь знаю, что такая настройка есть.
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Feb 6 2015, 07:59
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Хотелось бы выслушать мнение профессионалов. На одном форуме высказались, что неиспользуемые векторы прерываний забитые reti - это не есть хорошо.
Ваше мнение?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 6 2015, 08:06
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Да, это не есть хорошо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Feb 6 2015, 08:13
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(Сергей Борщ @ Feb 6 2015, 14:06) *
Да, это не есть хорошо.

Подробнее можно?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Feb 6 2015, 08:17
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



если на не используемые прерывания стоят reti
1. вы не контролируете свою программу и не контролируете что в ней происходит само собой
2. процессорное время тратиться в пустую на обслуживание ненужных прерываний


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Feb 6 2015, 08:28
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



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

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

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

2 - В начале программы ставим флаг или еще что. Когда произошло неконтролируемое прерывание, программа видит что флаг установлен, значит ошибка.

Сообщение отредактировал demiurg1978 - Feb 6 2015, 08:30
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 6 2015, 12:05
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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

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

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

После окончания отладки можно либо убрать эти заглушки и использовать память для чего-то полезного (раз мы туда не попадаем - reti не нужен. Совсем.), либо оставить - тогда попадание в такой цикл позволит сработать собаке.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 8 2015, 00:11
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Если в программе хоть раз сработает собака - то это г... код. Собака и была придумана для С. Т.ч Жень, disasm тебе в помощь. Не зря же ты ASM знаешь как "Отче Наш"


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Feb 8 2015, 05:40
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(ILYAUL @ Feb 8 2015, 06:11) *
...

Речь не о говнокоде. Сергей Борщ сам говорит: делать глухое зацикливание. Разговор идет о гипотетической возможности срабатывания неиспользуемого прерывания.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 8 2015, 07:52
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ILYAUL @ Feb 8 2015, 02:11) *
Собака и была придумана для С.
Смелое утверждение. Источниками информации поделитесь?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016