参考:
- 【野火】物联网操作系统 LiteOS 开发实战指南
- Huawei LiteOS | 中文网
9. 中断管理
9.1 概况
9.1.1 基本概念
- 中断:指CPU正在处理某件事的时候,外部发生了某一事件,请求CPU迅速处理,CPU暂时中断当前的工作,转入处理所发生的事件,处理完之后再回到原来被中断的地方,继续原来的工作,这样的过程称为中断
- 中断一般用于处理比较紧急的事件,而且只做简单处理,如标志该事件,一般建议使用信号量、消息或事件标志组等标志中断的发生,并将这些内核对象发布给处理任务,处理任务再做具体处理
- 与中断相关的硬件划分为三类:
- 外设:当外设需要请求 CPU 时,产生一个中断信号,该信号连接至中断控制器
- 中断控制器:中断控制器是 CPU 众多外设中的一个,它一方面接收其他外设中断信号的输入,另一方面,它会发出中断信号给 CPU。可以通过对中断控制器编程实现对中断源的优先级、触发方式、打开和关闭源等设置操作 ,譬如Cortex-M 的
NVIC
,NVIC 最多支持 240 个中断,每个中断最多 256 个优先级 - CPU本身:CPU 会响应中断源的请求,中断当前正在执行的任务,转而执行中断处理程序。
9.1.2 和中断相关的名词解释
- 中断号:每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号
- 中断请求:“紧急事件”需向CPU提出申请(发一个电脉冲信号),要求中断,及要求CPU暂停当前执行的任务,转而处理该“紧急事件”,这一申请过程称为中断申请
- 中断优先级:为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。Huawei LiteOS支持中断控制器的中断优先级及中断嵌套,同时中断管理未对优先级和嵌套进行限制
- 中断处理程序:当外设产生中断请求后,CPU暂停当前的任务,转而响应中断申请,即执行中断处理程序
- 中断触发:中断源发出并送给CPU控制信号,将接口卡上的中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断,CPU暂停当前任务,执行相应的中断处理程序
- 中断触发类型:外部中断申请通过一个物理信号发送到NVIC,可以是电平触发或边沿触发
- 中断向量:中断服务程序的入口地址
- 中断向量表:存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储
9.1.3 LiteOS的中断支持
- 接管中断版本:
- 中断初始化
- 中断创建
- 开/关中断
- 恢复中断
- 中断使能
- 中断屏蔽
- 非接管中断版本:
- 开/关中断
- 恢复中断
- 中断使能
- 中断屏蔽
9.2 中断的运作机制
9.2.1 中断执行顺序
当中断产生时,处理机将按如下顺序进行执行:
- 保存当前处理机状态信息
- 载入异常或中断处理函数到PC寄存器
- 把控制权转交给处理函数并开始执行
- 当处理函数执行完成后,恢复处理器状态信息
- 从异常或中断中返回到前一个程序执行点
可以通过两条特殊的指令关中断和开中断让处理器不响应或响应中断,在关闭中断期间,通常处理器会把新产生的中断挂起,当中断打开时立即进行响应,所以会有适当的延时响应中断,故用户在进入临界区的时候应快进快出
9.2.2 中断发生的环境
-
在任务的上下文中
任务在工作的时候,如果此时发生了一个中断,无论中断优先级是多大,都会打断当前任务的执行,从而转到对应的中断服务函数中执行,如下图所示的过程:
-
(1)、(3):在任务运行的时候发生了中断,那么中断会打断任务的运行,那么操作系统会先保存当前任务的上下文环境,转而去处理中断服务函数
-
(2)、(4):当且仅当中断服务函数处理完的时候才恢复任务的上下文环境,继续执行运行任务
-
在中断服务函数处理上下文中
在执行中断服务函数过程中,如果有更高优先级别的中断源触发中断,由于当前处于中断处理上下文环境中,根据不同的处理架构可能有不同的处理方式:
- 新的中断等待挂起直到当前中断处理离开后再进行响应
- 新的高优先级中断打断当前中断处理过程,而去响应这个更高优先级的新中断源,也称为中断嵌套,LiteOS允许中断嵌套
如下图所示:
- (1):当中断1的服务函数在处理的时候发生了中断2,由于中断2的优先级较中断1更高,所以发生了中断嵌套,那么操作系统将先保存当前中断服务函数的上下文环境,并且转向处理中断2
- 当且仅当中断2执行完的时候,才能继续执行中断1
9.2.3 中断延迟
-
中断延迟是指从中断开始的时刻到终端服务函数例程开始执行时刻之间的时间段
中 断 延 迟 = 识 别 中 断 时 间 + [ 等 待 中 断 打 开 时 间 ] + [ 关 闭 中 断 时 间 ] 中断延迟 = 识别中断时间 + [等待中断打开时间] + [关闭中断时间] 中断延迟=识别中断时间+[等待中断打开时间]+[关闭中断时间]注:此处指最大可能的中断延迟时间
- 识别中断时间:外界硬件发生中断后,CPU读取中断向量,查找中断向量表找到对应中断服务子程序(ISR)的首地址,然后跳转到对应的ISR去做相应处理的时间
- 等待中断打开时间:
- (支持中断嵌套的环境)高优先级中断服务函数正在执行,低优先级中断发生,会等待高优先级中断服务函数执行完毕之后才会响应低优先级中断,这部分时间
- (不支持中断嵌套的环境)当前中断正在处理,发生另一个中断,系统不会立即响应,等待当前中断处理完毕才会响应,这部分时间
- 关闭中断时间:操作系统中,很多时候我们会主动进入
临界段
,系统不允许当前状态被中断打断,临界区发生的中断会被挂起,直到退出临界段时候打开中断,这部分时间
9.3 开发说明
9.3.1 接管中断版本
接管简单来说就是,所有的中断都由 RTOS 的软件管理,硬件来了中断时,由软件决定是否响应,可以挂起中断,延迟响应或者不响应
-
功能函数
Huawei LiteOS 系统中的中断模块为用户提供下面几种功能。
接口名 | 描述 |
---|---|
LOS_HwiCreate | 硬中断创建,注册硬中断处理程序 |
LOS_IntUnLock | 开中断 |
LOS_IntRestore | 恢复到关中断之前的状态 |
LOS_IntLock | 关中断 |
LOS_HwiDelete | 硬中断删除 |
-
函数详解:
-
创建硬件中断函数
LOS_HwiCreate()
LiteOS接管了中断,那么关于中断的注册创建也是由LiteOS管理
UINT32 LOS_HwiCreate(HWI_HANDLE_T uwHwiNum, //硬件的中断向量号 HWI_PRIOR_T usHwiPrio, //硬件中断优先级 HWI_MODE_T usMode, //硬件中断模式 HWI_PROC_FUNC pfnHandler, //中断服务处理函数 HWI_ARG_T uwArg ) //输入参数
-
删除硬件中断函数
LOS_HwiDelete()
当某些中断不需要使用的时候,就可以进行注销(删除),当删除了中断的时候就无法再次使用
UINT32 LOS_HwiDelete(HWI_HANDLE_T uwHwiNum) //硬件中断向量号
-
-
开发流程
- 修改配置项
- 打开硬中断裁剪开关:
LOSCFG_PLATFORM_HWI
定义为 YES - 配置硬中断使用最大数:
LOSCFG_PLATFORM_HWI_LIMIT
- 打开硬中断裁剪开关:
- 调用中断初始化
LOS_HwiInit
接口 - 调用中断创建接口
LOS_HwiCreate
创建中断,根据需要使能指定中断 - 调用
LOS_HwiDelete
删除中断
- 修改配置项
-
注意事项
- 创建中断并不等于已经初始化中断了,真正的初始化还是由我们自己编写,所以注册之前,应先将中断初始完成
- 根据具体硬件平台,配置支持的最大中断数及中断初始化操作的寄存器地址。在Cortex-m3, Cortex-m4, Cortex-m7 中基本无需修改, LiteOS 已经处理好,直接使用即可
- 中断处理程序耗时不能过长,影响 CPU 对中断的及时响应
- 关中断后不能执行引起调度的函数
- 中断恢复
LOS_IntRestore
的入参必须是与之对应的LOS_IntLock
保存的关中断之前的PRIMASK的值
9.3.2 非接管中断
- 非接管中断的方式其实跟裸机差不多,需要我们自己配置中断,并且使能中断,编写中断服务函数
- 在中断服务函数中使用内核IPC通信机制,一般建议使用:
- 信号量
- 消息
- 事件标志组等标志事件的发生,
- 将事件发布给处理任务,等退出中断后,再由相关处理任务具体处理中断