interrupt
interrupt 提供操作系统抽象层的中断管理功能,支持中断请求申请与释放、中断使能与禁用、全局中断控制、中断优先级与CPU亲和性设置,以及 tasklet 延迟执行机制。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_irq_get_private_dev | 获取中断回调函数的私有设备参数 |
| osal_irq_request | 申请中断线路并注册中断处理函数 |
| osal_irq_free | 释放已申请的中断线路 |
| osal_irq_set_priority | 设置中断优先级 |
| osal_irq_set_affinity | 设置中断的CPU亲和性 |
| osal_irq_enable | 使能指定中断 |
| osal_irq_disable | 禁用指定中断 |
| osal_irq_lock | 关闭全局中断并返回关中断前的状态 |
| osal_irq_unlock | 开启全局中断并返回开中断后的状态 |
| osal_irq_restore | 恢复全局中断到关中断前的状态 |
| osal_irq_clear | 清除指定中断的pending状态 |
| osal_in_interrupt | 检查当前是否处于中断上下文 |
| osal_in_exception | 检查当前是否处于异常上下文 |
| osal_tasklet_init | 初始化tasklet |
| osal_tasklet_schedule | 调度tasklet执行 |
| osal_tasklet_kill | 关闭tasklet |
| osal_tasklet_update | 更新tasklet |
Functions
osal_irq_get_private_dev
头文件清单
功能说明
- 获取中断回调函数中传入的私有设备参数
- 从中断回调函数的参数中提取可直接使用的设备指针
- 适用于Linux用户空间下中断回调函数参数的类型转换场景
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| param_dev | void * | 传递给中断回调函数的参数指针 | 不为NULL |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL | 可直接使用的设备参数指针 | param_dev 有效,提取成功 |
| NULL | 获取失败 | param_dev 为 NULL |
osal_irq_request
int osal_irq_request(unsigned int irq, osal_irq_handler handler, osal_irq_handler thread_fn, const char *name, void *dev)
头文件清单
功能说明
- 申请中断线路并注册中断处理函数
- 支持注册主中断处理函数(handler)和线程化中断处理函数(thread_fn)
- 当handler为NULL且thread_fn不为NULL时,安装默认主处理函数
前置条件
- 调用时序约束:当前接口需在目标中断线路未被占用时调用
- 上下文限制:Linux用户空间下,dev参数类型必须为 (drval_irq_arg *)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 中断号 | 有效的硬件中断号 |
| handler | osal_irq_handler | 中断发生时调用的主处理函数 | 不为NULL;若为NULL且thread_fn不为NULL则安装默认主处理函数 |
| thread_fn | osal_irq_handler | 线程化中断处理函数 | NULL表示不创建中断线程 |
| name | const char * | 申请设备的ASCII名称 | 有效的字符串指针 |
| dev | void * | 传递回处理函数的设备标识 | Linux用户空间下必须为 (drval_irq_arg *) 类型 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 申请成功 | 中断线路申请成功 |
| OSAL_FAILURE(-1) | 申请失败 | handler 为 NULL 或中断创建失败 |
osal_irq_free
头文件清单
功能说明
- 释放已通过 osal_irq_request 申请的中断线路
- 释放后该中断线路可被重新申请
- Linux用户空间下,dev参数必须与 osal_irq_request 中的 dev 参数一致
前置条件
- 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
- 调用上下文约束:禁止在中断上下文中调用此接口
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 要释放的中断号 | 有效的已申请中断号 |
| dev | void * | 释放时使用的设备标识 | 须与 osal_irq_request 中的 dev 一致 |
osal_irq_set_priority
头文件清单
功能说明
- 设置指定中断的优先级
- 优先级数值含义由底层硬件平台决定
前置条件
- 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
- 依赖关系:依赖于中断控制器和CPU架构的硬件实现,目标平台支持中断优先级设置(liteos/freertos)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 中断号 | 有效的已申请中断号 |
| priority | unsigned short | 中断优先级 | 由底层硬件平台定义的有效优先级范围 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 设置成功 | 优先级设置成功 |
| OSAL_FAILURE(-1) | 设置失败 | 优先级设置失败 |
osal_irq_set_affinity
头文件清单
功能说明
- 设置中断的CPU亲和性,将中断绑定到指定CPU核心
- 通过 cpu_mask 参数指定目标CPU核心
- 适用于多核处理器场景下的中断路由
前置条件
- 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
- 依赖关系:目标平台支持多核CPU亲和性设置(linux/liteos/seliteos)
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 中断号 | 有效的已申请中断号 |
| name | const char * | 中断名称 | 有效的字符串指针 |
| cpu_mask | int | CPU掩码 | OSAL_CPU_ALL(0) / OSAL_CPU_0(2) / OSAL_CPU_1(4) / OSAL_CPU_2(8) / OSAL_CPU_3(16) |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 设置成功 | 亲和性设置成功 |
osal_irq_enable
头文件清单
功能说明
- 使能指定中断线路的处理
- 撤销 osal_irq_disable 的效果,恢复中断处理
- 当多次 disable 后,需匹配最后一次 disable 才会重新使能
前置条件
- 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
- 依赖关系:当前接口在 linux/liteos/seliteos/freertos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 要使能的中断号 | 有效的已申请中断号 |
osal_irq_disable
头文件清单
功能说明
- 禁用指定中断线路
- 禁用后该中断不再触发处理
前置条件
- 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
- 依赖关系:依赖于中断控制器的硬件实现,当前接口在 linux/liteos/seliteos/freertos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq | unsigned int | 要禁用的中断号 | 有效的已申请中断号 |
osal_irq_lock
头文件清单
功能说明
- 关闭全局所有中断(IRQ和FIQ)
- 返回关中断前的CPSR状态值,用于后续恢复
- 适用于需要对共享资源进行原子访问的场景
返回值
- 返回类型:unsigned int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| CPSR值 | 关中断前的CPSR状态值 | 全局中断关闭成功 |
osal_irq_unlock
头文件清单
功能说明
- 开启全局所有中断(IRQ和FIQ)
- 返回开中断后的CPSR状态值
- 适用于确定需要重新开启全局中断的场景
返回值
- 返回类型:unsigned int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| CPSR值 | 开中断后的CPSR状态值 | 全局中断开启成功 |
osal_irq_restore
头文件清单
功能说明
- 恢复全局中断到 osal_irq_lock 调用前的状态
- 使用 osal_irq_lock 返回的CPSR值作为入参进行恢复
前置条件
- 调用时序约束:必须在 osal_irq_lock 之后调用,irq_status 为 osal_irq_lock 的返回值
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| irq_status | unsigned int | osal_irq_lock 返回的CPSR状态值 | osal_irq_lock 的返回值 |
osal_irq_clear
头文件清单
功能说明
- 清除指定中断的pending状态
- 适用于需要手动清除中断挂起状态的场景
- 清除后该中断可被重新触发
前置条件
- 依赖关系:中断 vector 为有效的中断向量号
- 依赖关系:当前接口在 liteos/freertos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| vector | unsigned int | 中断向量号 | 有效的硬件中断向量号 |
返回值
- 返回类型:unsigned int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 清除成功 | 中断pending状态清除成功 |
| 非0 | 清除失败 | 中断清除操作失败 |
osal_in_interrupt
头文件清单
功能说明
- 检查当前是否处于中断上下文(硬中断、软中断、不可屏蔽中断)
- 用于判断当前执行环境是否为中断上下文
- 可用于避免在中断上下文中执行阻塞操作
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非0(true) | 当前处于中断上下文 | 在硬中断、软中断或不可屏蔽中断上下文中调用 |
| 0(false) | 当前不处于中断上下文 | 在非中断上下文中调用 |
osal_in_exception
头文件清单
功能说明
- 检查当前是否处于异常上下文(硬异常、软异常、不可屏蔽异常)
- 用于判断当前执行环境是否为异常上下文
- 可用于避免在异常上下文中执行不安全的操作
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非0(true) | 当前处于异常上下文 | 在硬异常、软异常或不可屏蔽异常上下文中调用 |
| 0(false) | 当前不处于异常上下文 | 在非异常上下文中调用 |
osal_tasklet_init
头文件清单
功能说明
- 初始化tasklet结构体
- 同一时刻tasklet仅在一个CPU上运行
前置条件
- 调用时序约束:tasklet 的 handler 和 data 成员已赋值,tasklet 成员留空
- 依赖关系:当前接口在 linux/liteos/seliteos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| tasklet | osal_tasklet * | 待初始化的tasklet结构体指针 | 不为NULL;handler 和 data 已赋值 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| tasklet | osal_tasklet * | 初始化后的tasklet结构体,tasklet成员由函数填充 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 初始化成功 | tasklet初始化成功 |
osal_tasklet_schedule
头文件清单
功能说明
- 调度已初始化的tasklet执行
- 将tasklet添加到执行队列并启动
- 需在 osal_tasklet_init 之后调用
前置条件
- 调用时序约束:当前接口必须在 osal_tasklet_init 成功返回后调用
- 依赖关系:当前接口在 linux/liteos/seliteos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| tasklet | osal_tasklet * | 待调度的tasklet结构体指针 | 不为NULL;已初始化 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 调度成功 | tasklet调度成功 |
osal_tasklet_kill
头文件清单
功能说明
- 关闭指定tasklet,停止其执行
- 关闭后tasklet不再被调度执行
- 确保tasklet当前执行完成后才关闭
前置条件
- 调用时序约束:当前接口必须在 osal_tasklet_init 成功返回后调用
- 依赖关系:当前接口在 linux/liteos/seliteos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| tasklet | osal_tasklet * | 待关闭的tasklet结构体指针 | 不为NULL;已初始化 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 关闭成功 | tasklet关闭成功 |
osal_tasklet_update
头文件清单
功能说明
- 更新tasklet的配置
- 需在 osal_tasklet_init 之后调用
- 用于修改tasklet的handler或data等属性
前置条件
- 调用时序约束:当前接口必须在 osal_tasklet_init 成功返回后调用
- 依赖关系:当前接口在 linux/liteos/seliteos 平台可用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| tasklet | osal_tasklet * | 待更新的tasklet结构体指针 | 不为NULL;已初始化 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 更新成功 | tasklet更新成功 |
Type definitions
osal_irq_handler
使用说明
- 调用时机:中断发生时由中断处理框架调用,handler 在中断上下文中执行;thread_fn 在内核线程中执行
- 参数语义:第一个 int 参数为中断号,第二个 void * 参数为注册时传入的 dev 设备标识
- 返回值处理:回调应返回 osal_irqreturn 枚举成员值指示中断处理状态
Enumerations
osal_irqreturn
enum osal_irqreturn {
OSAL_IRQ_NONE = (0 << 0),
OSAL_IRQ_HANDLED = (1 << 0),
OSAL_IRQ_WAKE_THREAD = (1 << 1),
};
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| OSAL_IRQ_NONE | 0 | 中断未处理 |
| OSAL_IRQ_HANDLED | 1 | 中断已处理 |
| OSAL_IRQ_WAKE_THREAD | 2 | 唤醒线程化中断处理线程 |
Structures
osal_tasklet
typedef struct {
void *tasklet;
void (*handler)(unsigned long data);
unsigned long data;
} osal_tasklet;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| tasklet | void * | tasklet内部实现指针,初始化前留空 |
| handler | void (*)(unsigned long data) | tasklet执行的处理函数 |
| data | unsigned long | 传递给handler的参数 |