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

 
 
> Подскажите по прерываниям, Как происходит ветвление в случае System Controller Interrupt??
Димон Безпарольн...
сообщение Apr 5 2011, 11:44
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



До сих пор в системном контроллере у меня прерывания генерировал только интервальный таймер PIT.

Процедура была простой:

Код
__irq void PIT_int (void) {            //Прерывание от интервального таймера (System, переферийный номер 1, стр 35)
    if (*AIC_ISR1 & (1)) {            //Чья здесь стоит единица??????????? Предположительно это Peripheral Id System Controller
        Strob = 1;                    //Установка строба для Main
//Прерывание обязано читать PIT_PIVR для сброса бита PITS, вызывающего прерывание.
        *AIC_EOICR1 = *PIT_PIVR1;}    //Конец прерывания. В EOICR пишется ЛЮБОЕ значение.
    else {*AIC_EOICR1 = 0;}}        //Если источник прерывания не интервальный таймер: конец прерывания


Теперь потребовался Real-time Timer. Но он тоже в System Controller. Я плохо себе представляю - кажется чтение

Цитата
if (*AIC_ISR1 & (1))


Фильтрует прерывание от System Controller (единица это его Peripheral Id). Но в самом системном контроллере теперь два прерывания. Как произвести дальнейшее ветвление??

Сообщение отредактировал Димон Безпарольный - Apr 5 2011, 11:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 5 2011, 11:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Димон Безпарольный @ Apr 5 2011, 15:44) *
Как произвести дальнейшее ветвление??

Вручную проверить возможные источники, только так.

Проверять AIC_ISR не нужно, тем более столь экстравагантным способом.

Если хотите использовать RTT, то нужно учесть, что его линия прерывания сбрасывается не сразу, а через 2 цикла SCLK. Т.е. будете терять 60us впустую.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Apr 5 2011, 12:53
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(aaarrr @ Apr 5 2011, 14:48) *
Вручную проверить возможные источники, только так.

Проверять AIC_ISR не нужно, тем более столь экстравагантным способом.

Если хотите использовать RTT, то нужно учесть, что его линия прерывания сбрасывается не сразу, а через 2 цикла SCLK. Т.е. будете терять 60us впустую.

AIC_ISR я проверяю способом из примера. Если не трудно, подскажите что в нем экстравагантного?

Если не проверять AIC_ISR, то каким способом можно осуществить ветвление? Т.е. вопрос - то и был в том, как проверять источники таких прерываний?

Сообщение отредактировал Димон Безпарольный - Apr 5 2011, 12:54
Go to the top of the page
 
+Quote Post
sasamy
сообщение Apr 5 2011, 17:40
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Димон Безпарольный @ Apr 5 2011, 16:53) *
AIC_ISR я проверяю способом из примера. Если не трудно, подскажите что в нем экстравагантного?


Если не нужен быстрый переход на обработчик (тогда в SVR записывают адрес обработчика) - в SVR удобно вписывать ID периферии.
Код
       for (i = 0; i < NIRQS; i++) {
               /* Put irq number in Source Vector Register */
               AIC_SVR[i] = i;

               /* Unstack nested interrupts */
               if (i < 8)
                       AIC_EOICR = 0;
       }

       /* Spurious Interrupt ID in Spurious Vector Register is NIRQS */
       AIC_SPU = NIRQS;


Тогда при чтении IVR сразу получаете ID прерывания

Код
       /* Get interrupt source */
       vector = AIC_IVR;

       /* Detects a spurious interrupt */
       if (vector == NIRQS)
               goto out;

       /* Dispatch interrupt */
       irq_handler(vector);
...........

out:
       /* Restore the previous current level if one exists on the stack */
       AIC_EOICR = 0;


Чтобы максимально ускороить определение IRQ можно вместо PIT использовать например TC0, помоему в атмеловских примерах так и делают.

Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 5 2011, 17:56
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



[quote name='sasamy' date='Apr 5 2011, 21:40' post='910844']

А почему не пользоваться механизмом AIC, предлагаемым Atmel? Когда переход на процедуру прерываний формируется автоматом, а в процедуре ID_SYS делать необходимые разборки по OR-источнику?

З.Ы. Это конечно создает зависимость от среды программирования и лишних (левых) просмотров статусных регистров, но? Как обычно, палка о двух концах.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Димон Безпарольный   Подскажите по прерываниям   Apr 5 2011, 11:44
|- - aaarrr   Цитата(Димон Безпарольный @ Apr 5 2011, 16...   Apr 5 2011, 12:58
||- - Димон Безпарольный   Цитата(aaarrr @ Apr 5 2011, 15:58) Читать...   Apr 5 2011, 13:32
||- - aaarrr   Цитата(Димон Безпарольный @ Apr 5 2011, 17...   Apr 5 2011, 13:51
||- - Димон Безпарольный   Цитата(aaarrr @ Apr 5 2011, 16:51) Увы, т...   Apr 5 2011, 13:54
|- - sasamy   Цитата(DmitryM @ Apr 5 2011, 21:56) З.Ы. ...   Apr 5 2011, 18:04
|- - aaarrr   Цитата(sasamy @ Apr 5 2011, 22:04) Пример...   Apr 5 2011, 18:17
||- - sasamy   Цитата(aaarrr @ Apr 5 2011, 22:17) Ладно,...   Apr 5 2011, 18:20
|- - DmitryM   Цитата(sasamy @ Apr 5 2011, 22:04) Пример...   Apr 5 2011, 20:14
|- - sasamy   Цитата(DmitryM @ Apr 6 2011, 00:14) З.Ы. ...   Apr 6 2011, 00:34
- - aaarrr   Вы рискуете вообще потерять прерывания от System C...   Apr 5 2011, 13:58
- - Димон Безпарольный   Цитата(aaarrr @ Apr 5 2011, 16:58) Вы рис...   Apr 6 2011, 06:41


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

 


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


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