通过任务分割提高嵌入式系统的实时性
①分析系统共有多少个任务,这些任务对实时性的要求有多高,求出各个任务所要求的最小执行频率f1,f2,f3……fn。
②计算目前各任务的实际执行时间t1,t2,t3……tn。
③确定系统中的长任务
如果max(t1,t2,t3…
…tn)≤min(1/f1,1/f2,1/f3……1/fn)
则此系统中不存在长任务。
如果max(t1,t2,t3……tn)>min(1/f1,1/f2,1/f3……1/fn)
则存在长任务,而且执行时间为max(t1,t2,t3……tn)的那个任务就是要找的长任务。
④分析此长任务是否需要分割
分析一下是什么原因导致执行的时间过长,这个时间还能够通过程序的优化来缩短?如果能,则不需要进行任务分割;否则要对这个长任务进行分割。
3.2 任务分割
常用的任务分割的方法有以下两种:
①将长任务按功能分为若干个小模块,每一个模块构成一个小任务,每个小任务执行一个相对独立的功能,且要保证执行时间t<min(1/f1,1/f2,1/f3……1/fn)。各个任务被内核顺序调用,合起来完成整个任务的功能。
②有的长任务比较特殊,例如键盘任务和动态LED显示任务,很难按照方法1所说的把它分成若干个功能相对独立的小模块。这时,一般是按照方便保存现场信息原则,强制将其分割成若干个小任务,每个任务在min(1/f1,1/f2,1/f3……1/fn)时间内主动保存现场信息、放弃CPU的控制权,等到再次被内核调度时继续执行。
这种分割方法相对复杂,各任务之间界限不是很明显,看似未经分割,但实际上它确实是由多次任务中断来完成。下面就以这种分割方法为例具体说明。
4 实例分析
4.1 系统介绍
在此,系统的硬件基础是基于MC68HC908GP32单片机系统的,用其普通I/O口作为矩阵式键盘的输入输出引脚;软件基础是在MC68HC908GP32中运行Motorola公司的Joanne Santangeli编写的基于时间片的不可剥夺的实时内核,如图2所示。
此内核主要是利用微控制器内部的时间模块产生恒定的实时中断,将CPU的运行时间分成一个个时间片。内核的任务调度工作都是在时间片的开始阶段完成的,而每个任务都必须在单个时间片内完成。
在这个内核中,每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
《通过任务分割提高嵌入式系统的实时性(第2页)》