中断的连接和释放
在 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 掩码。