取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
hankf
Xilinx Employee
Xilinx Employee
1,130 次查看
注册日期: ‎02-16-2012

【分享】在FreeRTOS的main()函数里初始化设备,不能收到中断。

 

FreeRTOS在 void vTaskStartScheduler( void )里调用 configSETUP_TICK_INTERRUPT(), 也就是void FreeRTOS_SetupTickInterrupt( void )。void FreeRTOS_SetupTickInterrupt( void )在文件portZynqUltrascale.c里实现,会初始化MPSoC的中断控制器。

所以在vTaskStartScheduler()之前,FreeRTOS的中断没有使能,不能响应中断。
如果在vTaskStartScheduler()之前初始化中断,检测不到中断是正常的。
把xilinx的standalone的例子加入FreeRTOS时,应该去掉XScuGic_CfgInitialize(), Xil_ExceptionRegisterHandler(),Xil_ExceptionEnable()等GIC层次的操作函数,只保留 XScuGic_Connect()和XScuGic_EnableIntr()等设备层次的操作函数。否则GIC被重复初始化,可能导致FreeRTOS工作异常。设备的初始化,也最好加在一个线程里,而不是FreeRTOS的main()函数里。

0 项奖励
回复
4 回复数
weiyil
Moderator
Moderator
1,113 次查看
注册日期: ‎05-23-2018

感谢Hank的分享!

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------
0 项奖励
回复
xumoxiao
Explorer
Explorer
216 次查看
注册日期: ‎12-12-2018

你好,我想请问一下,在上面的问题中,如果没有 XScuGic_CfgInitialize(), 所返回的XScuGic对象,怎么能对 XScuGic_Connect(),函数进行操作呢?(第一个参数就是)
怎样可以获得这个XScuGic 已经初始化的对象。

0 项奖励
回复
SsSisyphus
Visitor
Visitor
76 次查看
注册日期: ‎09-02-2020

不需要对象,直接用XPAR_SCUGIC_0_CPU_BASEADDR、XPAR_SCUGIC_0_DIST_BASEADDR配合xscugic_hw.c中的函数来完成中断注册和使能。实际上xscugic_hw.c和xscugic.c中很多函数都类似的,xscugic_hw更底层而已。打开源码看一下就知道了。

0 项奖励
回复
xumoxiao
Explorer
Explorer
55 次查看
注册日期: ‎12-12-2018

https://zhuanlan.zhihu.com/p/349199200
感谢回复
这个方法标准一点,用户函数使用对象方式调用比较好。

0 项奖励
回复