Перейти к содержанию
    

NIOS II Interval timer

Добрый день, форумчане.

Возникла проблема с временем срабатывания таймера interval timer.

Задача состоит в использовании таймера как счётчика времени в 40 мс и по прошествии этого времени выполнять некоторые действия.

После этого остановить таймер и запустить через некоторое время( не известное точно но не ранее чем в 700 мкс). Кроме этого таймер может использоваться для других нужд, с другими временными интервалами, которые настраивать программно было бы приоритетно.

Для этого таймер настроил на срабатывание каждые 1 мс и использовал функцию alt_alarm_start();. Однако при тестировании обнаружил что время реагирования на прерывание допустимое ( 170-180 мкс), а время выхода из прерыания более чем 0,3 сек.

Вопрос: это нормально, что такое большое время возвращения из прерывания или я что то не корректно делаю?

Для наглядности прикладываю скрин сигналтап с частотой синхронизации в 400КГц и памятью в 128КБ, исходный код тестового приложения которое

инвертирует значение светодиодов при каждом срабатывании и настройки таймера и bsp.

использую Quartus 12.1 NIOS II full с кэшем данных и кэшем инструкций. Использую в качестве контроллера прерывания IIC.

/*---------------------------------------------------------------------
*                        START TIMER
*    nticks-количество тиков после которого срабатывает функция callback
* callback- функция обработчик.
----------------------------------------------------------------------*/
void start_timer(alt_u32 nticks,alt_u32 (*callback) (void*)){
     if(alt_alarm_start (    &my_alarm, nticks,callback,(void*)0)<0){
         uart_printf("\nNo system clock available\n ");
     }
}
//-----------------------------------------------------------------------
/*---------------------------------------------------------------------
*                        ОБРАБОТЧИК ПРЕРЫВАНИЯ
----------------------------------------------------------------------*/
alt_u32 handler_timer_irq(void* i){
    alt_u32 led=IORD_32DIRECT(LB_MPVS_AVALON_SLAVE_TRANSLATION_BASE,0x48);
    IOWR_32DIRECT(LB_MPVS_AVALON_SLAVE_TRANSLATION_BASE,0x48,~(led));
    alt_u32 tick=alt_ticks_per_second();
    return tick;
}
//-----------------------------------------------------------------------
int main(){
    start_timer(1,handler_timer_irq);
    while (1){}
    return 0;
}

post-83740-1490863768_thumb.jpg

post-83740-1490863779_thumb.jpg

post-83740-1490863784_thumb.jpg

Изменено пользователем RLC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, форумчане.

Возникла проблема с временем срабатывания таймера interval timer.

Задача состоит в использовании таймера как счётчика времени в 40 мс и по прошествии этого времени выполнять некоторые действия.

После этого остановить таймер и запустить через некоторое время( не известное точно но не ранее чем в 700 мкс). Кроме этого таймер может использоваться для других нужд, с другими временными интервалами, которые настраивать программно было бы приоритетно.

Для этого таймер настроил на срабатывание каждые 1 мс и использовал функцию alt_alarm_start();. Однако при тестировании обнаружил что время реагирования на прерывание допустимое ( 170-180 мкс), а время выхода из прерыания более чем 0,3 сек.

Вопрос: это нормально, что такое большое время возвращения из прерывания или я что то не корректно делаю?

Для наглядности прикладываю скрин сигналтап с частотой синхронизации в 400КГц и памятью в 128КБ, исходный код тестового приложения которое

инвертирует значение светодиодов при каждом срабатывании и настройки таймера и bsp.

использую Quartus 12.1 NIOS II full с кэшем данных и кэшем инструкций. Использую в качестве контроллера прерывания IIC.

/*---------------------------------------------------------------------
*                        START TIMER
*    nticks-количество тиков после которого срабатывает функция callback
* callback- функция обработчик.
----------------------------------------------------------------------*/
void start_timer(alt_u32 nticks,alt_u32 (*callback) (void*)){
     if(alt_alarm_start (    &my_alarm, nticks,callback,(void*)0)<0){
         uart_printf("\nNo system clock available\n ");
     }
}
//-----------------------------------------------------------------------
/*---------------------------------------------------------------------
*                        ОБРАБОТЧИК ПРЕРЫВАНИЯ
----------------------------------------------------------------------*/
alt_u32 handler_timer_irq(void* i){
    alt_u32 led=IORD_32DIRECT(LB_MPVS_AVALON_SLAVE_TRANSLATION_BASE,0x48);
    IOWR_32DIRECT(LB_MPVS_AVALON_SLAVE_TRANSLATION_BASE,0x48,~(led));
    alt_u32 tick=alt_ticks_per_second();
    return tick;
}
//-----------------------------------------------------------------------
int main(){
    start_timer(1,handler_timer_irq);
    while (1){}
    return 0;
}

 

 

В общем я решил задачу написав собственный драйвер для блока interval timer от Altera. Причина описанного поведения встроенного драйвера мне не ясна. К сожалению времени на выяснение причин у меня нет. В связи с этим тему можно закрыть, тк задача выполнена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...