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

 
 
 
Reply to this topicStart new topic
> PIT прерывается лишь однажды
npopok
сообщение May 5 2008, 09:29
Сообщение #1





Группа: Участник
Сообщений: 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++;

}
Go to the top of the page
 
+Quote Post
amw
сообщение May 5 2008, 09:43
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
npopok
сообщение May 5 2008, 10:21
Сообщение #3





Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 10:28
Сообщение #4


Гуру
******

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



Цитата(npopok @ May 5 2008, 14:21) *
Насколько понял я,функция, взятая из библиотеки, включенной в кейл, сама прописывает irq и не надо писать __irq.я не прав?

Не правы. Надо написать:
Код
__irq void Periodic_Interval_Timer_handler(void)
{
    bbb=1;
    AT91C_BASE_AIC->AIC_EOICR=1;
}
Go to the top of the page
 
+Quote Post
vet
сообщение May 5 2008, 10:37
Сообщение #5


Знающий
****

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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
npopok
сообщение May 5 2008, 11:02
Сообщение #6





Группа: Участник
Сообщений: 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);
и стало нормально.всем спасибо.заодно еще и узнал, что тут надо интеррупты по-специальному заканчивать
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 00:07
Рейтинг@Mail.ru


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