|
|
  |
PIT прерывается лишь однажды |
|
|
|
May 5 2008, 09:29
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Хочу прерываться от ПИТа.Тестирую в дебаггере кейла. В дебаггере прерывание происходить лишь однажды.Почему?Что не так? Соответственно,в АРМах я совсем новичок...
#include <AT91SAM7X256.H> /* AT91SAMT7X256 definitions */ #include <lib_AT91SAM7X256.h>
static int aaa=0; static int bbb=0;
void Periodic_Interval_Timer_handler (void) { bbb=1; }
int main (void) { AT91F_PITInit(AT91C_BASE_PITC,1000,12); // enable and initialize PIT AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,7,1,Periodic_Interval_Timer_ha ndler); AT91F_PITC_CfgPMC(); // enable peripheral clock for PIT AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS); AT91F_PITEnableInt(AT91C_BASE_PITC); while(!bbb) ; while(1) aaa++;
}
|
|
|
|
|
May 5 2008, 09:43
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(npopok @ May 5 2008, 12:29)  void Periodic_Interval_Timer_handler (void) { bbb=1; } Не хватает записи в регистр AIC_EOICR по окончанию обработчика. И что-то мне не понятно, является ли эта функция обработчиком IRQ или она просто обычная функция. Обработчик должен сохранять и восстанавливать контекст а так-же правильно выходить из режима IRQ. В разных компиляторах для этого используются разные методы и ключевые слова.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
May 5 2008, 10:21
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Написал void Periodic_Interval_Timer_handler (void) { bbb=1; AT91C_BASE_AIC->AIC_EOICR=1; }
ничего не изменилось.Как был один раз, так и остался.
Насколько понял я,функция, взятая из библиотеки, включенной в кейл, сама прописывает irq и не надо писать __irq.я не прав?К тому же разок-то прерывание есть...Вот она __inline unsigned int AT91F_AIC_ConfigureIt ( AT91PS_AIC pAic, // \arg pointer to the AIC registers unsigned int irq_id, // \arg interrupt number to initialize unsigned int priority, // \arg priority to give to the interrupt unsigned int src_type, // \arg activation and sense of activation void (*newHandler) () ) // \arg address of the interrupt handler { unsigned int oldHandler; unsigned int mask ;
oldHandler = pAic->AIC_SVR[irq_id];
mask = 0x1 << irq_id ; //* Disable the interrupt on the interrupt controller pAic->AIC_IDCR = mask ; //* Save the interrupt handler routine pointer and the interrupt priority pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; //* Store the Source Mode Register pAic->AIC_SMR[irq_id] = src_type | priority ; //* Clear the interrupt on the interrupt controller pAic->AIC_ICCR = mask ;
return oldHandler;
|
|
|
|
|
May 5 2008, 10:37
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Использую такой код: Код status = AT91C_BASE_PITC->PITC_PIVR; /* одновременно снимется флаг прерывания таймера */ AT91C_BASE_AIC->AIC_IVR = 0; /* Debug variant of vector read (protect mode is used) */ AT91C_BASE_AIC->AIC_ICCR = BIT(AT91C_ID_SYS); /* Clear timer #0 interrupt */ AT91C_BASE_AIC->AIC_EOICR = 0; /* Signal end of interrupt */
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
May 5 2008, 11:02
|
Группа: Участник
Сообщений: 10
Регистрация: 4-05-08
Пользователь №: 37 271

|
Да, надо было все таки писать __irq. С чего я взял, что не надо!?написал __irq void Periodic_Interval_Timer_handler (void) и AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,7,1,(void (*)())Periodic_Interval_Timer_handler); и стало нормально.всем спасибо.заодно еще и узнал, что тут надо интеррупты по-специальному заканчивать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|