В контроллере прерываний есть регистр(ы) 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_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 */
}
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. И тоже похоже на обычный вызов прерывания, когда один обработчик опрашивает в контроллере прерывания индекс прерывания и запускает по таблице векторов, хранящейся в оперативной памяти, требуемую функцию.
Если только одну функцию в программе объявляю с указанным атрибутом, то она успешно вызывается многократно.
Как правильно запрограммировать контроллер на быстрые прерывания?