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

 
 
 
Reply to this topicStart new topic
> alt_printf и прерывания, как подружить
RLC
сообщение Nov 14 2016, 11:22
Сообщение #1


Участник
*

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



Проблема в том что при загрузке ПО выводятся сообщения в консоль NIOS EDS. Но при приходе прерываний вывод сообщений прекращается. как побороть это. Как сделать вывод сообщений и работу прерываний?
Go to the top of the page
 
+Quote Post
Burenkov Sergey
сообщение Nov 15 2016, 07:22
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 10-01-13
Пользователь №: 75 145



Цитата(RLC @ Nov 14 2016, 14:22) *
Проблема в том что при загрузке ПО выводятся сообщения в консоль NIOS EDS. Но при приходе прерываний вывод сообщений прекращается. как побороть это. Как сделать вывод сообщений и работу прерываний?

В обработчике нужно сразу сбросить флаг прерывания у того модуля кто его генерит. Если модуль самописный, проверьте что прерывания выставляется правильно, и сбрасывается правильно при записи в соответствующий адрес. Так же в самом обработчике не надо ничего делать, кроме выставления флага о том что было прерывание. Саму логику обработки пишете в главном цикле.
У вас не вывод прекращается, а вообще процессор виснет полностью.

Сообщение отредактировал Burenkov Sergey - Nov 15 2016, 07:25
Go to the top of the page
 
+Quote Post
RLC
сообщение Nov 15 2016, 14:00
Сообщение #3


Участник
*

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



Цитата(Burenkov Sergey @ Nov 15 2016, 10:22) *
В обработчике нужно сразу сбросить флаг прерывания у того модуля кто его генерит. Если модуль самописный, проверьте что прерывания выставляется правильно, и сбрасывается правильно при записи в соответствующий адрес. Так же в самом обработчике не надо ничего делать, кроме выставления флага о том что было прерывание. Саму логику обработки пишете в главном цикле.
У вас не вывод прекращается, а вообще процессор виснет полностью.

Хммм... У меня прерывания приходят на, специально для этих целей установленные, pio состоящие из 1 контакта. Обработчик прерывания 1 в 1 как из даташита алтеры. Прерывания регистрируются по переднему(восходящему) фронту. Само прерывание не сбрасывается сразу. По причине того что оно фактически работает только по фронту, то требований таких мы и не выставляли. После всех действий необходимых для обработчика прерывания от pio(из даташита) вызывается функция которая и выполняет требуемые действия. код вот такой выходит:
Код
volatile int edge_capture_mpvs_ctrl;
static void init_brightness_irq(){
    /* Recast the edge_capture pointer to match the
    alt_irq_register() function prototype. */
    void* edge_capture_ptr = (void*) &edge_capture_mpvs_ctrl;
    /* Enable all 4 button interrupts. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0xf);
    /* Reset the edge capture register. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0x0);
    /* Register the ISR. */
    #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
    alt_ic_isr_register(
                                LB_MPVS_IRQ_BRIGHTNESS_IRQ_INTERRUPT_CONTROLLER_ID,
                                LB_MPVS_IRQ_BRIGHTNESS_IRQ,
                                brightness_irq,
                                edge_capture_ptr,
                                0x0
                            );
    #else
    alt_irq_register(
                            LB_MPVS_IRQ_BRIGHTNESS_IRQ,
                            edge_capture_ptr,
                            brightness_irq
                        );
    #endif
}

static void  brightness_irq(void* context) {
    volatile int* edge_capture_ptr = (volatile int*) context;
    /*
    * Read the edge capture register on the button PIO.
    * Store value.
    */
    *edge_capture_ptr =IORD_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE);
    /* Write to the edge capture register to reset it. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE, 0);
    /* Read the PIO to delay ISR exit. This is done to prevent a
    spurious interrupt in systems with high processor -> pio
    latency and fast interrupts. */
    IORD_ALTERA_AVALON_PIO_EDGE_CAP(LB_MPVS_IRQ_BRIGHTNESS_BASE);
    //реагирование на прерывание

}

Исходя из вышеописанных особенностей реализации прерывания и выложенного кода программ, вы считаете что процессор зависает?

Сообщение отредактировал RLC - Nov 15 2016, 14:08
Go to the top of the page
 
+Quote Post
Burenkov Sergey
сообщение Nov 15 2016, 14:07
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 10-01-13
Пользователь №: 75 145



В Qsys PIO прерывания сконфигурированы на фронт?
Go to the top of the page
 
+Quote Post
RLC
сообщение Nov 15 2016, 14:08
Сообщение #5


Участник
*

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



Цитата(Burenkov Sergey @ Nov 15 2016, 17:07) *
В Qsys PIO прерывания сконфигурированы на фронт?

да
Go to the top of the page
 
+Quote Post
Burenkov Sergey
сообщение Nov 15 2016, 14:26
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 10-01-13
Пользователь №: 75 145



По коду вроде бы все ок, без проекта тяжело понять где косяк. У вас один пин только используется? Маска у вас для 4 линий настроена
Go to the top of the page
 
+Quote Post
RLC
сообщение Nov 15 2016, 15:07
Сообщение #7


Участник
*

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



Цитата(Burenkov Sergey @ Nov 15 2016, 17:26) *
По коду вроде бы все ок, без проекта тяжело понять где косяк. У вас один пин только используется? Маска у вас для 4 линий настроена

Маска да, но реально pio c 1 пином. исключительно для прерывания.

Когда вы отвечали на мой вопрос в самом начале, то имели ввиду ситуацию когда прерывание настроено по уровню и в этом случае при взведённом прерывании пока оно не сбросится процессор будет находится в этом состоянии? Случай этот вы предполагали?

А про конкретно этот проект могу скинуть скрин qsys проекта. в общем то и сам qsys-файл. Если это поможет делу.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Burenkov Sergey
сообщение Nov 15 2016, 21:04
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 10-01-13
Пользователь №: 75 145



Цитата(RLC @ Nov 15 2016, 18:07) *
Маска да, но реально pio c 1 пином. исключительно для прерывания.

Когда вы отвечали на мой вопрос в самом начале, то имели ввиду ситуацию когда прерывание настроено по уровню и в этом случае при взведённом прерывании пока оно не сбросится процессор будет находится в этом состоянии? Случай этот вы предполагали?

Да

Цитата(RLC @ Nov 15 2016, 18:07) *
А про конкретно этот проект могу скинуть скрин qsys проекта. в общем то и сам qsys-файл. Если это поможет делу.

Лучше весь проект

Go to the top of the page
 
+Quote Post
RLC
сообщение Nov 16 2016, 11:15
Сообщение #9


Участник
*

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



Цитата(Burenkov Sergey @ Nov 16 2016, 00:04) *
Лучше весь проект


Прикрепленные файлы
Прикрепленный файл  NIOS.zip ( 58.83 килобайт ) Кол-во скачиваний: 11
 
Go to the top of the page
 
+Quote Post

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

 


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


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