3. 4 任务的划分和构成
系统中并行存在的几个任务按优先级从高到低依次是:显示任务、键盘管理任务、输出任务、各路数据数据采集任务和数据处理任务。系统采用静态优先级,这样系统的控制会相对比较简单。
系统中的每个任务包括应用程序、任务堆栈以及任务控制块( TCB) 三部分。任务控制块是一个数据结构,当任务的CPU 使用权被剥夺时,ucosII 用它来保存该任务的状态。当任务重新获得CPU 的使用权时,任务控制块能确保任务从被中断的那一点执行下去。操作系统可以通过查询任务控制块的内容从而对任务进行管理。系统中任务的状态有5 种:休眠态、就绪态、运行态、中断服务和等待态。状态之间的转换如图5所示。
休眠态时任务驻留在程序空间中,还没有交给uc/ os2II 管理。当任务一旦建立,就进入就绪态。就绪态中优先级最高的任务转为运行态。如果系统的运行导致就绪态中的一个任务优先级高于运行态的任务优先级,则系统通过调度使运行态任务丧失对CPU 的控制权转为等待态或者就绪态,转而运行就绪态中的那个任务。这样就实现了任务的切换。
每个处于等待态的任务都对应一个等待时间,时间管理函数可将等待时间已过的等待态的任务转为就绪态,这实际上也就是时钟中断的中断服务程序。
3.5 任务的通信和调度
本系统中任务间的通信采用消息队列来完成的。消息队列是uc/ os2II 中的一种通信机制,可以使一个任务或者中断服务子程序向另一任务发送以指针方式定义的变量。为方便易用,采用消息队列,用于数据采集任务、数据处理任务、键盘管理任务、输出任务、显示任务之间的通信。系统通过队列控制块来管理消息队列,每个消息队列对应一个队列控制块。消息的存取基于优先级原则,队列控制块中等待任务列表内优先级任务最高的任务先从消息队列中取消息,系统采用抢占式内核,调度函数总是保证优先级最高的就绪态任务转为运行态。当就绪态的任务抢占CPU 时,系统执行一次中断服务程序。当任务中的消息发送完成以及中断返回时,系统调用调度函数,将任务从等待态转为就绪态,这样就绪态中任务的最高优先级就会发生变化,进而影响到运行态和就绪态间的任务切换。在本系统中,正在运行的任务需要通过消息(调用OSQPEND( ) 函数) 来等待一个事件的发生。假如该事件一直没有出现,调用该函数的任务将被置于等待状态(优先级最低的任务可不需要等待某个消息) 。此时下一个优先级最高的任务将立即获得CPU 控制权。
4 系统的工作过程
本系统采用两种方式显示采集电流的大小,循环显示和指定显示,在正常工作情况下,采用循环显示方式显示8路采集电流大小,每采集完一路电压,就向数据处理任务发送一条消息,而数据处理任务每处理完一路就向显示任务发送一条消息,由于键盘扫描任务优先级比数据采集任务最高,每当用户键盘选择时,就抢断当前采集任务,而去处理用户需要选择的那路电压,并相应显示。当采集电流超过一定标准时,系统会报警,以告之监测人员,另外本系统还留有串行232接口,用于和微机通信,以储存杂散电流的历史情况。当所有任务运行完后,开始下一个周期的运行。应用程序与uc/ os2II 的内核是一起下载到单片机系统中。成功的移植需要对内核程序进行一定的修改,主要是修改内核中与硬件密切相关的几个文件,具体可参考相关文献.
5 结束语
本系统经调试,软硬件工作均正常。实验证明,本系统较传统的数据采集系统在安全性和实时性方面都有了很大的提高,完全能够适应复杂系统的需要。