项目场景:
ZYNQ 7020 lwip与其他中断不能同时起作用
问题描述
ZYNQ7020裸机注入lwip回环模板后再加入自己写入的中断事件后lwip无法使用
---
# 原因分析:
经多方查阅资料才知道是我自己写的中断又例化了一遍中断控制器,导致lwip的例化的中断控制器被覆盖。
---
# 解决方案:
解决方案大体分为两种:
1、在main中先调用我自己的中断初始化代码,之后再调用lwip的中断初始化,并且把lwip中例化中断控制器的代码注释掉(在platfrom_zynq.v)。
void platform_setup_interrupts(void)
{//从这里开始注释掉
// Xil_ExceptionInit();
//
// XScuGic_DeviceInitialize(INTC_DEVICE_ID);
//
// /*
// * Connect the interrupt controller interrupt handler to the hardware
// * interrupt handling logic in the processor.
// */
// Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
// (Xil_ExceptionHandler)XScuGic_DeviceInterruptHandler,
// (void *)INTC_DEVICE_ID);
//到这里注释结束
/*
* Connect the device driver handler that will be called when an
* interrupt for the device occurs, the handler defined above performs
* the specific interrupt processing for the device.
*/
XScuGic_RegisterHandler(INTC_BASE_ADDR, TIMER_IRPT_INTR,
(Xil_ExceptionHandler)timer_callback,
(void *)&TimerInstance);
/*
* Enable the interrupt for scu timer.
*/
XScuGic_EnableIntr(INTC_DIST_BASE_ADDR, TIMER_IRPT_INTR);
return;
}
在main函数中上来就先调用我自己的中断初始化,后面剩下的模板中的代码就不用动了。
int main()
{
IntrInitFuntion(INTC_DEVICE_ID) ;
方法二:感谢嘿嘿の博主
修改lwip中断初始化代码,
然后main中 init_platform();调用改为:
其中的intcTimer使我们自己例化的中断控制器。