В программе под NiosII используется вывод в консоль fprintf. Очень удобно для отладки.
Добавил в систему VIC и написал обработчик прерываний для таймера. Таймер генерит прерывание с периодом 1мс.
И тут у меня начал затыкаться вывод в stdout (в функции main в бесконечном цикле). Как только я закоментил код обработчика прерываний, все заработало:
Код
//********************** ISR functions **************************************************
//void timer_interrupt_init (void* base, alt_u32 irq_controller_id, alt_u32 irq)
//{
// /* Register the interrupt */
// alt_ic_isr_register(irq_controller_id, irq, timer_interrupt_irq, base, NULL);
//
// irq_cnt = 0;
//
// /* Start timer */
// IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
// | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//}
//
//void timer_interrupt_irq (void* base)
//{
// /* Clear TO bit in status register */
// IOWR_ALTERA_AVALON_TIMER_STATUS (base, 0);
//
// if (irq_cnt < 1000) {
// irq_cnt++;
// } else {
// irq_cnt = 0;
// send_tx_buffer(&tx);
// }
//
// /*Start timer */
// IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
// | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//
//}
//void timer_interrupt_init (void* base, alt_u32 irq_controller_id, alt_u32 irq)
//{
// /* Register the interrupt */
// alt_ic_isr_register(irq_controller_id, irq, timer_interrupt_irq, base, NULL);
//
// irq_cnt = 0;
//
// /* Start timer */
// IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
// | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//}
//
//void timer_interrupt_irq (void* base)
//{
// /* Clear TO bit in status register */
// IOWR_ALTERA_AVALON_TIMER_STATUS (base, 0);
//
// if (irq_cnt < 1000) {
// irq_cnt++;
// } else {
// irq_cnt = 0;
// send_tx_buffer(&tx);
// }
//
// /*Start timer */
// IOWR_ALTERA_AVALON_TIMER_CONTROL(base, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
// | ALTERA_AVALON_TIMER_CONTROL_START_MSK);
//
//}
Это как-то лечится, не? Отчего происходят такие сбои?