0 引言
51单片机在微型智能控制系统中应用很广,随着人们对控制系统的要求不断提高,51单片机的功能局限越发明显。特别是51系列单片机不具有实时多任务支持功能,大大限制其在控制系统中的进一步发展。而多任务恰恰是现在操作系统的突出特点,将多任务机制引入51单片机系统,可以大大提高先有单片机系统的工作效率,满足多任务要求。
1 多任务机制在51单片机上的实现原理
多任务要求在同一时间内执行多个任务,如果只有一个处理,计算机并不是真的在给定时间段内运行多个程序,而是按时间片在各个程序间飞快切换,由于求欢非常快,所以就有了在同一时间内运行多个程序的错觉了。
就操作系统的特点来看,多任务系统不外乎两种方式:协同式和抢占式。在一个协同式多任务系统中,每个运行的程序都要负责释放CPU控制权以便别的程序能有机会运行,不管是显式地(Explicitly)还是隐式地(Implicitly)交出控制权。当一个程序因执行为某个目的而安排的一个特殊的系统指令(如程序对磁盘绝对读写指令)时,称它 显式地放弃控制权;当它因为执行某条系统指令,而该指令在执行时又会放弃CPU的控制权(如操作系统虚拟内存技术的页面切换)时,称它隐式地放弃了控制权。
在抢占式多任务系统中,操作系统必须具有从任何一个运行的程序上取走控制权和使另一个程序获得控制权的能力。一个抢占式系统下运行的应用程序不用担心独占系统,因为会合理地给每个运行的任务分配时间片。将这种系统称作抢占式系统是因为它不管在所给时间块内会发生什么事,都抢占运行程序的控制权。
51单片机本身是单任务工作的,即程序只能按单一的线索顺序执行,一个任务完成之后(除非中断),才能进行下一个任务。但是,51单片机内提供了T0和T1两个16位定时/计数器,若系统时钟为12MHz,那么计时器最长可计时65.536ms,最短为1us。也即通过对定时器工作模式进行设置,可以进行1us-65.536ms的定时器工作模式进行设置,可以进行1us-65.536ms的定时中断。如果把定时中断用作时间片段的分配,完全可以实现多个任务分时轮换执行。同时,单片机还提供INT0与INT1两个外部中断(可通过8259扩充多级中断)和P0,P1,P2三个可编程的I/O端口,与定时器配合下,完全可以实现具有优先权判别的多任务控制。
2 实现策略
2.1 通过定时器分配时间片实现多任务轮换执行
由于单片机内两个定时器可以同时工作,只要在一个定时器内开启/关闭另一个定时器,定时器交替工作,就可以实现更长时间的定时。两个16位定时器在不断增加外部计数单元的情况下,理论上可以实现1us-4.29之间的定时。但是由于中断和初始化设置等需要消耗单片机时间,所以单纯使用定时器产生的最长时间片比理论值短一些。单片机内部任务轮换来说已经足够了。
假设多个任务控制着多个设备,可以让单片机的I/O口连接相应的设备。每个任务分配一定的时间片,在时间片内占用CPU,进行运算和控制外部设备,多个任务之间实现轮换,其主流程如图下:
若用T0产生时间片,时间片中断内计时间片数,T1统计任务外不信号的频率,可供控制系统参考。部分汇编源代码如下:
org 00h;
jmp main
org 0bh
jmp tim0
org 1bh
jmp tim1
main:
. . .
mov tcon,#00000000b
mov tmod,#01010001b
mov th0,#high(65536-10000) ;10000微妙定时(时间片)
mov tl0,#low(65536-10000)
setb et0
setb et1
setb tr0
setb tr1
mov 40h,#100 ;中断次数即时间片数存入40h;以此1秒计时为例,定时器t0执行100次定时中断
tim0:
push acc
push psw
mov th0,#high(65536-1000);重复产生时间片
mov tl0,#low(65536-10000)
djnz 40h,tim0c
clr trl
nop
lcall xxxx ;调用任务调度程序
mov 40h,#100 ;重置时间片数
mov 42h,th1 ;保存t1的统计结果
mov 41h,tl1
setb tr1
tim0c:
pop psw
pop acc
reti
;用t1做统计某任务外部信号频率
tim1:
clr tr1
... ;其它调度程序
setb trl
reti
2.2 通过外部中断后扫描端口来切换任务
如果单片机外接较多的传感器,任务的切换需要考虑外部传感器状态的时候,就需要通过单片机相应外部中断的方式切换任务。但是,51单片机只是提供了两个外部中断,在实际的智能仪器中完全不够用,只有扩充中断口。最常用的中断扩展芯片是8259A,其是一块功能很强的肯编程中断控制器,可将多个外部中断请求连接在单片机的外部中断请求引脚INTR,并且有多种工作方式和中断优先级排序机制。这样处理势必增加电路的成本和复杂度,对改造先有单片机任务机制的单片机控制系统是很不利的。
考虑到很多微型控制系统中单片机的I/O端口并未全部利用,可以将剩余的I/O端口作为外部传感器的状态输入端(单片机电源为+5V),同时让传感器输出端通过反相器统一接在单片机的外部中断请求引脚,任何一个传感器都可以向单片机发出中断请求。在中断后,通过程序扫描输入端口状态,确定是哪一个设备要求中断,从而切换到相应的任务。在没有中断请求时,系统按任务的产生顺序执行。在此有二问题需要解决:
(1)若单片机I/O端口不多余时,怎样处理多个中断请求。采用多路编码的方式可以缓解单片机端口不足的问题。例如芯片74LS148,是一块8-3编码器,完成八路信号编码到三位二进制信号,只要将三位输出信号端接入单片机I/O端口就可以通过程序判定八路外部中断。其电路图如图二所示。以此类推,可以满足更多传感器或设备与单片机相连。
(2)外部中断的优先级如何处理。由于实际的微型控制系统中,单片机连接的外部设备比较固定,也即各外部设备中断的优先级比较固定,完全可以用较简单的优先级表法实现优先级的确定。只要在内存中预置一片数据区,对应表示外部设备的中断优先级,那么就可以通过检查表的方式获得优先级别,从而判断任务的切换方向。进一步可以通过程序动态的修改长期等待和长期运行的任务对应的优先级,所有任务都有机会获得CPU。
3 二种策略的比较
上述第一种策略的主要特点是:各任务在任务调度程序控制下有条不紊的执行,每个任务在给定的时间片内完全占有CPU,可以完成既定子任务,同时又在时间片结束时让出CPU,以便其他任务执行。只要恰当地选取时间片,就可以很好地协调多个任务连续执行,比较适合于批处理系统和任务既定控制系统。第二种策略的主要特点是:实时性很好,可以实现系统与外界交互,及时地调度相应任务。因为,在受外界影响很大的实时控制系统中,更多的需要考虑任务的优先级和外部传感器的状态,使用外部中断切换任务是比较理想的。而且使用了先中断再查询的策略,大大提高了查询速度和准确性,同时对多路控制也有较好的支持。
4 结束
现在有单任务机制的51单片机系统中实现多任务机制,仅仅在升级软件(即ROM芯片中程序的重新烧写)和增加,更改少许硬件电路的条件下,就可以使控制系统支持多任务处理和控制,不仅升级成本低,而且大大延续系统的寿命和扩充系统的功能,具有较高的使用价值。