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

 
 
 
Reply to this topicStart new topic
> NIOS II Interval timer, Длительное время выхода из обработчика прерывания
RLC
сообщение Mar 30 2017, 08:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-11-14
Из: СПб
Пользователь №: 83 740



Добрый день, форумчане.
Возникла проблема с временем срабатывания таймера 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 - Mar 30 2017, 08:53
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
RLC
сообщение Mar 31 2017, 14:19
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-11-14
Из: СПб
Пользователь №: 83 740



Цитата(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. Причина описанного поведения встроенного драйвера мне не ясна. К сожалению времени на выяснение причин у меня нет. В связи с этим тему можно закрыть, тк задача выполнена.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:27
Рейтинг@Mail.ru


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