开发指导
使用场景
当有中断请求产生时,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 |
创建中断时,出现内存不足的情况 |
增大动态内存空间,有两种方式可以实现:
|
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 |
错误码定义见错误码简介。8~15位的所属模块为中断模块,值为0x09。
开发流程
- 执行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
可设置的中断优先级个数
根据芯片手册适配
根据芯片手册适配
无
- 调用中断创建接口LOS_HwiCreate创建中断。
- 如果是SMP模式,调用LOS_HwiSetAffinity设置中断的亲和性,否则直接进入步骤4。
- 调用LOS_HwiEnable接口使能指定中断。
- 调用LOS_HwiTrigger接口触发指定中断(该接口通过写中断控制器的相关寄存器模拟外部中断,一般的外设设备,不需要执行这一步)。
- 调用LOS_HwiDisable接口屏蔽指定中断,此接口根据实际情况使用,判断是否需要屏蔽中断。
- 调用LOS_HwiDelete接口删除指定中断,此接口根据实际情况使用,判断是否需要删除中断。