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

 
 
> Ошибка с прерываниями Nios2
torik
сообщение Feb 27 2008, 12:35
Сообщение #1


Гуру
******

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



Имеем PIO 8 бить вход с прерыванием по переднему фронту. IRQ=2 в сопсбилдере.
Нужно обработать прерывания от него.
Делаем все по учебнику:

Код
static void handle_button_interrupts(void* context, alt_u32 id) {
    
СЮДА ХОТЕЛОСЬ БЫ ПОПАСТЬ
    /* cast the context pointer to an integer pointer. */
    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(PIO_2_BASE);
    /* Write to the edge capture register to reset it. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_2_BASE, 0);
    /* reset interrupt capability for the Button PIO. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_2_BASE, 0xff);
}

// Настройка прерывания от PIO_2
static void init_button_pio() {
    /* Recast the edge_capture pointer to match the
    alt_irq_register() function prototype. */
    void* edge_capture_ptr = (void*) &edge_capture;
    /* Enable all 4 button interrupts. */
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_2_BASE, 0xff);
    /* Reset the edge capture register. */
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_2_BASE, 0x0);
    /* Register the ISR. */
    alt_irq_register(PIO_2_IRQ, edge_capture_ptr, handle_button_interrupts);
}


Код
...
   init_button_pio();
...

Что получается - глядим дебагером. Когда доходит до одной из функций alt_irq_ччч (к примеру alt_irq_register, а в ней alt_irq_disable_all...) получаем сообщение: "Source not found."

Что это значит, ошибка где? Все что не касается прерываний этого PIO работает нормально...


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Волощенко
сообщение Feb 27 2008, 19:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Цитата(torik @ Feb 27 2008, 14:35) *
Что это значит, ошибка где? Все что не касается прерываний этого PIO работает нормально...

Аналогичная ситуация. Вот, такой же текст, только на 4-е кнопки (BUTTON_PIO по SOPC):
........
volatile int edge_capture;
........
static void handle_button_interrupts(void* context, alt_u32 id)
{volatile int* edge_capture_ptr = (volatile int*) context;
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
}
static void init_button_pio()
{void* edge_capture_ptr = (void*) &edge_capture;
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
alt_irq_register(BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts);
}

int main()
{
........
init_button_pio();
........

}

Только я отлаживал в железе. Все работает в другой программе при программном опросе через 1мс. А при таком, с прерыванием, похоже, что в handle_button_interrupts совсем не заходит (ставил там ловушки). Вроде все по учебнику, а не понятно...
Функция alt_irq_register() возвращает ноль (проверено), она же должна разрешить прерывания (так написано в учебнике).
Кто уже осилил прерывания? Что еще здесь не так?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 3rd September 2025 - 00:02
Рейтинг@Mail.ru


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