|
Приоритет прерываний в AVR, что он означет? |
|
|
|
Aug 12 2010, 06:19
|

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

|
В даташитах этот термин есть, но написано лишь что прерывания с меньшим номеров имеют больший приоритет. А что вообще означает это слово? Я считал, что в подобных системах (имеющих лишь один бит в регистре состояния для разрешения/запрещения прерываний) это означает, что если возникнут одновременно два прерывания, то первым будет обрабатываться то, которое имеет больший приоритет. Во во время его обработки бит I сбрасывается, но если выполнить sei, то мы разрешим обработку других прерываний, в том числе и с меньшим приоритетом. Просто потому, что процессор не знает, что он в нанный момент делает - выполняет обработку прерывания или основную программу. Нет у него битов определить это.
Однако сейчас, отлаживая устройство, я обнаружил странную вещь - прерывание таймера не прерывается UART-ом. Обработка UART-а задерживается независимо от того, ставлю ли я sei в начале подпрограммы обработки таймера или не ставлю. Может ли такое быть или у меня глюки? И если может, то как разрешить прерывать таймер во время его обработки?
|
|
|
|
|
 |
Ответов
|
Aug 12 2010, 06:29
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Вы о сохранении и восстановлении SREG -а забываете
Причина редактирования: Бездумное цитирование
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 12 2010, 07:21
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(777777 @ Aug 12 2010, 11:10)  Разумеется SREG сохраняется и восстанавливается, но при чем тут он? В нем есть биты, которые могут запретить прерывания UART-а во время обработки таймера? Даже когда глобальные прерывания разрешены? Код предельно простой (WinAVR): Код ISR(TIMER0_COMPA_vect) { asm("sei"); // дальше обработка таймера // может ли она прерваться если сейчас придет прерывание от UART? // судя по поведению устройства - нет В WinAVR есть SIGNAL, который сам разрешит вложенные прерывания. Код SIGNAL(TIMER0_COMPA_vect) { ......... }
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
Сообщений в этой теме
777777 Приоритет прерываний в AVR Aug 12 2010, 06:19   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 А может таки листинг засветите прологов/эпилогов у... Aug 12 2010, 07:40 777777 Цитата(GetSmart @ Aug 12 2010, 11:40) А м... Aug 12 2010, 07:54  demiurg_spb Цитата(777777 @ Aug 12 2010, 11:54) Да, е... Aug 13 2010, 13:10 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|