Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: alt_printf и прерывания, как подружить
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
RLC
Проблема в том что при загрузке ПО выводятся сообщения в консоль NIOS EDS. Но при приходе прерываний вывод сообщений прекращается. как побороть это. Как сделать вывод сообщений и работу прерываний?
Burenkov Sergey
Цитата(RLC @ Nov 14 2016, 14:22) *
Проблема в том что при загрузке ПО выводятся сообщения в консоль NIOS EDS. Но при приходе прерываний вывод сообщений прекращается. как побороть это. Как сделать вывод сообщений и работу прерываний?

В обработчике нужно сразу сбросить флаг прерывания у того модуля кто его генерит. Если модуль самописный, проверьте что прерывания выставляется правильно, и сбрасывается правильно при записи в соответствующий адрес. Так же в самом обработчике не надо ничего делать, кроме выставления флага о том что было прерывание. Саму логику обработки пишете в главном цикле.
У вас не вывод прекращается, а вообще процессор виснет полностью.
RLC
Цитата(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);
    //реагирование на прерывание

}

Исходя из вышеописанных особенностей реализации прерывания и выложенного кода программ, вы считаете что процессор зависает?
Burenkov Sergey
В Qsys PIO прерывания сконфигурированы на фронт?
RLC
Цитата(Burenkov Sergey @ Nov 15 2016, 17:07) *
В Qsys PIO прерывания сконфигурированы на фронт?

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

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

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

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

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

Да

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

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

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

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.