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

 
 
> Как запустить таймер?
juvf
сообщение Jan 17 2011, 10:08
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



в ниосе есть таймер и уарт. Написал обработчик уарт, в обработчике запускаю таймер. Таймер отрабатывает и вызывается обработчик таймера.

Теперь понадобилось запустить таймер не из обработчика прерывания уарт, а из главного цыкла while(1) в main. Программа виснет. Посмотрел где стоим.... в функции void alt_irq_handler (void) на цикле
Код
do
  {
    i = 0;
    mask = 1;

    /*
     * Test each bit in turn looking for an active interrupt. Once one is
     * found, the interrupt handler asigned by a call to alt_irq_register() is
     * called to clear the interrupt condition.
     */

    do
    {
      if (active & mask)
      {
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
        alt_irq[i].handler(alt_irq[i].context);
#else
        alt_irq[i].handler(alt_irq[i].context, i);
#endif
        break;
      }
      mask <<= 1;
      i++;

    } while (1);

    active = alt_irq_pending ();
    
  } while (active);
alt_irq_pending () всегда возвращает 0х100. Из do-while ни когда не выходит. Почему?

иницыализацию таймера делаю так
Код
void init()
{
    //настройка таймера для HEX монитора
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMERSEGLED_BASE, 0);
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
    alt_ic_isr_register(TIMERSEGLED_IRQ_INTERRUPT_CONTROLLER_ID, TIMERSEGLED_IRQ, timerHexInt, (void*)TIMERSEGLED_BASE, NULL);    // обозначение прерывания
        /* Start timer */
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMERSEGLED_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK    | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
#else
    /* Register the interrupt */
    alt_irq_register(TIMERSEGLED_IRQ, TIMERSEGLED_BASE, timerHexInt);
    /* Start timer */
    IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMERSEGLED_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
    | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
#endif
}
При инициализации ALT_ENHANCED_INTERRUPT_API_PRESENT определён.
Что я делаю не так? Почему не попадаю в обработчик прерывания? Почему зависаю в alt_irq_handler (void)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vadimuzzz
сообщение Jan 17 2011, 12:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



если не добавляли контроллеров, то используется внутренний контроллер прерываний. alt_irq_pending работает только для него, возвращает 8-е прерывание (таймер). смотрите, заходит ли в alt_irq[i].handler(alt_irq[i].context). содержимое стр-ры alt_irq[i] гляньте. либо не заходит в обработчик (не зарегистрирована или неправильно зарегистрирована функция-callback), либо прерывание не сброшено в обработчике (заклинило)
Go to the top of the page
 
+Quote Post
juvf
сообщение Jan 18 2011, 03:52
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(vadimuzzz @ Jan 17 2011, 17:25) *
если не добавляли контроллеров, то используется внутренний контроллер прерываний. alt_irq_pending работает только для него, возвращает 8-е прерывание (таймер). смотрите, заходит ли в alt_irq[i].handler(alt_irq[i].context). содержимое стр-ры alt_irq[i] гляньте. либо не заходит в обработчик (не зарегистрирована или неправильно зарегистрирована функция-callback), либо прерывание не сброшено в обработчике (заклинило)

Нашел багу в коде. В обработчик прерывания я всётаки попадаю, но в обработчике не сбрасываю флаг прерывания таймера. поэтому выйдя из обработчика, сразуже возвращаюсь в него. Добавил в обработчик сброс флага ТО и все заработало. Спасибо за наставление на путь истенный. Проблема решена.
Go to the top of the page
 
+Quote Post
robix
сообщение Mar 1 2011, 03:07
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 15-08-06
Из: Москва
Пользователь №: 19 556



Цитата(juvf @ Jan 18 2011, 06:52) *
Нашел багу в коде. В обработчик прерывания я всётаки попадаю, но в обработчике не сбрасываю флаг прерывания таймера. поэтому выйдя из обработчика, сразуже возвращаюсь в него. Добавил в обработчик сброс флага ТО и все заработало. Спасибо за наставление на путь истенный. Проблема решена.


Коллега, извиняюсь, в доках не нашел, а как этот флаг очищается? У меня такая же проблема...
Go to the top of the page
 
+Quote Post



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

 


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


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