中断的连接和释放

更新时间:
2024-03-14
下载文档

中断的连接和释放

在 SylixOS 驱动中,使用中断的设备需要申请和释放中断,申请和释放函数分别是 API_InterVectorConnect 函数和 API_InterVectorDisconnect 函数。

中断连接函数

API_InterVectorConnect 函数定义如下所示:

#include <SylixOS.h>
ULONG      API_InterVectorConnect(ULONG                  ulVector,
                                  PINT_SVR_ROUTINE       pfuncIsr,
                                  PVOID                  pvArg,
                                  CPCHAR                 pcName);

函数 API_InterVectorConnect 原型分析:

  • 此函数成功返回 ERROR_NONE 失败设置错误号并返回。
  • 参数 ulVector 是中断向量号。
  • 参数 pfuncIsr 是中断服务函数。
  • 参数 pvArg 是中断服务函数参数。
  • 参数 pcName 是中断服务名称。

API_InterVectorConnect 函数的功能是将中断向量号与中断服务函数进行连接。

中断释放函数

函数 API_InterVectorDisconnect 的定义如下:

#include <SylixOS.h>
ULONG    API_InterVectorDisconnect(ULONG                   ulVector,
                                   PINT_SVR_ROUTINE        pfuncIsr,
                                   PVOID                   pvArg);

函数 API_InterVectorDisconnect 原型分析:

  • 此函数成功返回 ERROR_NONE ,失败设置错误号并返回。
  • 参数 ulVector 是中断向量号。
  • 参数 pfuncIsr 是中断服务函数。
  • 参数 pvArg 是中断服务函数的参数。

API_InterVectorDisable 函数只是释放与参数 pfuncIsr 和参数 pvArg 对应的中断服务函数,当一个向量对应多个函数时,它并不会释放该向量的所有中断服务函数。

如果要想一次性释放所有中断服务函数,SylixOS 提供了 API_InterVectorDisconnectEx 函数,其定义如下:

#include <SylixOS.h>
LW ULONG    API_InterVectorDisconnectEx(ULONG                ulVector,
                                        PINT_SVR_ROUTINE     pfuncIsr,
                                        PVOID                pvArg,
                                        ULONG                ulOption);

函数 API_InterVectorDisconnectEx 函数原型分析:

  • 此函数成功返回 ERROR_NONE ,失败设置错误号并返回。
  • 参数 ulVector 是中断向量号。
  • 参数 pfuncIsr 是中断服务函数。
  • 参数 pvArg 是中断服务函数的参数。
  • 参数 ulOption 是删除选项。

参数 ulOption 的选项如下表所示。

宏名含义
LW_IRQ_DISCONN_DEFAULT解除匹配函数和函数参数的中断服务连接
LW_IRQ_DISCONN_ALL解除所有中断服务连接
LW_IRQ_DISCONN_IGNORE_ARG解除匹配函数的中断服务连接(忽略函数参数)

中断相关的其他系统接口的声明位于“/libsylixos/SylixOS/kernel/include/k_api.h”文件内,这里不再详细介绍。

处理器提供的中断支持

处理器需要为 SylixOS 提供功能支持,对于中断驱动编写者需要填充 BSP 下 SylixOS/bsp/bspLib.c 中与中断相关的函数,如下所示:

#include <SylixOS.h>
VOID  bspIntInit (VOID)
{
    /*
     * TODO: 加入你的处理代码
     *
     * 如果某中断为链式中断,请加入形如:
     * API_InterVectorSetFlag(LW_IRQ_4, LW_IRQ_FLAG_QUEUE);
     * 的代码.
     *
     * 如果某中断可用作初始化随机化种子,请加入形如:
     * API_InterVectorSetFlag(LW_IRQ_0, LW_IRQ_FLAG_SAMPLE_RAND);
     * 的代码.
     */
}

bspIntInit 函数是中断系统初始化函数,它需要初始化中断控制器以及设置某些中断向量的特殊属性。

#include <SylixOS.h>
VOID  bspIntHandle (VOID)
{
REGISTER UINT32   uiVector = interruptVectorGet();
archIntHandle((ULONG)uiVector, LW_FALSE);
}

bspIntHandle 函数是中断入口函数,它通过读取硬件寄存器,得到当前产生的中断向量号。

#include <SylixOS.h>
VOID  bspIntVectorEnable   (ULONG  ulVector);
VOID  bspIntVectorDisable  (ULONG  ulVector);
BOOL  bspIntVectorIsEnable (ULONG  ulVector);    

以上三个函数的作用分别是中断使能、中断失能、判断中断是否使能,它们都是通过读取硬件寄存器来进行判断。

函数原型分析如下:

  • 参数 ulVector 是中断向量号。
#include <SylixOS.h>
#if LW_CFG_INTER_PRIO > 0
ULONG   bspIntVectorSetPriority (ULONG  ulVector, UINT  uiPrio);
ULONG   bspIntVectorGetPriority (ULONG  ulVector, UINT *puiPrio);
#endif

以上两个函数的作用分别是设置中断向量的优先级、获得中断向量的优先级,它们在系统支持中断优先级时( LW_CFG_INTER_PRIO > 0)才会被使用。

函数原型分析如下:

  • 参数 ulVector 是中断向量号。
  • 参数 uiPrio 是中断向量的优先级。
  • 参数 puiPrio 是中断向量的优先级。
#include <SylixOS.h>
#if LW_CFG_INTER_TARGET > 0
ULONG   bspIntVectorSetTarget (ULONG                       ulVector, 
                               size_t                      stSize, 
                               const  PLW_CLASS_CPUSET     pcpuset);
ULONG   bspIntVectorGetTarget (ULONG                       ulVector, 
                               size_t                      stSize,                                                                          PLW_CLASS_CPUSET            pcpuset)
#endif

以上两个函数的作用分别是设置中断向量的目标 CPU 和获得指定中断向量的目标 CPU,它们在系统支持中断目标 CPU 设置时才会被使用。

函数原型分析如下:

  • 函数成功返回 ERROR_NONE ,失败返回 PX_ERROR
  • 参数 ulVector 是中断向量号。
  • 参数 stsize 是 CPU 掩码集内存大小。
  • 参数 pcpuset 是 CPU 掩码。
文档内容是否对您有所帮助?
有帮助
没帮助