Добрый день!
Делаю проект на Zynq, в проекте есть два VDMA(инициализированы и настроены по примеру в SDK) и ethernet (lwip, echo сервер ).
Проблема заключается в том, что когда настроены и разрешены прерывания VDMA, не работает прием пакетов ethernet ( а очень надо!)) ).
Решение у меня есть, но оно мне не нравиться, так как картинка идет менее качественная (субъективно видео чуть запаздывает). Я отключаю прерывания на VDMA и обрабатываю все в главном цикле. (Мне кажется, что это неправильно)
Подскажите как правильно настроить прерывания в проекте, что бы все работало вместе.
Код настройки прерываний VDMA
Код
int SetupIntrSystem(XAxiVdma *AxiVdmaPtr, u16 WriteIntrId)
{
int Status;
XScuGic *IntcInstancePtr = &Intc; /* Instance of the Interrupt Controller */
XScuGic_Config *IntcConfig;
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XScuGic_SetPriorityTriggerType(IntcInstancePtr, WriteIntrId, 0xA0, 0x3);
Status = XScuGic_Connect(IntcInstancePtr, WriteIntrId,
(Xil_InterruptHandler)XAxiVdma_WriteIntrHandler,
AxiVdmaPtr);
if (Status != XST_SUCCESS) {
return Status;
}
XScuGic_Enable(IntcInstancePtr, WriteIntrId);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
IntcInstancePtr);
Xil_ExceptionEnable();
XAxiVdma_SetCallBack(&AxiVdma_1, XAXIVDMA_HANDLER_GENERAL,
WriteCallBack_1, (void *)&AxiVdma_1, XAXIVDMA_WRITE);
XAxiVdma_SetCallBack(&AxiVdma_1, XAXIVDMA_HANDLER_ERROR,
WriteErrorCallBack_1, (void *)&AxiVdma_1, XAXIVDMA_WRITE);
XAxiVdma_IntrEnable(&AxiVdma_1, XAXIVDMA_IXR_ALL_MASK, XAXIVDMA_WRITE);
}
Прерывания для ethernet
Код
Xil_ExceptionInit();
XScuGic_DeviceInitialize(INTC_DEVICE_ID);
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler)XScuGic_DeviceInterruptHandler,
(void *)INTC_DEVICE_ID);
XScuGic_RegisterHandler(INTC_BASE_ADDR, TIMER_IRPT_INTR,
(Xil_ExceptionHandler)timer_callback,
(void *)&TimerInstance);
XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, TIMER_IRPT_INTR);
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
XScuTimer_EnableInterrupt(&TimerInstance);
XScuTimer_Start(&TimerInstance);
Так же я настаивал прерывания при помощи других функций, по примеру VDMA. Может кто сказать разницу в этих способах настройки прерываний? Как сделать что бы все работало по прерываниям?
Спасибо за внимание!