|
分时多任务机制在汽油机电控单元中的应用
陈杰 郭少平 朱辉
摘 要:汽油机电控系统的程序设计直接关系到控制的精度,控制程序的设计与硬件设计同样重要。探讨了分时多任务机制在汽油机电控系统中的应用,改进了原有的程序设计,提出了一种新型的程序设计结构。 关键词:汽油机 分时多任务 子任务 电控单元 程序设计 分类号:TK401
Application of Time-Sharing Multitask Mechanism in Electronic Control Unit for Gasoline Engine▲
为了满足日益严格的排放法规,进一步提高发动机的动力性与燃油经济性,采用精确、灵活和高效的电控技术是发动机技术的发展方向。随着电控单元的硬件功能逐渐完善,对用于驱动电控单元的控制软件的要求也越来越高。如何在现有的单片机处理速度下实现对更高转速和更多参量的控制,成为汽油机电控的一个研究课题。本文就分时多任务机制在汽油机电控单元中的应用作一些探讨,提出一种控制程序的设计思路。
1 分时多任务机制介绍
电控单元中的单片机需要完成的许多任务中,有的需要同时处理。在理想情况下应该对这些需要同时处理的任务采取并行处理的方法,但对于只有一个CPU(一般情况下)的电控单元来说,这是不可能实现的。因为它在任何时刻只能完成一个任务,所以绝对的并行处理对于一个电控单元来说是不可能的,即使是通过设置精确复杂的中断逻辑,也只能实现通常意义上的准并行处理。 在控制系统中,为满足有些任务的实时性要求,一般采用前后台的程序结构,即把计算比较复杂、运行周期较长以及实时性要求较低的程序作为后台程序,而把实时性要求高、处理时间短的程序作为前台程序。后台程序采用顺序执行的方法,前台程序由CPU采用中断的形式完成。CPU在大部分时间内运行后台程序,当中断发生后,CPU暂时挂起后台程序而去响应前台程序;前台程序结束后,再转入后台程序处理。当前台程序设计得较为短小时,就可以实现前后台程序的准并行处理了。在该程序结构中,如果控制任务比较复杂,则前台程序往往有多个中断,发生中断嵌套的概率很大,这可能会使中断响应推迟而影响控制精度;因此需要前台程序正确地设置中断优先级和禁止/允许中断,以保证控制的准确性。 后台程序在ECU的控制软件中一般被称为主循环(见图1),其中有若干个子程序,分别用于控制发动机的某一个或几个参数。通常在电控单元中,这若干个子程序是按照固定顺序依次执行的,次序不可改变。这些子程序按固定的次序构成一个整体而作为一个任务被执行的是单任务机制。在单任务机制中,这些子程序被执行的频率是相同的,而在实际应用中,各个子程序要求的执行频率往往有很大的差别,如采样大气压力和采样蓄电池电压就有很大的不同。这种不同频率的执行要求在单任务机制系统中是难以被满足的。另外,在单任务的程序结构下,程序一旦建立,各模块的执行顺序即已固定,对于需要在运行时动态改变执行结构的系统,如发动机管理系统,程序需要用很多的条件判断和分支转移语句进行控制,增加了程序的复杂性。虽然电控单元对一些实时性要求高的任务采用了中断的方法进行处理,但由于单片机的中断资源有限,所以除了为数不多的几个中断程序外,其他处于主循环中的各个子程序只能按照单任务的机制执行,缺乏灵活性,在越来越复杂的发动机控制中会逐渐变得难以胜任。

图1 通常情况下汽油机电控单元主循环的流程
如果将主程序中的有不同执行频率要求的子程序理解为子任务,并引用分时多任务机制进行管理调度,这就会形成一种新的程序结构(见图2)。此时主程序中只执行那些没有严格的执行频率要求的程序,而其他有执行频率要求的子程序放在分时多任务结构中实现。分时多任务机制是现代操作系统才具有的突出优点,在这种机制下,CPU的运行时间被划分为许多小的时间片,由某种调度算法按照不同的优先级分配给不同的应用程序。多个应用程序分别在自己的时间片内访问CPU,从而造成微观上轮流运行,宏观上并发运行的多任务效果。在发动机管理系统中引入分时多任务机制,可以有效地改善程序结构,满足发动机控制这一复杂系统的要求。

图2 分时多任务机制应用于汽油机 电控单元后的主循环与分时结构
2 多任务机制在汽油机控制中的实现
利用单片机内部的时钟中断,可以方便地实现多任务机制。下面以Intel 196系列单片机80C196KC为例,说明其实现的方法。 对分时多任务机制必须提供一个系统时钟,80C196KC内部的时钟资源中有两个可内部计数的定时器T1和T2,从中选择T1作为分时信号源。在16 MHz的晶振频率下,经过80C196KC内部的2分频电路,其一个状态周期对应的时间是125 ns,每8个状态周期T1计数器增1,则最长 每 经过65535×125×8=65535000 ns=65.535 ms的时间内,T1将发生一次溢出中断。通过向T1写入初值的方法,可以使溢出中断每隔0~65.535 ms发生,这个时间片的长度是由各个子任务的执行频率综合决定得到的。这样CPU根据系统时钟将运行时间划分为若干个时间片,由系统调度程序分给各个任务模块。定时参数的选择要考虑到系统中的各种定时要求,定时频率一般应设计为各模块要求的执行频率的整数倍频。 为实现分时多任务,还需构造一个任务查询表并维护一个系统任务指针。任务查询表的表项数等于需要调度的任务模块数,每一表项占4 B,保存各子任务模块的入口地址和访问计数值。访问计数值是一个整数,它的大小与子任务要求的被执行频率有关,要求的被执行频率越高,则此访问数值越小,最小为1。任务查询表指示了各任务的执行顺序和优先级别。在建立程序的时候,可在程序存储器中建立一份缺省的任务查询表并在程序初始化的时候调入系统的RAM中,在程序运行期间可根据实际需要修改RAM中的任务查询表,使各任务的执行程序和优先级别得到动态调整。系统的任务指针为一个1 B的整数,指向当前系统正在执行的任务。由系统任务指针和任务查询表就可以找到相应的任务入口地址。 多任务机制的具体实现由调度程序完成(见图3)。调度程序在每个时钟的开始取得控制,它将系统任务指针加4,指向下一个任务模块,并根据新的任务指针查阅任务查询表,将任务的访问计数值减1,判断是否为0。不为0则直接返回主循环,为0则跳转到该任务的入口地址处执行。各任务模块执行完毕后将相应的访问计数值置为初值,供调度程序下一次使用。任务指针到达调度表末尾时,由任务调度程序将其复位,使之指向任务查询表开头,重新开始程序周期。

图3 分时多任务机制下系统调度程序的执行流程
在汽油机电控单元中实现分时多任务,并不是完全取消主循环,只是对主循环作了一些改动,使得主循环只用来处理那些耗时相对较长而对执行频率又没有特殊要求的任务。由于在分时多任务结构中各个子程序只是按照它们的执行频率要求被执行,一些没有必要被执行的子程序被跳过,而它们所对应的时间片将被主循环所利用,这样会使有不同执行频率要求的任务得到相应的执行频率,提高了时间的利用率,从而加快了主循环中对各种控制参数的计算刷新速度,大大减少了因计算刷新不及时而仍沿用上一次的控制参数的可能性,使得系统对外界的响应速度得到提高。 实现分时多任务的关键在于合理地将系统的功能分解为各个任务模块,分解系统功能应该注意以下几个问题: a) 各个子任务模块应尽量短小精悍,在系统时间片内能得到充分执行。在设计任务模块时应尽量将其中的延时要求转化为对模块执行频率的要求; b) 在设计中若不可避免出现某一任务模块过长而不能在系统时间片内执行完毕的情况,可将其放入主循环中; c) 各任务模块在功能上应尽量相互独立,以保证程序调试和维护的方便; d) 若某些模块必须相互配合工作,可采用公共存储单元进行通讯,完成数据传递,以保持同步。 理论上,若系统中要求执行频率最高的程序要求每X ms被执行一遍,而系统中有Y个子任务,则系统可将CPU的时间片定为X/Y,这样在通过设定不同的访问计数值就能保证所有的执行频率要求了。在执行时间片程序时,可能发生实时性要求强的中断请求,所以必须作一些处理,否则可能会导致子程序的被执行频率受到影响,从而影响程序的控制精度。针对这种情况,可以增加时间的冗余度,即另外再多配置一些时间片,专用于补偿。例如,主循环中共有40个子任务,其中要求执行频率最高的子任务要求每20 ms被执行一次,按照上面提到过的计算方法,时间片应该为20 ms/40=0.5 ms=500 μs,考虑到补偿需要,可将时间片定为400 μs,这样多了10个时间片,可用于补偿执行频率受到的影响。 在单片机系统中实现分时多任务机制,要借助于时钟中断,由定时器产生系统时间片,由系统调度程序将时间片分配给各任务模块。各任务模块在时钟中断中执行,很好地满足了各任务对执行频率的不同要求。考虑到单片机调度能力有限,为各个任务模块分配的时间片比实际所需可能富余,而各任务模块作为时钟中断程序执行完毕后都返回主程序,因此,可将某些对执行频率无要求可执行时间比较长的任务模块放入主程序中运行,从而充分利用了各时间片内的富余时间,提高了程序的运行效率。
3 应用实例
以一个用80C196KC作核心处理器的汽油机电控单元为例,讲述分时多任务机制在汽油机管理系统中的实际应用。 在该汽油机的控制程序中,主程序要完成蓄电池电压采集、冷却水温度采集、氧传感器信号采集和大气压力采集等许多任务,取其中几个比较典型的、执行频率有明显不同的子任务作为例子,主程序共要完成40个有不同执行频率要求的子任务,40这个数是经过在多任务结构与主循环之间仔细权衡,并充分考虑了各个子任务的执行时间后确定的。 子任务P1:蓄电池电压要求每60 ms采集一次; 子任务P2:冷却水温度要求每60 s采样一次; 子任务P3:空调请求开关的状态要求每1 s查询一次; 子任务P4:大气压力(用于海拔高度修正)要求每10 min采样一次; 并且这40个子程序中执行频率最高的要求每20 ms执行一次,将该子程序标记为P5;考虑补偿后,将时间片长度定为400 μs。 设计的任务查询表见表1。
表1 任务查询表 |