|
затыкается stdout в NiosII, из-за прерываний |
|
|
|
Feb 24 2011, 15:13
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Возникла проблема. В программе под 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); // //} Это как-то лечится, не? Отчего происходят такие сбои?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Feb 25 2011, 04:44
|

Гуру
     
Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988

|
во, нашел. ваш косяк, думаю, видно где: Код #include <stdio.h> #include "alt_types.h" #include "system.h" #include <sys/alt_irq.h> #include "altera_avalon_timer_regs.h"
void timer_interrupt_latency_irq() { IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0); alt_ic_irq_disable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ); printf("Hello timer!\n"); alt_ic_irq_enable(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ); printf("IRQ enabled!\n"); }
int main() { printf("Hello from Nios II!\n"); /* Register the interrupt */ alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ, timer_interrupt_latency_irq, TIMER_0_BASE, NULL); /* Start timer */ IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,10000); IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,10000); IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE,1000); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); while (1);//Event Loop return 0; }
|
|
|
|
|
Dec 8 2011, 15:51
|
Местный
  
Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701

|
Ох, мужики, это опасное дело -- вызывать файловые операции в обработчике прерываний. Всё зависит от реентерабельности этих самых функций -- если они на середине вывода имеют половину служебных переменных в стеке, половину глобальных, и тут влазит новый вызов, который окончится ранее продолжения старого, х.з. что там по окончании обоих намешается... В мануалах надо искать положительные разрешения, и вряд ли Альтерцы закладывали много мозгов в свой детский проц. В каких-то конкретных проверенных нечастых случаях для отладки может и можно, но осторожно, и потом сразу лучше наложить табу обратно  Ведь если число желаемых символов по каналу за 1 с превысит его пропускную способность, где-то кого-то кто-то перетрёт в буферах или отбросится в лучшем случае. В настоящих многозадачных ОС обычно для обработчиков семафоры ждать запрещается, файлы трогать тем более, надо сигналить куда-то семафором или в переменную, записывать всю ситуацию в глобальные переменные, тикать побыстрее, а потом снаружи в нормальном потоке разбираться и сливать инфу без спешки. А если сама функция вывода использует прерывания для обратной сигнализации, то фиг вообще первое прерывание закончится с принтфом  Если прерываний несколько разных, то обычно они отсортированы по приоритету, и то же самое произойти не может уже в обработчике, но более крутое запросто. И такие хитроглюки могут прятаться редкие... Я у себя в проектах стараюсь обходиться без прерываний -- поллинг вполне годится для 99% задач, плюс верифицируется и отлаживается на порядки проще.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|