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

 
 
> Програмирование MicroBlaze с fast interrupt, ISE 14.2
misyachniy
сообщение Oct 24 2012, 18:22
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



XPS Xilinx при синтезе контроллера прерываний для Microblaze предлагает режим быстрых прерываний.
В контроллере прерываний есть регистр(ы) IVAR для хранения векторов прерываний.
Xilinx предоставляет примеры в которых есть функция XIntc_ConnectFastHandler()
В которой происходит запись в эти регистры.
Код
int XIntc_ConnectFastHandler(XIntc *InstancePtr, u8 Id,  XFastInterruptHandler Handler)

XIntc_Out32(InstancePtr->BaseAddress + XIN_IVAR_OFFSET + (Id * 4), (u32) Handler);

Я сгенерил тестовый пример контроля периферии.Но в нем не вызывается эта функция.
В интернете поиск по слову "XIntc_ConnectFastHandler" не дает ни одной ссылки.

Я попробовал врукопашную завести адреса двух функций в регистры IVAR.
Адреса прописываются и считываются.
Разрешение прерывания и быстрый режим тоже.
Но прерывание больше одного раза не вызывается.
Судя по объявлению таблицы прерываний для обычного режима прерываний:
Код
void __interrupt_handler (void) __attribute__ ((interrupt_handler));

void __interrupt_handler(void)
{
    /* The compiler saves all volatiles and the MSR */
    MB_InterruptVectorTable.Handler(MB_InterruptVectorTable.CallBackRef);
    /* The compiler restores all volatiles and MSR, and returns from interrupt */
}

компилятору нужно принудительно указать, что это функция прерывания.
По аналогии с процессорами ARM я попробовал скомпилировать программу с двумя функциями и дополнительными атрибутами.
Код
__attribute__ ((interrupt_handler)) void Int_Timer0 (void)

В результате получаю ошибку:
Цитата
symbol `_interrupt_handler' is already defined

Для такой ошибки на сайте Xilinx есть только решение для ОС Xilkernel. И тоже похоже на обычный вызов прерывания, когда один обработчик опрашивает в контроллере прерывания индекс прерывания и запускает по таблице векторов, хранящейся в оперативной памяти, требуемую функцию.

Если только одну функцию в программе объявляю с указанным атрибутом, то она успешно вызывается многократно.

Как правильно запрограммировать контроллер на быстрые прерывания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AVR
сообщение Oct 28 2012, 00:46
Сообщение #2


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Я правильно понимаю что проблема, описанная в этой теме, уже решена?
Если можно, я влезу со своим вопросом?

У меня не получается вообще заставить работать прерывания от GPIO (я пока только начинаяю осваивать MicroBlaze). Получается читать пин - нажимаю pushbutton и вижу единицу, а отпускаю вижу ноль, т.е. настраивать напрвление IO и читать значение порта я научился. Теперь проблема заставить работать прерывания по GPIO.

В качестве примера использую xgpio_intr_example.c, но ни такой API через XGpio ни low level примеры так и не помогли мне получить рабочий вариант...

Есть ли какие-нибудь способы отладки проблемы с прерываниями? Какие регистры надо проверить чтобы убедиться что оно должно работать?

Прикрепленный файл  main.txt ( 134 байт ) Кол-во скачиваний: 188
Прикрепленный файл  test_i2c.txt ( 3.88 килобайт ) Кол-во скачиваний: 671
Прикрепленный файл  test_i2c_h.txt ( 414 байт ) Кол-во скачиваний: 138


В файле test_i2c.txt
Код
void gpio_interrupt(void *callback_ref)
{
    xil_printf("GPIO interrupt!\n\r");
    irq_handled = true;
}

bool test_i2c::init_intc()
{
    int res;

    res = XIntc_Initialize(&intc, XPAR_INTC_0_DEVICE_ID);
    if(res != XST_SUCCESS) return false;

    XIntc_Connect(&intc, XPAR_INTC_0_GPIO_0_VEC_ID, (Xil_ExceptionHandler)gpio_interrupt, &gpio);
    XIntc_Enable(&intc, XPAR_INTC_0_GPIO_0_VEC_ID);
    res = XIntc_Start(&intc, XIN_REAL_MODE);
    if(res != XST_SUCCESS) return false;

    XGpio_InterruptEnable(&gpio, XPAR_GENERIC_GPIO_IP2INTC_IRPT_MASK);
    XGpio_InterruptGlobalEnable(&gpio);

    Xil_ExceptionInit();
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &intc);
    Xil_ExceptionEnable();

    return true;
}

bool test_i2c::init_gpio()
{
    XGpio_Initialize(&gpio, XPAR_GENERIC_GPIO_DEVICE_ID);
    XGpio_SelfTest(&gpio);
    XGpio_SetDataDirection(&gpio, 1, 0x01);
    return true;
}

test_i2c::test_i2c()
{
    bool ok = false;
    init_gpio();
    ok = init_intc();
    if(ok) xil_printf("intc OK\n\r");
intc OK - пишет, т.е. инициализация вроде бы проходит. В системе есть один GPIO порт 8-ми битный.


--------------------
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 16:50
Рейтинг@Mail.ru


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