Page 60 - 《软件学报》2021年第6期
P. 60
1634 Journal of Software 软件学报 Vol.32, No.6, June 2021
测到了即将要发生的异常事件,则会在响应异常时首先进入异常向量表寻找异常标号,随后转入异常管理进行
指令跳转处理.
如图 2 所示,这是一个典型的异常处理流程:操作系统将 CPU 的运行抽象为任务的形式呈现给用户,任务 i
正常执行时接收到异常信号,然后对异常事件进行响应,对于异步异常的响应,会等待当前正在执行的指令完成
之后才会进行响应,如图 2 中异步异常信号所示.系统响应异常信号后,控制流转入异常向量表之中寻找与之匹
配的异常标号并进入正确的异常管理入口.异常管理需要完成的任务主要有 3 个:(1) 对任务上下文进行保
护;(2) 引导系统控制流转入异常处理子程序(ESR),并设定正确的返回入口;(3) ESR 处理完毕后返回异常管理
对任务上下文进行恢复.
跳入 返回
内 异 上下文保护 上下文恢复
核 常 异常处理子程序
层 向
量
表
用
户 任务i执行 任务i继续
层
异步异常信号 异常响应 转入ESR 跳出ESR 异常结束
Fig.2 Basic exception
图 2 基本异常情况
为了保证对外部事件以及高优先级任务进行实时响应,实时 OS 对异常嵌套的情况也必须进行考虑.一个
典型的异常嵌套如图 3 所示:在处理一个异常的过程中,通常会出现更紧迫的异常事件请求响应,因而导致了异
常嵌套.值得注意的是:刚进入异常管理后,系统会自动屏蔽所有异常事件的响应.这样做的目的是为了防止系
统正在保存上下文信息的时候被打断而产生数据丢失.同样的处理也被应用在上下文恢复中:当异常子程序处
理完毕后,返回异常管理进行上下文恢复前,会屏蔽所有的异常响应.因此,允许更紧迫的异常事件被响应的情
况只能发生在 ESR 正常执行中,如图 3 中所示,ESR1 在执行的过程中被高优先级 ESR2 打断.
跳入 返回
内 跳入 保护 ESR2 恢复 返回
核
层 异
常 保护 ESR1 ESR1 恢复
向
用
户 量
层 表
任务i执行 任务i继续
异常响应 嵌套响应 嵌套返回 异常返回
Fig.3 Nesting exception
图 3 异常嵌套情况
为了保障系统的实时性,实时 OS 的调度策略采用基于固定优先级的时间片轮转方法,也就意味着 CPU 是
可抢占的.在异常处理子程序执行的过程中,往往会出现任务创建任务、停止任务操作,这导致系统会在异常管
理流程中发生任务的切换.若在 ESR 中创建的任务优先级比当前任务高,则会在上下文恢复时被设置为就绪状
态,当异常返回时,系统将根据情况进行一次任务调度去运行优先级最高的就绪任务,而不一定要继续运行被打
断的原任务.如图 4 所示,这是一个高优先级抢占低优先级的情景:第 1 次异常响应,任务 i 被打断,控制流转入异