当前位置:
首页 >
单片机技术文章 >
51单片机 > 详细内容
- 时间片轮转算法在单片机程序设计中的应用
- 发布时间:2009/7/6 阅读次数:1846 字体大小: 【小】 【中】【大】
用户控制器向用户机发送的只有DTMF编码数据,用于告诉用户机谁正在呼叫它。
要完成一个呼叫过程(即使通话时间为零),至少需要2×104ms(接收、发送DTMF编码时间)+78ms(挂机时间)=286ms;完成一个被呼叫过程也至少需要2×104ms=208ms。如果每个用户机的请求就不能实时作出响应。为解决这个问题,在用户控制器程序设计过程中引入多任务机制。为便于任务调度程序的调度,根据用户操作流程将用户机的操作细分为16个字操作,每个子操作构成个子任务,用户子任务分配表如表1所示。
表1 用户子任务分配表
子任务号 |
功 能 |
执行时间 |
0 |
等待接收 |
26×n |
1 |
接收预处理 |
26 |
2 |
用户机查询 |
26×4 |
3 |
应答 |
26×4 |
4 |
接收第1位数据 |
26×4 |
5 |
接收第2位数据 |
26×4 |
6 |
接收第3位数据 |
26×4 |
7 |
等待上传 |
26×n |
8 |
确认 |
26×n |
9 |
响应 |
26×4 |
10 |
通话 |
26×n |
11 |
挂机 |
26×2 |
12 |
发送预处理 |
26 |
13 |
发送第1位数据 |
26×4 |
14 |
发送第2位数据 |
26×4 |
15 |
发送第3位数据 |
26×4 |
2.2 时间片的划分
在时间片的轮转算法中,时间片的大小对系统性能有很大影响。如果时间片太大,大到每个任务都能在一个时间片内执行完毕,则时间片轮转算法便退化为FCFS算法。时间片的确定通常要考虑三个因素:任务的数目、系统对响应时间的要求、系统的处理能力。
本系统中用户控制器需要对32个用户机进行管理控制,应划分成32个时间片。在不同时刻每个用户机处于不同的工作状况,用户控制器需要执行不同的用户机任务,其处理时间也不相同。为缩短程序运行时间把,时间片设置为可变的,时间片的长短取决于各个用户机子任务的工作量。但用户控制器与用户机之间的通信时间要求很严,如DTMF的发送定时时间为104ms,包括52ms发送时间和52ms空闲时间,所以用户控制器必须在52ms内对每个用户机巡检一次,才能正确地接收用户机的编码数据。也就是说一个任务调度周期不应大于52ms。为满足用户机与控制器之间的通信对时间要求,对整个任务调度周期进行精确定时。
综合考虑本系统中与时间片划分相关的三种因素:单片机本身的运算速度、用户机数目及用户机与控制器之间信号的传送要求,确定任务调度周期为26ms。即在26ms内用户控制器对其下一级的32个用户机的任务都要执行一次。一般完成一个任务占用一个时间片,较长任务可以占用多个时间片,如14号子任务(发送第2位DTMF编码数据)需要占用4个时间片才能完成。
为实时掌握各用户机的运行状态,在用户控制器的存储器开辟出一个缓冲区为任务记录表,供任务调度程序使用。任务记录表中设置了三项内容:用户编号、子任务号及时间片数,如表2所示。
表2 任务记录表
用户编号 |
子任务号 |
时间片数 |
0~31 |
0~15 |
0~16 |
3 软件设计
3.1 任务调度程序的设计
根据上述分析,可以确定任务调度程序的功能:
(1)按用户机编号调用各用户子任务;
(2)完成一个调度周期的时间不超过26ms,并在每个周期结束时对26ms进行精确定时;
(3)在调度周期开始时,读取所有用户的DTMF编码和摘/挂机状态,供各用户子任务处理;
(4)在调度周期结束前,根据用户子任务处理结果向用户机发送DTMF编码。
调度程序的流程如图2所示。

3.2 用户子任务的设计
用户子任务根据该用户缓冲区的数据进行处理,并把处理结果存放于结果单元。各个子任务并不与外部输入输出接口直接交换数据,对接口的输入输出由任务调度程序在调度周期开始和结束时调用专门子程序完成。用户子任务的切换工作根据操作流程在各子任务中完成。用户的操作被细分为16个子操作,相应地有16个子任务,图3为14号子任务的流程图。
在该子任务的开始(0ms)和中间(52ms)时刻设置DTMF数据发送缓冲区,分别允许和禁止DTMF编码的发送。在该子任务结束时根据该用户缓冲区内需发送的数据计算第2个的DTMF值,并修改任务记录表中该用户的调度数据,指向它的下一个子任务。其它子任务的设计思想与此子任务类似。
本文在单片机实时控制系统中引入了现代操作系统的多任务思想,采用时间片轮转调度算法对传统单片机编程思想进行了改进,并应用在基于MCS-51的分级分布式系统中,有效地完成了对32个独立用户的控制。实践证明这种结构清晰、调度灵活,适用于定时要求复杂、实时性要求强的系统。