一种用于嵌入式实时系统的任务调度方法

    高博 牛伟 马振华

    

    

    【摘要】? ? 任务调度是强实时嵌入式系统必备的功能,本文利用嵌入式处理器自身的中断机制,实现了一种应用于强实时嵌入式系统的可抢占式任务调度方法。该方法具有实现简单、占用空间小、运行效率高、复杂性低等特点,非常适用于资源紧张且对时间非常敏感的嵌入式系统。经过验证,本方法任务的周期准确、运行稳定可靠,且在多型产品中得到应用。

    【关键词】? ? 任务调度? ? 嵌入式系统? ? 数字信号处理器

    引言

    随着科学技术的发展,嵌入式设备的发展越来越快,用于工业控制的嵌入式计算机往往都是实时系统,要求系统中运行的各个任务都具有很强的实时性。一般为了解决嵌入式实时系统对任务实时性的要求,可以向系统中移植实时操作系统,但其对系统的存储资源都有一定的要求,再加上任务调度算法的存在,也会对系统的性能带来一定损耗。同时由于嵌入式实时操作系统功能不僅限于任务调度,对于一些简单的实时系统会引入很多无用功能,提高软件的复杂性,降低系统的安全性。除此之外,嵌入式电子设备为了降低成本,提高用户体验,越来越注重体积、重量、能耗、价格等因素,特别对于轻量级实时系统,它们对资源的要求更加苛刻。本文针对上述情况,介绍了一种基于CPU内部中断的抢占式实时任务调度方法,并使用TI公司的TMS320F2812系列数字处理芯片进行实现,该方法还具有简单的优先级管理功能。本文的任务调度软件可以大大降低对存储空间的需求,降低系统成本,提高运行效率,可以用于需要简单的任务调度功能的实时系统。

    TMS320F2812是TI公司生产的C2000系列中的一种高性能DSP,其主频最高可达150MHz,且外设资源丰富,性能稳定,广泛应用于各种控制领域。

    一、实现原理

    1.1任务调度原理

    嵌入式实时系统中往往具有多个实时任务,每个任务的执行周期均有严格的要求,任务间也具有优先级的区分,优先级高的可以抢占优先级低的任务。上述概念就是嵌入式实时系统中的任务调度,它的核心操作就是任务上下文切换。一个实时系统中实时周期任务的运行过程示意图参见图 1。

    图 1示例中有3个周期任务,其中高优先级任务的执行周期为t1,中优先级任务的执行周期为t2,低优先级任务的执行周期为t3。时间段A中,高优先级任务执行完毕,中优先级任务执行,同时中优先级任务的执行过程被高优先级任务多次抢占。在时间段B中,高、中优先级任务均执行完毕,低优先级任务执行,执行一段时间后,又被高优先级任务抢占。在时间段C中,各个优先级的任务均执行完毕,处理器处于空闲状态,低优先级任务的执行过程被高优先级和中优先级任务多次抢占。

    任务上下文切换的过程与中断类似,当需要任务切换时,需要完整地保存正在执行任务的现场,即CPU寄存器,并恢复即将执行任务的现场。除了最基本的任务切换功能外,还需要一些额外的算法和机制来支持任务调度以及任务优先级控制。本文提出一种方法,充分利用DSP2812本身的中断机制,实现一种简单的任务优先级控制和任务切换方法,仅支持抢占式任务调度,可以用于轻量级的嵌入式实时系统。

    1.2 DSP2812的中断机制

    使用中断实现任务调度,就需要把每个任务放在一个独立的CPU中断中,利用中断触发CPU自动的上下文切换。同时为了支持任务优先级的控制,就要求这些被当作任务的中断必须为可屏蔽中断,这就要求CPU的可屏蔽中断支持以下特性:

    1)可以通过软件触发;

    2)不同的中断具有不同的优先级;

    3)中断支持嵌套,且可以被多次嵌套;

    4)满足以上条件的中断数量应大于任务个数。

    DSP2812具有外设中断扩展(Peripheral Interrupt Expansion)模块,当使能PIE模块后,DSP2812的可屏蔽中断共有114个,其中有96个都是PIE模块扩展出来的中断,这些中断被分为12组,每一组包含8个中断源。

    DSP2812的可屏蔽中断首先受到全局中断标志INTM的控制。由于PIE模块的12个组分别连接到CPU的INT1到INT12,每一组的中断使能受到中断使能寄存器IER对应位的控制。最后每一组内8个中断又受到对应组的PIE模块中断使能寄存器PIEIERx的控制。DSP2812的PIE模块中每一个中断均支持软件触发,以通过软件触发某个PIEx.y的中断为例,首先需要使能INTM,然后在IER中使能INTx,在PIEIERx中使能INTy,最后通过向PIEIFRx的INTy写1,触发PIEx.y中断。

    利用中断实现多任务的调度,每次任务切换就是一次中断嵌套,对于DSP2812来说,它的C语言运行环境在进入中断服务程序后,会自动禁止全局中断,如果要允许中断嵌套,则需要手动使能全局中断。这种机制恰好方便了使用中断实现任务调度,在进入中断到手动使能全局中断的这段时间内,CPU不会被其他任何可屏蔽中断打断,也就是这段代码处于临界区。这段区域就可以使能比正在执行任务优先级高任务的中断,禁止比正在执行任务优先级低任务的中断,从而实现优先级控制。而中断现场的保存和恢复,也就是任务上下文切换由CPU的中断机制自动完成,同时如果DSP2812的C语言运行环境检测到中断服务程序中调用了函数,则会在进入中断时自动保存所有寄存器,这种机制极大地简化了任务上下文切换的过程。

    二、软件实现

    下面以一个强实时系统为例,说明本文方法的实现过程。该系统有1个外部中断,接到XINT1上,该中断在PIE模块中的中断源为PIE1.4。该系统共有2个强实时周期任务,执行周期分别为20ms和100ms,分别命名为TaskA和TaskB。

    2.1中断配置

    具有实时任务的系统中必须有一个时基,一般来源于CPU定时器,本例中使用DSP2812的定时器0作为时基,时基中断的触发频率为1kHz,即每隔1ms触发一次。定时器0的中断源为PIE1.7。

    此时PIE组1的中断已经使用了2个,为了方便使用,本例将2个任务均放在未使用的PIE组2中,使用PIE2.1和PIE2.2。

    根据上述中断的要求,具体中断配置如下:

    1)使能IER1和IER2,使能PIEIER1.4、PIEIER1.7以及PIEIER2.1和PIEIER2.2。

    2)软件中控制中断优先级从高到低的顺序为PIE1.4、PIE1.7、PIE2.1和PIE2.2。

    2.2定时器中断服务程序

    定时器中断服务程序就是时基的处理程序,该程序需要实现每个任务的调度。同时时基中断不能被任务打断,DSP2812处理器自身具有执行中断时默认关闭可屏蔽中断的功能。定时器中断服务程序要完成的操作如下:

    1)根据每个任务的运行周期,利用定时器中断次数计数器,周期性设置每个任务对应的PIEIFR寄存器。对于本例,每隔20次中断将PIEIFR2.1置位;每隔100次中断将PIEIFR2.2置位。

    2)为了防止任务函数执行超时造成重入,每次置位IFR时,需要预先判断对应的任务是否执行完毕,可以在任务的中断服务程序中,通过标志位实现。如果对应任务未执行完,需要设置超时标志,不能设置置相应的PIEIFR寄存器。

    3)累加定时器中断次数计数器,同时置位定时器的PIEACK寄存器,以清除定时器中断。

    2.3任务中断服务程序

    为了实现可抢占任务调度,每个任务中都可以被比自身优先级高的任务以及定时中断打断,因此任务需要允许中断嵌套。同时开启中断嵌套后,需要手动控制可以打断当前任务中断的使能。同时除了任务以外的其他中断应当保持使能。每个任务中断服务程序需要完成的操作如下:

    1)设置任务开始执行标志,以便定时器中断服务程序判断任务是否超时。

    2)将IER和PIEIER寄存器设置为使能比自己优先级高任务的中断,以及所有非任务中断。例如当运行最高优先级任务TaskA时,不允许其他任务抢占,但允许被中断抢占。此时IER需要使能第1位、禁止第2位,而PIEIER1保持不变,PIEIER2需要将第1位和第2位均禁止断;当运行TaskB时,要允许TaskA抢占,还要允许中断抢占,此时IER使能第1位和第2位,PIEIER1保持不变,同时PIEIER2禁止第2位使能第1位。

    3)使能全局中断,并执行任务,过程中允许所有中断和比当前任务优先级高的任务,打断当前任务的执行。

    4)禁止全局中断,将IER和PIEIER寄存器恢复为任务中断前的状态。

    5)清除任务开始执行标志并执行中断返回。

    三、方法验证

    采用第3节的示例对本文提出的任务调度方法进行验证,每个任务均执行耗费一定时间的操作,分别测量每个任务的执行周期,结果参见图 2。

    图 2中,上面的波形表示TaskA即20ms任务的执行情况,下面的波形表示TaskB即100ms任务的执行情况。20ms任务的执行时间大约为4ms,其中被外部中断打断时大约多执行1ms。100ms任务的执行时间大约为50ms,其中被20ms打断5次,大约需要20ms,任务本身的执行也会被外部中断打断。本方法任务运行周期稳定,能够实现实时任务调度。

    四、结束语

    本文提出的任务调度方法利用了DSP本身的中断机制,任务调度周期准确且可抢占,能够满足嵌入式强实时系统的要求。同时其代码量非常小,几乎不占用额外的運行RAM,且任务切换完全使用CPU本身的中断自动切换机制,具有安全性高、效率高的优点。