中级会员
- 积分
- 209
- 金钱
- 209
- 注册时间
- 2019-7-17
- 在线时间
- 57 小时
|
本帖最后由 anqh 于 2020-2-24 13:13 编辑
开发板: ZYNQ 7020
uart中断例程,创建FreeRTOS工程
使用pvPortMalloc时,串口中断进不去,但系统没挂,while(1)里还是可以输出log。
不使用pvPortMalloc或者使用malloc申请内存,串口中断正常。
2020年2月24日更新:
还出现一个同样的问题,就是创建任务后uart中断也进不去。
所以想这两个问题是不是同一个原因,当然xTaskCreate函数里也有pvPortMalloc...
于是Google/百度一下关键词 zynq freertos uart interrupt
果然很多遇到同样问题。
由于刚从STM32转到ZYNQ,需要填的坑还是挺多的。
问题出现原因:
PS端只能存在一个中断控制器,FreeRTOS在vTaskStartScheduler()里已经创建过中断控制器XScuGic xInterruptController,
正点原子uart例程初始化中断又创建一个中断控制器,导致FreeRTOS里的中断控制器失效。大概就是这样的。
解决方法:
1. 在自己代码添加 extern XScuGic xInterruptController;
2. 在任务里初始化uart中断,确保uart初始化在vTaskStartScheduler()后。
- extern XScuGic xInterruptController;
- void uart0_IntrruptInit(void)
- {
- Xil_ExceptionInit();
- Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
- (Xil_ExceptionHandler)XScuGic_InterruptHandler,
- (void *)&xInterruptController);
- Xil_ExceptionEnable();
- XScuGic_Connect(&xInterruptController, XPAR_XUARTPS_0_INTR, uart0_IntrHandler, (void *)&Uart0_Ps);
- XUartPs_SetInterruptMask(&Uart0_Ps, XUARTPS_IXR_RXOVR);
- XScuGic_Enable(&xInterruptController, XPAR_XUARTPS_0_INTR);
- }
复制代码
|
|