RLC 0 30 марта, 2017 Опубликовано 30 марта, 2017 (изменено) · Жалоба Добрый день, форумчане. Возникла проблема с временем срабатывания таймера 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; } Изменено 30 марта, 2017 пользователем RLC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RLC 0 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Добрый день, форумчане. Возникла проблема с временем срабатывания таймера 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. Причина описанного поведения встроенного драйвера мне не ясна. К сожалению времени на выяснение причин у меня нет. В связи с этим тему можно закрыть, тк задача выполнена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться