通过任务分割提高嵌入式系统的实时性
在这个内核中,每0.5ms发生1次时钟中断,而每10次时钟中断组成了1个时间片(5ms)。任务1的优先级最高,每2个时间片(10ms)会执行1次,任务2每4个时间片(20ms)执行1次,优先级最低的任务6则每64个时间片(320ms)会执行1次。
4.2 系统中的键盘任务问题
在单片机系统中,键盘主要用于输入数据、代码和命令,因此系统必须循环不停地扫描扫描;一是有键波按下,CPU立即做出响应。键盘任务子程序也是根据这个要求而设计的。一般有两种处理方式:一是中断方式,二是查询方式。从有键按下时开始,到按键释放并转相应子程序而终止。该任务被内核调度的情况如图3所示。
图3中,Δt是人手按键的时间,一般为100~300ms。为了能说明问题,这里取100ms。
令 t1'-t1=Δt1,t2'-t2=Δt2
则一次键盘任务的执行时间
Δt'=t'2-t'1=t2+(t'2-t2)-[t1+(t'1-t1)]=
t2+Δt2-t1-Δt1=
t2-t1+(Δt2+Δt1)=
Δt+(Δt2-Δt1)
由图3可知
Δt1≤tms Δt2≤5ms
实际上,由于两次任务执行的情况不完全相同,Δt1与Δt2可能会有相当于几个指令周期的时间差异,但也只是μs级的误差。而且,这里是以时间片的形式来计算的,所以依然可以认为
Δt2-Δt1=0
因而有
Δt'=Δt+(Δt2-Δt1)=Δt=100ms(20个时间片)
也就是说,在这20个时钟片内只执行1次键盘任务,大部分的时间都在空等待。在此期间,系统中会有20-1=19次其它任务的执行被错过,图3中虚线所示就是在此100ms期间被错过执行的19个任务。显然,这在大多数多任务系统中都是不允许的。
因此,在这个多任务实时系统中,键盘任务是个典型的长任务,要使其它19次任务中断都有被应用的机会,必须对该键盘任务进行分割。
4.3 键盘任务的分割
键盘分割的方法是将一次键盘任务分成多个小任务,通过多次任务中断来完成。我们将其放在任务4中(80ms执行1次)。这样有ttask4≤ttask≤2ttask4,即可以保证键盘任务完整可靠地执行,又提高了CPU的效率。图4是分割后的键盘任务的执行过程。
javascript:window.open(this.src);" style="cursor:pointer;"/>
情况b中,第二次任务中断时(tb2时刻),键还没有松开,因此实际上什么也不做;第三次中断(tb3时刻)才跳到与键值对应的子程序。
通过这样的分割,每个子任务都可以在5ms内完成。如果系统中还有大于5ms的长任务的话,可按此法继续进行分割;如果没有的话,系统任务级响应时间一定小于5ms。这样,此系统的实时性大大提高,由100ms提高到5ms。本刊网络补充版(http://www.dpj.com.cn)中,介绍了此任务改进后的部分源程序。
结语
通过任务分割,可以显著地提高多任务系统的实时性。本文改进后的源程序已经在基于MC68HC908GP32的温室控制器中成功地运行过。除此以外,还成功地对LED和SCI任务进行了分割。改进后,除了实时性大大提高外,CPU的执行效率也有显著提高。