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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Приоритет прерываний в AVR, что он означет?
demiurg_spb
сообщение Aug 13 2010, 13:10
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(777777 @ Aug 12 2010, 11:54) *
Да, есть такое. Этот ISR в самом начале вставляет sei. Это лучше, чем вставлять его после сохранения регистров...
Это не только лучше, но и хуже т.к. в компиляторе похоже бага по части ISR_NOBLOCK:(.
Он поступает ровно так как Вы и сказали - тупо ставит sei в самом начале обработчика.
А если у вас в обработчике есть стековые переменные - всё может пойти в тар-тарары..
Т.к. он модифицирует указатель стека не в критической секции (забыв что прерывания уже разрешены)
Код
280 0116 DEBF              out __SP_H__,r29
282 011a CDBF              out __SP_L__,r28

а должен бы так:
Код
278 0112 0FB6              in __tmp_reg__,__SREG__
279 0114 F894              cli
280 0116 DEBF              out __SP_H__,r29
281 0118 0FBE              out __SREG__,__tmp_reg__
282 011a CDBF              out __SP_L__,r28


Для решения сей баги есть стандартный ход:
Код
ISR(MY_ISR)  
{
    sei();

    code....

    cli();
}


Цитата(Блин. Побрился клоками :( @ Aug 12 2010, 23:29) *
Вообщем так, молодёжь!
Объясняю на пальцах.
При возникновении разрешённого прерывания сбрасывается влаг глобального разрешения прерываний в SREG и осуществляется переход на процедуру
обработки прерывания по соответствующему вектору.
Если в обработчике прерываний "вручную" установить флаг глобального разрешения прерываний в SREG, то возможно получить вложенные прерывания.

Согласен.

Цитата
Причём более "низко" приоритетное может прервать более "высоко" приоритетное прерывание.
Не согласен.
Все остальные разрешённые прерывания могут прервать выполнение текущей ISR с вручную установленным флагом I внутри этой ISR.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 14 2010, 15:14
Сообщение #17


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

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



Цитата(Блин. Побрился клоками :( @ Aug 13 2010, 21:38) *
А кто с Вами спорит или этого не знал? LOL
После прочтения этой темы у меня есть уверенность, что ВСЕ высказавшиеся в этой теме до моего сообщения

Спасибо конечно за никому не нужные сведения . Но вопрос был совершенно другой.


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Aug 17 2010, 03:52
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Код
adc_rdy_irq:
        SEI
        PUSH    R16
        IN    R16,SREG
        PUSH    R16
        LDI    R16,255
        STS    AdcStruc+48,R16
        POP    R16
        OUT    SREG,R16
        POP    R16
        RETI


Заметил ошибку. Разрешать прерывания в прерываниях надо ТОЛЬКО после сохранения SREG!!!!

Код
adc_rdy_irq:
        PUSH    R16
        IN    R16,SREG
        PUSH    R16
        SEI             ; !!!!!!!!!!!!!!!!!!!!!!!!!!!
        LDI    R16,255
        STS    AdcStruc+48,R16
        POP    R16
        OUT    SREG,R16
        POP    R16
        RETI
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 17 2010, 10:26
Сообщение #19


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(alexeyv @ Aug 17 2010, 07:52) *
Заметил ошибку. Разрешать прерывания в прерываниях надо ТОЛЬКО после сохранения SREG!!!!

Совсем не обязательно. Если возникнет другое прерывание, SREG сохранится в его обработчике. Проблемы могут возникнуть в случае, описанном здесь - если в обработчике объявляются локальные переменные в стеке. Но это трудно проверить так как обычно компилятор располагает их в регистврах, а если их не хватит, может компилятор окажется не таки уж и глупым и вставит sei после инкремента указателя стека. А во-вотрых, не все устройства сбрасывают прерывание по входу в обработчик (например TWI). Но в этих случаях его и "вручную" нельзя разрешать.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 17 2010, 14:04
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(alexeyv @ Aug 17 2010, 08:52) *
Заметил ошибку. Разрешать прерывания в прерываниях надо ТОЛЬКО после сохранения SREG!!!!

В SREG на входе в прерывание I всегда нулевой. На выходе из прерывания RETI всегда I устанавливает в 1.
Отсюда вопрос - почему "после сохранения SREG"?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 17 2010, 16:15
Сообщение #21


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

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



Цитата(GetSmart @ Aug 17 2010, 18:04) *
В SREG на входе в прерывание I всегда нулевой. На выходе из прерывания RETI всегда I устанавливает в 1.
Отсюда вопрос - почему "после сохранения SREG"?

Вошёл- сохранил temp-"вылетел"- там чего то своё поделала, вернулась , а SREG то уже может быть и другой, я так думаю


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 17 2010, 17:00
Сообщение #22


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ILYAUL @ Aug 17 2010, 21:15) *
Вошёл- сохранил temp-"вылетел"- там чего то своё поделала, вернулась , а SREG то уже может быть и другой, я так думаю

То есть другое прерывание исказило SREG?
Я вообще не вижу никакой проблемы когда разрешать глобальные прерывания внутри прерывания в AVR.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 15:04
Рейтинг@Mail.ru


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