Возникла проблема с временем срабатывания таймера 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;
}
* 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;
}