1。概述
,,,,本篇主要介绍在Zynq平台编写中断相关的驱动程序时,涉及CPU私有中断的相关绑定办法。
2。私有中断简介
,,,,私有中断是多核CPU上特有的中断,私有中断只能被其所有者核心获取和响应,不会被其他核发现。常见的私有中断有全局定时器,私有看门狗定时器,私有定时器等,Zynq平台上还有来自PL的FIQ \ IRQ。
3。私有中断的绑定方法
3.1,,,,,常规共享中断绑定
,,,, Zynq平台使用的是新加坡政府投资公司通用中断框架,常规的共享中断绑定和普通的中断绑定没有区别,在SylixOS上直接调用<强> API_InterVectorConnect 强>,<强> API_InterVectorEnable 强>这两个函数即可绑定,绑定后中断可由任意一个CPU核心响应。
3.2,,,,,私有中断绑定
,,,,私有中断只能有所有者核心获取和响应,因此对应的中断和中断服务是绑定在相关的CPU核心上。在SylixOS下绑定私有中断需要让常规共享中断的绑定流程在对应的CPU核心上完成才能成功绑定。即在驱动绑定私有中断的时候创建一个绑定在对应的CPU核心上的绑定线程,然后由这个绑定线程去完成私有中断绑定。绑定流程如图3.1示。
3.1图私有中断绑定流程
,,,, Zynq平台31号私有定时器中断绑定框架如程序清单3.1所示。
程序清单3.1 Zynq平台31号私有定时器中断绑定框架
# define ZYNQ_VECTOR_NIRQ ,,,, 31岁,,,,,,,,,/*,31号私有中断,,,,,,,,,,*/static LW_HANDLE , _G_bindthread ,,,,,,=, LW_OBJECT_HANDLE_INVALID; static LW_HANDLE , _G_syncSignal ,,,,,,=, LW_OBJECT_HANDLE_INVALID;,/*************************************************************************** * *,函数名称:__nIrqIsr * *,功能描述:,中断服务程序 * *,输入,,:pvArg * *,输出,,:没有 * *,返,,回,,:LW_NULL * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */static irqreturn_t  __nIrqIsr (PVOID , pvArg) { return , LW_IRQ_HANDLED; }/*************************************************************************** * *,函数名称:__bindThread * *,功能描述:,私有中断绑定线程 * *,输入,,:pvArg * *,输出,,:没有 * *,返,,回,,:LW_NULL * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */static PVOID , __bindThread (PVOID , pvArg) { API_SemaphoreBPend (_G_syncSignal,, LW_OPTION_WAIT_INFINITE);,,,,,,,,,,,,,,/*,等待同步信号量,,,,,*/API_InterVectorConnect (ZYNQ_VECTOR_NIRQ,,,,,,,,,,,,,,/*,连接中断服务程序,,,,*/,,,,,,,,,,,,,,,,,,,,(PINT_SVR_ROUTINE) __nIrqIsr, ,,,,,,,,,,,,,,,,,,,,(PVOID)空, ,,,,,,,,,,,,,,,,,,,,“nIrq"); API_InterVectorEnable (ZYNQ_VECTOR_NIRQ);,,,,,,,,,,,,,/*,使能中断,,,,,,,,,,,*/}/*************************************************************************** * *,函数名称:__nIrqInit * *,功能描述:,中断服务初始化 * *,输入,,:没有 * *,输出,,:没有 * *,返,,回,,,,成功返回ERROR_NONE,失败返回PX_ERROR * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */INT , __nIrqInit (空白) { LW_CLASS_CPUSET ,,,,,,,,,,, cpuset; , 时间=_G_syncSignal API_SemaphoreBCreate (“SYNCSEM",,,,,,/*,创建同步等待信号,,,,*/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LW_OPTION_OBJECT_GLOBAL, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,LW_NULL); if (_G_syncSignal ==, LW_OBJECT_HANDLE_INVALID),{,,,/*判断信号量创建是否成功*/null null null null null null null null null null null null null null null null null null null null null nullSylixOS Zynq平台私有中断绑定