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 被打断,控制流转入异
   55   56   57   58   59   60   61   62   63   64   65