跳转至

interrupt

interrupt 提供操作系统抽象层的中断管理功能,支持中断请求申请与释放、中断使能与禁用、全局中断控制、中断优先级与CPU亲和性设置,以及 tasklet 延迟执行机制。

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

接口清单

接口名称 功能简述
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

void *osal_irq_get_private_dev(void *param_dev)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 获取中断回调函数中传入的私有设备参数
  • 从中断回调函数的参数中提取可直接使用的设备指针
  • 适用于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)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 申请中断线路并注册中断处理函数
  • 支持注册主中断处理函数(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

void osal_irq_free(unsigned int irq, void *dev)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 释放已通过 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

int osal_irq_set_priority(unsigned int irq, unsigned short priority)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 设置指定中断的优先级
  • 优先级数值含义由底层硬件平台决定

前置条件

  • 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
  • 依赖关系:依赖于中断控制器和CPU架构的硬件实现,目标平台支持中断优先级设置(liteos/freertos)

入参

名称 参数类型 详细说明 约束取值范围
irq unsigned int 中断号 有效的已申请中断号
priority unsigned short 中断优先级 由底层硬件平台定义的有效优先级范围

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 设置成功 优先级设置成功
OSAL_FAILURE(-1) 设置失败 优先级设置失败

osal_irq_set_affinity

int osal_irq_set_affinity(unsigned int irq, const char *name, int cpu_mask)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 设置中断的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

void osal_irq_enable(unsigned int irq)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 使能指定中断线路的处理
  • 撤销 osal_irq_disable 的效果,恢复中断处理
  • 当多次 disable 后,需匹配最后一次 disable 才会重新使能

前置条件

  • 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
  • 依赖关系:当前接口在 linux/liteos/seliteos/freertos 平台可用

入参

名称 参数类型 详细说明 约束取值范围
irq unsigned int 要使能的中断号 有效的已申请中断号

osal_irq_disable

void osal_irq_disable(unsigned int irq)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 禁用指定中断线路
  • 禁用后该中断不再触发处理

前置条件

  • 调用时序约束:当前接口必须在 osal_irq_request 成功返回后调用
  • 依赖关系:依赖于中断控制器的硬件实现,当前接口在 linux/liteos/seliteos/freertos 平台可用

入参

名称 参数类型 详细说明 约束取值范围
irq unsigned int 要禁用的中断号 有效的已申请中断号

osal_irq_lock

unsigned int osal_irq_lock(void)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 关闭全局所有中断(IRQ和FIQ)
  • 返回关中断前的CPSR状态值,用于后续恢复
  • 适用于需要对共享资源进行原子访问的场景

返回值

  • 返回类型:unsigned int
返回值 文字含义 触发场景
CPSR值 关中断前的CPSR状态值 全局中断关闭成功

osal_irq_unlock

unsigned int osal_irq_unlock(void)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 开启全局所有中断(IRQ和FIQ)
  • 返回开中断后的CPSR状态值
  • 适用于确定需要重新开启全局中断的场景

返回值

  • 返回类型:unsigned int
返回值 文字含义 触发场景
CPSR值 开中断后的CPSR状态值 全局中断开启成功

osal_irq_restore

void osal_irq_restore(unsigned int irq_status)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 恢复全局中断到 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

unsigned int osal_irq_clear(unsigned int vector)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 清除指定中断的pending状态
  • 适用于需要手动清除中断挂起状态的场景
  • 清除后该中断可被重新触发

前置条件

  • 依赖关系:中断 vector 为有效的中断向量号
  • 依赖关系:当前接口在 liteos/freertos 平台可用

入参

名称 参数类型 详细说明 约束取值范围
vector unsigned int 中断向量号 有效的硬件中断向量号

返回值

  • 返回类型:unsigned int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 清除成功 中断pending状态清除成功
非0 清除失败 中断清除操作失败

osal_in_interrupt

int osal_in_interrupt(void)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 检查当前是否处于中断上下文(硬中断、软中断、不可屏蔽中断)
  • 用于判断当前执行环境是否为中断上下文
  • 可用于避免在中断上下文中执行阻塞操作

返回值

  • 返回类型:int
返回值 文字含义 触发场景
非0(true) 当前处于中断上下文 在硬中断、软中断或不可屏蔽中断上下文中调用
0(false) 当前不处于中断上下文 在非中断上下文中调用

osal_in_exception

int osal_in_exception(void)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 检查当前是否处于异常上下文(硬异常、软异常、不可屏蔽异常)
  • 用于判断当前执行环境是否为异常上下文
  • 可用于避免在异常上下文中执行不安全的操作

返回值

  • 返回类型:int
返回值 文字含义 触发场景
非0(true) 当前处于异常上下文 在硬异常、软异常或不可屏蔽异常上下文中调用
0(false) 当前不处于异常上下文 在非异常上下文中调用

osal_tasklet_init

int osal_tasklet_init(osal_tasklet *tasklet)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 初始化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

int osal_tasklet_schedule(osal_tasklet *tasklet)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 调度已初始化的tasklet执行
  • 将tasklet添加到执行队列并启动
  • 需在 osal_tasklet_init 之后调用

前置条件

  • 调用时序约束:当前接口必须在 osal_tasklet_init 成功返回后调用
  • 依赖关系:当前接口在 linux/liteos/seliteos 平台可用

入参

名称 参数类型 详细说明 约束取值范围
tasklet osal_tasklet * 待调度的tasklet结构体指针 不为NULL;已初始化

返回值

  • 返回类型:int
返回值 文字含义 触发场景
0 调度成功 tasklet调度成功

osal_tasklet_kill

int osal_tasklet_kill(osal_tasklet *tasklet)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 关闭指定tasklet,停止其执行
  • 关闭后tasklet不再被调度执行
  • 确保tasklet当前执行完成后才关闭

前置条件

  • 调用时序约束:当前接口必须在 osal_tasklet_init 成功返回后调用
  • 依赖关系:当前接口在 linux/liteos/seliteos 平台可用

入参

名称 参数类型 详细说明 约束取值范围
tasklet osal_tasklet * 待关闭的tasklet结构体指针 不为NULL;已初始化

返回值

  • 返回类型:int
返回值 文字含义 触发场景
0 关闭成功 tasklet关闭成功

osal_tasklet_update

int osal_tasklet_update(osal_tasklet *tasklet)

头文件清单

#include "include/osal/interrupt/osal_interrupt.h"

功能说明

  • 更新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

typedef int (*osal_irq_handler)(int, void *);

使用说明

  • 调用时机:中断发生时由中断处理框架调用,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的参数

Macros

OSAL_CPU_ALL

#define OSAL_CPU_ALL 0

OSAL_CPU_0

#define OSAL_CPU_0 (1 << 1)

OSAL_CPU_1

#define OSAL_CPU_1 (1 << 2)

OSAL_CPU_2

#define OSAL_CPU_2 (1 << 3)

OSAL_CPU_3

#define OSAL_CPU_3 (1 << 4)

OSAL_SUCCESS [SDK公共共享宏]

#define OSAL_SUCCESS 0

OSAL_FAILURE [SDK公共共享宏]

#define OSAL_FAILURE (-1)