Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOS II Interval timer
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
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;
}
RLC
Цитата(RLC @ Mar 30 2017, 11:50) *
Добрый день, форумчане.
Возникла проблема с временем срабатывания таймера 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. Причина описанного поведения встроенного драйвера мне не ясна. К сожалению времени на выяснение причин у меня нет. В связи с этим тему можно закрыть, тк задача выполнена.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.