|
Подскажите по прерываниям, Как происходит ветвление в случае System Controller Interrupt?? |
|
|
|
Apr 5 2011, 11:44
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Apr 5 2011, 12:53
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 5 2011, 17:40
|
Знающий
   
Группа: Участник
Сообщений: 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, помоему в атмеловских примерах так и делают.
|
|
|
|
Сообщений в этой теме
Димон Безпарольный Подскажите по прерываниям 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|