Estoy usando freeRTOS en Zedboard. Soy capaz de habilitar la interrupción PL-PS en el programa de metal abierto. Realmente no pude encontrar ninguna documentación / tutorial sobre cómo vincular FreeRTOS y el sistema de interrupción PL. Actualmente estoy migrando mi software a freeRTOS pero no estoy seguro de cómo "conectar" la interrupción entre freeRTOS y la interrupción PL. Esto es lo que he hecho y estoy seguro de que está totalmente equivocado.
En lo principal:
xTaskCreate(InitInterrupt, (const char * )"Init Interrupt",
configMINIMAL_STACK_SIZE, XPAR_PS7_SCUGIC_0_DEVICE_ID,
tskIDLE_PRIORITY, NULL);
Función de habilitación de interrupción:
XScuGic InterruptController;
static XScuGic_Config *GicConfig;
xSemaphoreHandle DMATransfer_trigger = 0;
int SetUpInterruptSystem(XScuGic *XScuGicInstancePtr) {
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler) XScuGic_InterruptHandler,
XScuGicInstancePtr);
Xil_ExceptionEnable();
//enable interrupt in ARM
return XST_SUCCESS;
}
static void InitInterrupt( deviceID) {
while (1) {
int Status;
GicConfig = XScuGic_LookupConfig(deviceID);
if (NULL == GicConfig) {
xil_printf("Interrupt Initialization FAILED!!\r\n");
vTaskDelete(NULL); //delete InitAXIDMA itself
}
Status = XScuGic_CfgInitialize(&InterruptController, GicConfig,
GicConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
xil_printf("Interrupt Initialization FAILED!!\r\n");
vTaskDelete(NULL); //delete InitAXIDMA itself
}
Status = SetUpInterruptSystem(&InterruptController);
if (Status != XST_SUCCESS) {
xil_printf("Interrupt Initialization FAILED!!\r\n");
vTaskDelete(NULL); //delete InitAXIDMA itself
}
Status = XScuGic_Connect(&InterruptController,
XPAR_FABRIC_AXI_DMA_0_S2MM_INTROUT_INTR,
(Xil_ExceptionHandler) InterruptHandler,
NULL);
if (Status != XST_SUCCESS) {
xil_printf("Interrupt Initialization FAILED!!\r\n");
vTaskDelete(NULL); //delete InitAXIDMA itself
}
XScuGic_Enable(&InterruptController,
XPAR_FABRIC_AXI_DMA_0_S2MM_INTROUT_INTR);
#ifdef DEBUG
xil_printf("Interrupt Initialization Complete\r\n");
#endif
vTaskDelete(NULL); //delete InitAXIDMA itself
}
}
En el controlador de interrupciones:
void InterruptHandler(void) {
u32 tmpValue;
//xil_printf("Interrupt acknowledged...\n\r);
//clear interrupt just perform a write bit to no 12 ofS2MM_DMASR
tmpValue = Xil_In32(XPAR_AXI_DMA_0_BASEADDR + 0x34);
tmpValue = tmpValue | 0x1000;
Xil_Out32( XPAR_AXI_DMA_0_BASEADDR + 0x34, tmpValue);
//Process Data Here!!
//initialize another transfer
xSemaphoreGive(DMATransfer_trigger);
}
La fuente de interrupción es de la IP del controlador DMA AXI. Esto es lo que he intentado pero no funciona. ¿Alguien puede darme una guía sobre cómo modificar el código para manejar y configurar la interrupción de FreeRTOS desde el PL? ¡Gracias!