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

 
 
> Приоритет прерываний в AVR, что он означет?
777777
сообщение Aug 12 2010, 06:19
Сообщение #1


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

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



В даташитах этот термин есть, но написано лишь что прерывания с меньшим номеров имеют больший приоритет. А что вообще означает это слово? Я считал, что в подобных системах (имеющих лишь один бит в регистре состояния для разрешения/запрещения прерываний) это означает, что если возникнут одновременно два прерывания, то первым будет обрабатываться то, которое имеет больший приоритет. Во во время его обработки бит I сбрасывается, но если выполнить sei, то мы разрешим обработку других прерываний, в том числе и с меньшим приоритетом. Просто потому, что процессор не знает, что он в нанный момент делает - выполняет обработку прерывания или основную программу. Нет у него битов определить это.

Однако сейчас, отлаживая устройство, я обнаружил странную вещь - прерывание таймера не прерывается UART-ом. Обработка UART-а задерживается независимо от того, ставлю ли я sei в начале подпрограммы обработки таймера или не ставлю. Может ли такое быть или у меня глюки? И если может, то как разрешить прерывать таймер во время его обработки?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Aug 12 2010, 07:40
Сообщение #2


.
******

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



А может таки листинг засветите прологов/эпилогов у обоих прерываний.


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


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

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



Цитата(GetSmart @ Aug 12 2010, 11:40) *
А может таки листинг засветите прологов/эпилогов у обоих прерываний.

Прологи/эпилоги обычные, вот например:
Код
ISR(TIMER0_COMPA_vect)
    {
37c:    1f 92           push    r1
37e:    0f 92           push    r0
380:    0f b6           in    r0, 0x3f; 63
382:    0f 92           push    r0
384:    11 24           eor    r1, r1
386:    2f 93           push    r18
388:    8f 93           push    r24
38a:    9f 93           push    r25
и т.д.

Только зачем это? Я всего лишь хотел узнать, можно ли сделать чтобы прерывание от UART могло прервать прерывание таймера. То, что вложенные прерывания возможны в принципе, я знаю, в другой программе АЦП успешно прерывается другими прерываниями, но у него и приоритет ниже. Так может приоритет - это не только порядок в котором будут обрабатываться одновременно пришедшие прерывания, но и невозможность прервать более высокоприоритетное устройство низкоприоритетным?


Цитата(dimka76 @ Aug 12 2010, 11:45) *
Извиняюсь, действительно перепутал.
Полистал сейчас avr-libc-usert-manual и наткнулся вот на какую вещь
#define ISR_NOBLOCK

Да, есть такое. Этот ISR в самом начале вставляет sei. Это лучше, чем вставлять его после сохранения регистров, но на мою программу это не повлияло - UART так и не прерывает таймер.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 13 2010, 13:10
Сообщение #4


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

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- 777777   Приоритет прерываний в AVR   Aug 12 2010, 06:19
- - sKWO   Вы о сохранении и восстановлении SREG -а забываете   Aug 12 2010, 06:29
|- - 777777   Цитата(sKWO @ Aug 12 2010, 10:29) Вы о со...   Aug 12 2010, 07:10
|- - dimka76   Цитата(777777 @ Aug 12 2010, 11:10) Разум...   Aug 12 2010, 07:21
|- - 777777   Цитата(dimka76 @ Aug 12 2010, 11:21) В Wi...   Aug 12 2010, 07:32
|- - dimka76   Цитата(777777 @ Aug 12 2010, 11:32) Ты чт...   Aug 12 2010, 07:45
- - GetSmart   Цитата(777777 @ Aug 12 2010, 11:19) Однак...   Aug 12 2010, 06:56
- - mempfis_   Цитата(777777 @ Aug 12 2010, 09:19) Однак...   Aug 12 2010, 07:02
- - GetSmart   Я всю жизнь думал, что у AVR-ов нет аппаратных при...   Aug 12 2010, 08:14
- - GetSmart   Оно не показано, но оно почти аналогично сделано, ...   Aug 12 2010, 13:50
|- - ILYAUL   Цитата(GetSmart @ Aug 12 2010, 17:50) ......   Aug 12 2010, 16:45
- - alexeyv   ЦитатаКодadc_rdy_irq: SEI PUSH R16 IN R1...   Aug 17 2010, 03:52
- - 777777   Цитата(alexeyv @ Aug 17 2010, 07:52) Заме...   Aug 17 2010, 10:26
- - GetSmart   Цитата(alexeyv @ Aug 17 2010, 08:52) Заме...   Aug 17 2010, 14:04
- - ILYAUL   Цитата(GetSmart @ Aug 17 2010, 18:04) В S...   Aug 17 2010, 16:15
- - GetSmart   Цитата(ILYAUL @ Aug 17 2010, 21:15) Вошёл...   Aug 17 2010, 17:00


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 05:51
Рейтинг@Mail.ru


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