当前位置:华创抄板公司 >> 新闻中心 >> 行业动态 >> 深圳pcb抄板单片机技术的分时操作系统的应用实例

深圳pcb抄板单片机技术的分时操作系统的应用实例

    分时操作系统把CPU的时间划分成长短基本相同的时间区间,即“时间片”,操作系统轮流分配给各个作业使用。某个作业在时间片结束完成,该作业将被挂起,等待下一轮循环再继续做。
    分时操作系统主要具有以下3个特点:多路性,用户通过各自的终端,可以同时使用一个系统。及时性,用户提出的各种要求,能在较短或可容忍的时间内得到响应和处理。独占性,在分时系统中,虽然允许多个用户同时使用一个 CPU,但用户之间操作独立,互不干涉。
    分时操作系统主要是针对小型机以上的计算机提出的。一般而言,MPU驱动的通用计算机,系统设计人员对每一台的最终具体应用都是不得而知的,因此,在价格允许的情况下,硬件设计务求CPU时钟尽可能的快;计算及管理能力尽可能的强;程序和数据存储器的容量尽可能的大;各种计算机外设的配接尽可能的详尽等等。特别是采用分时操作系统的机器,因为是一机多用户的管理系统,它的要求就更高了。
    相对而言,MCU是一个单片集成系统,它将这些计算机所需的外设,诸如程序和数据存储器、端口以及有关的子系统集成到一片芯片上。从硬件上,单片机系统与采用分时操作系统的计算机系统是无法比拟的。但是,在单片机系统的设计中,设计人员清楚其最终具体应用,它的使用环境相对是单一固定的。所控制过程的可预见性为分时系统思想的实现提供了可能性。
    具体就是:虽然单片机的CPU速度较低,但其任务是可预见的,这样作业调度将变得简单而无须占用很多的CPU时间,同时“时间片”的设计是具体而有针对性的,因此可变得很有效。
    分时系统的应用实例
    系统硬件及原理
    本文设计了一个涉及单片机通信以及显示的漏电流智能监测系统,系统框图如图1所示。
    图1 漏电流智能监测系统框图
    本系统用在低压电网中负责监测线路的漏电流,系统中智能采集单元负责采集线路的漏电流,通过串行总线与主控单片机通信,上传线路参数值。主控单片机轮询各线路,实时显示漏电流值,当线路漏电流超过设定值时,在EEPROM中记录漏电流的各项参数和发生的时刻,通过键盘显示可以查询以往线路的情况。
    由图1可知:各智能采集模块共用一个实时时钟,因为不管从成本的角度还是从方便角度考虑,电路板克隆都不可能给每个采集模块配置一个实时时钟。采用传统的编程方法时存在一个问题:当智能采集模块有多路时,数据上传后需要显示该路数据,显示时间不宜太短,下一路数据的显示便出现延迟。线路的路数越多,编号靠后的线路的时间延迟越严重,系统的实时性变得很差。因此传统的编程方法不符合实际情况,本文设计了分时操作系统解决此问题。
    分时操作的实现
    系统设计中首先划分了一块暂存参数的RAM,RAM区的大小跟需要监测线路的多少有关,其分配情况如图2所示,每一路参数都设置多组参数存贮,防止参数未读取就被刷新。每一组的参数包括漏电流大小、漏电标志位、线路的编号和发生的时间。
    图2暂存RAM分配图
    要合理的实现单片机分时系统必需要有合理的调度机制,完善的调度机制由调度指针和调度表组成。系统的调度就是“路任务”的调度,在系统设计中按各线路智能采集模块把系统划分为N个“路任务”, “路任务”的执行顺序固定不变,从第一路任务到第N路,再从头返回第一路,如此循环往复。相对应的“路”调度指针还应构造“路”调度表。“路”调度表每一项表示各“路”程序入口地址及跳转指令。以MCS-51单片机为例,采用AJMP addr11作为每一项的内容,则调度表的每一表项占2个字节;当程序较长超过2K字节,则采用LJMP addr16作为每一项内容,占3个字节。
    所设计的单片机系统共有多少“路任务”,该调度表就有多少项数。调度指针为1个字节的整数变量。pcb抄板调度指针与调度表的联系是通过指令JMP @A+DPTR实现的。DPTR中是调度表的首地址。累加器A中的内容是调度指针的整数倍,若表项内容是AJMP addr11,则A的值为调度指针乘2;若表项内容是LJMP addr16,则A的值为调度指针乘3。
    “路任务”的职责就是与智能采集模块的 CPU通信,收集线路的漏电参数的值,储存在暂存RAM中,“路任务”中共同的部分:从串口读取数据,安排在定时中断中实现,因为各线路需要上传的字节数很少,为三个字节(漏电流大小占用2个,超限标志占用1个字节),因此在波特率9600的情况下,通信时间极短(3/960<4ms),安排在定时中断中实现比较合理。这样“路任务”只需要设计出访问暂存RAM的方法,本例中在每路暂存区的开头定义访问指针,“路任务”每次访问时先读取该值,然后把数据写入相应的RAM区,返回时将访问指针指向下次要访问的地址,到了末尾地址时重新指向RAM的开头。