
# 开发指导
#### 使用场景
当有中断请求产生时，CPU暂停当前的任务，转而去响应外设请求。根据需要，用户通过中断申请，注册中断处理程序，可以指定CPU响应中断请求时所执行的具体操作。
#### 功能
Huawei LiteOS 的中断模块为用户提供下面几种功能，接口详细信息可以查看API参考。
| 功能分类      | **接口名**            | **描述**                                                    |
|:---|:---|:---|
| 创建和删除中断   | LOS_HwiCreate      | 中断创建，注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时，handleIrq会调用该中断处理程序 |
| 创建和删除中断   | LOS_HwiDelete      | 删除中断                                                      |
| 打开和关闭所有中断 | LOS_IntUnLock      | 打开当前处理器所有中断响应                                             |
| 打开和关闭所有中断 | LOS_IntLock        | 关闭当前处理器所有中断响应                                             |
| 打开和关闭所有中断 | LOS_IntRestore     | 恢复到使用LOS_IntLock关闭所有中断之前的状态                               |
| 使能和屏蔽指定中断 | LOS_HwiDisable     | 中断屏蔽（通过设置寄存器，禁止CPU响应该中断）                                  |
| 使能和屏蔽指定中断 | LOS_HwiEnable      | 中断使能（通过设置寄存器，允许CPU响应该中断）                                  |
| 设置中断优先级   | LOS_HwiSetPriority | 设置中断优先级                                                   |
| 触发中断      | LOS_HwiTrigger     | 触发中断（通过写中断控制器的相关寄存器模拟外部中断）                                |
| 清除中断寄存器状态 | LOS_HwiClear       | 清除中断号对应的中断寄存器的状态位，此接口依赖中断控制器版本，非必需                        |
| 核间中断      | LOS_HwiSendIpi     | 向指定核发送核间中断，此接口依赖中断控制器版本和cpu架构，该函数仅在SMP模式下支持               |
| 设置中断亲和性   | LOS_HwiSetAffinity | 设置中断的亲和性，即设置中断在固定核响应（该函数仅在SMP模式下支持）                       |
   
#### HWI错误码
对存在失败可能性的操作返回对应的错误码，以便快速定位错误原因。
| 序号 | 定义                                    | 实际数值       | 描述                                                                                                                                                                                                                       | 参考解决方案                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
|:---|:---|:---|:---|:---|
| 1  | OS_ERRNO_HWI_NUM_INVALID              | 0x02000900 | 创建或删除中断时，传入了无效中断号                                                                                                                                                                                                        | 检查中断号，给定有效中断号                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 2  | OS_ERRNO_HWI_PROC_FUNC_NULL           | 0x02000901 | 创建中断时，传入的中断处理程序指针为空                                                                                                                                                                                                      | 传入非空中断处理程序指针                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| 3  | OS_ERRNO_HWI_CB_UNAVAILABLE           | 0x02000902 | 无可用中断资源                                                                                                                                                                                                                  | 暂不使用该错误码                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 4  | OS_ERRNO_HWI_NO_MEMORY                | 0x02000903 | 创建中断时，出现内存不足的情况                                                                                                                                                                                                          | 增大动态内存空间，有两种方式可以实现： - 设置更大的系统动态内存池，配置项为OS_SYS_MEM_SIZE  - 释放一部分动态内存   |
| 5  | OS_ERRNO_HWI_ALREADY_CREATED          | 0x02000904 | 创建中断时，发现要注册的中断号已经创建                                                                                                                                                                                                      | 对于非共享中断号的情况，检查传入的中断号是否已经被创建；对于共享中断号的情况，检查传入中断号的链表中是否已经有匹配函数参数的设备ID                                                                                                                                                                                                                                                                                                                                                                                                             |
| 6  | OS_ERRNO_HWI_PRIO_INVALID             | 0x02000905 | 创建中断时，传入的中断优先级无效                                                                                                                                                                                                         | 传入有效中断优先级。优先级有效范围依赖于硬件，外部可配                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| 7  | OS_ERRNO_HWI_MODE_INVALID             | 0x02000906 | 中断模式无效                                                                                                                                                                                                                   | 传入有效中断模式\[0,1\]                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 8  | OS_ERRNO_HWI_FASTMODE_ALREADY_CREATED | 0x02000907 | 创建硬中断时，发现要注册的中断号，已经创建为快速中断                                                                                                                                                                                               | 暂不使用该错误码                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 9  | OS_ERRNO_HWI_INTERR                   | 0x02000908 | 接口在中断中调用                                                                                                                                                                                                                 | 暂不使用该错误码                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 10 | OS_ERRNO_HWI_SHARED_ERROR             | 0x02000909 | 创建中断时：发现hwiMode指定创建共享中断，但是未设置设备ID；或hwiMode指定创建非共享中断，但是该中断号之前已创建为共享中断；或配置LOSCFG_NO_SHARED_IRQ为yes，但是创建中断时，入参指定创建共享中断 删除中断时：设备号创建时指定为共享中断，删除时未设置设备ID，删除错误。 | 检查入参，创建时参数hwiMode与irqParam保持一致，hwiMode为0，表示不共享，此时irqParam应为NULL；当hwiMode为IRQF_SHARD时表示共享，irqParam需设置设备ID；LOSCFG_NO_SHARED_IRQ为YES时，即非共享中断模式下，只能创建非共享中断。删除中断时irqParam要与创建中断时的参数一样                                                                                                                                                                                                                                                                                               |
| 11 | OS_ERRNO_HWI_ARG_INVALID              | 0x0200090a | 注册中断入参有误                                                                                                                                                                                                                 | 暂不使用该错误码                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| 12 | OS_ERRNO_HWI_HWINUM_UNCREATE          | 0x0200090b | 中断共享情况下，删除中断时，中断号对应的链表中，无法匹配到相应的设备ID                                                                                                                                                                                     | 对于共享中断号的情况，检查传入中断号的链表中是否已经有匹配函数参数的设备ID                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   
![](https://support.huaweicloud.com/kernelmanual-LiteOS/public_sys-resources/notice_3.0-zh-cn.png)
错误码定义见[错误码简介](https://support.huaweicloud.com/kernelmanual-LiteOS/zh-cn_topic_0311018405.html#ZH-CN_TOPIC_0311018405__zh-cn_topic_0175230332_section29852515161)。8\~15位的所属模块为中断模块，值为0x09。
#### 开发流程
1. 执行make menuconfig命令，进入Kernel ---\> Interrupt Management菜单，完成中断模块的配置。
   
   | 配置项                              | 含义          | 取值范围     | 默认值      | 依赖               |
   |:---|:---|:---|:---|:---|
   | LOSCFG_ARCH_INTERRUPT_PREEMPTION | 使能中断嵌套      | YES/NO   | NO       | ARMv8、RISC-V     |
   | LOSCFG_IRQ_USE_STANDALONE_STACK  | 使用独立中断栈     | YES/NO   | YES      | 依赖核，某些平台可能没有此配置项 |
   | LOSCFG_SHARED_IRQ                | 使能中断共享      | YES/NO   | YES      | 无                |
   | LOSCFG_PLATFORM_HWI_LIMIT        | 最大中断使用数     | 根据芯片手册适配 | 根据芯片手册适配 | 无                |
   | LOSCFG_HWI_PRIO_LIMIT            | 可设置的中断优先级个数 | 根据芯片手册适配 | 根据芯片手册适配 | 无                |
      
   
2. 调用中断创建接口LOS_HwiCreate创建中断。
3. 如果是SMP模式，调用LOS_HwiSetAffinity设置中断的亲和性，否则直接进入步骤4。
4. 调用LOS_HwiEnable接口使能指定中断。
5. 调用LOS_HwiTrigger接口触发指定中断（该接口通过写中断控制器的相关寄存器模拟外部中断，一般的外设设备，不需要执行这一步）。
6. 调用LOS_HwiDisable接口屏蔽指定中断，此接口根据实际情况使用，判断是否需要屏蔽中断。
7. 调用LOS_HwiDelete接口删除指定中断，此接口根据实际情况使用，判断是否需要删除中断。
 
