Page 96 - 《软件学报》2021年第6期
P. 96

1670                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         级任务的执行序列.用 preemptionSequence(T i )表示任务 T i 从被抢占到恢复执行这一段时间内高优先级任务的
         执行序列,则 preemptionSequence(T i )=(T x ,T y ,T z )表示任务 T i 被任务 T x 抢占到任务 T i 恢复执行之间的任务集的执
         行序列为 T x →T y →T z .因此,我们在计算每一个执行任务的 CRPD 前,需要确定该任务的抢占序列,并把序列中每
         一次可能抢占的 CRPD 计算出来,并对所有抢占序列 CRPD 计算的结果进行求和,得到该任务被抢占的 CRPD.
             对于 RMS 和 EDF 调度策略,系统任务在一个超周期内的抢占只能发生高优先级任务到来的时刻,我们称这
         些点为任务执行断点,任务抢占点是一类特殊的执行断点.所以分析任务的可调度性时,首先要计算出在一个超
         周期内所有任务的执行断点.假设有一个任务集 Taskset={K 1 ,K 2 ,K 3 },其中,K 1 的周期为 2ms,K 2 的周期为 3ms,K 3
         的周期为 6ms,那么该任务集的超周期为其 3 个任务的最小公倍数,即为 6ms,分别为(0ms,2ms,3ms,4ms,6ms,8ms,
         9ms,10ms)时刻.对于分区调度情形,分区调度时间片切换点也被认为是一种任务执行断点(如图 4 所示).

                                                                    K i K i 释放

                               K 3  K 3                K 3

                               K 2 K 2      K 2        K 2        K 2


                               K 1 K 1   K 1    K 1    K 1    K 1    K 1
                                 0ms 1ms 2ms 3ms 4ms 5ms 6ms 7ms 8ms 9ms 10ms
                             Fig.4    Dispatch of tasks in the task group within a superperiod
                                  图 4   任务集中任务在一个超周期内的释放情况
             算法 1 给出了任务集所有执行断点的计算过程.在算法 1 中有 Do-while 循环和 for 循环(设分区个数为 m,
         任务集中任务数量为 n),前者循环的次数为 m,后者循环次数为 n,循环之间无嵌套关系,且 m 与 n 之间满足关系:
         m≤n,故算法 1 的时间复杂度为 O(n).
             算法 1.  计算任务集执行断点序列的过程.
             Input:AADL 调度模型实例化文件;
             Output:调度模型的执行断点序列 ExecutionPointSet;
             1.   解析 AADL 调度模型文件,提取任务集合 SM;
             2.   断点序列初始化:ExecutionPointSet=null;
             3.   计算 SM 中任务的超周期 Superperiod;
             4.      if (采用分区调度) then
             5.         获取分区配置信息                            //包括分区调度顺序、时间片大小;
             6.         temp=1                              //temp 标志当前的执行分区;
             7.         Do:
             8.               将该分区切换点加入 ExecutionPointSet 集合;
             9.            temp=temp+1;
             10.        while (temp≤分区个数)
             11. end if
             12. for (SM 中的所有任务 T)
             13.       {令 k=0;                              //k 代表一个超周期内任务的最大执行次数
             14.           P 为任务 T i 的周期;
                       i T
             15.           while (k* P <Superperiod)        //当 k 倍任务周期小于超周期
                               i T
             16.             {if (k 倍周期不属于 ExecutionPointSet)
   91   92   93   94   95   96   97   98   99   100   101