搜索
bottom↓
回复: 6

【转载】时间片调度在单片机中的运用 --------请高手们讲讲自己的调度方法

[复制链接]

出0入0汤圆

发表于 2011-8-4 15:45:46 | 显示全部楼层 |阅读模式
转自百度空间,谢谢原作者http://hi.baidu.com/fuyjlu/blog/item/7df0d0a5091b879a46106475.html



  单片机在系统中充当CPU的角色,需要同时处理多个事务。如与PC机通信,将收到的信息转发给从机,监视数据处理情况等一些繁杂而又重要的事情。如何协调好各个事务之间的关系,并有条不紊的执行各个事务,这就需要在编写程序时采用合适的算法进行处理。一般的方法就是在单片机中移植操作系统,由操作系统来管理各个事务。但由于系统要占用一定的内部资源,这对本身资源非常有限的单片机来说是不现实的。所以,很少在单片机中采用操作系统,而是采用时间片轮询调度的方法进行各任务的管理。
时间片轮询调度是一种古老而又简单的算法,广泛运用于无操作系统的微处理器中。在系统中,每个进程被分配一个时间段,称作时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。

时间片轮询调度中有趣的一点是如何确定时间片的长度。从一个进程切换到另一个进程是需要一定时间的,因为要保存和装入寄存器值及内存映像等保护现场的工作,更新各种表格和队列等。假如进程切换,有时称为上下文切换,需要的时间为5毫秒,再假设时间片长度设定为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。进程切换时间一定的情况下,如果时间片长度设定的越小时,这种浪费更明显。所以,时间片长度与CPU利用率是一对不可调和的矛盾,必须处理好它们之间的关系。

    为了提高CPU效率,我们可以将时间片长度设得大一些,这时浪费的时间只有就会相对减小。但在一个分时系统中,各个任务对时间片长度的要求是不一致的。例如在一个系统中,可能要求每秒钟更新一下显示内容,每几十毫秒要扫描一下按键,每几毫秒要检测一下串口缓冲区等……可见,各个任务对时间的依赖程度是不一样的。如果时间片设得太长,某些对实时性要求高的任务可能得不到执行,使得系统的实时性变差。总之,时间片的设定应满足对实时性要求最高的那个任务,这样才能确保每个任务都可以及时得到执行而不被错过。

要在一个单片机系统中实现时间片轮询调度,需要依照以下的步骤:

2     确定任务总数及各个任务实对时间实时性的要求

2     根据任务对时间的要求,确定时间片的长度

2     估算执行每个任务所花费的时间,确保任务能够在时间片的长度内执行完毕

2     如果任务较大,时间片不足于让任务执行完,此时可细化该任务

       在下面的代码片段中,共有4个任务需要执行,其中串口对实时性的要求最高。串口采用的波特率为2400Baud,8位数据,无校验,1个停止位。所以传输1字节数据所需时间为:4.17ms,故将时间片长度设定在4ms是合理的。单片机主机系统的时间片处理函数如下所示:

/*********************************************************************************************

*函数名称:void timer1_ovf_isr()

*函数功能:时间片中断处理函数,时间片长度4ms

*入口参数:无

*返回参数:无

**********************************************************************************************/

#pragma interrupt_handler timer1_ovf_isr:9

void timer1_ovf_isr(void)

{

//TIMER1 has overflowed

TCNT1H = 0xF0;        //reload counter high value

TCNT<?XML:NAMESPACE PREFIX = ST1 />1L = 0x60;           //reload counter low value

TimeCount++;

if(TimeCount==50){TimeCount=0; CC1100_SendFlag=1;}    //无线收发任务处理标志

TimeOver();                    //超时检测函数

Alarm_Detect();             //告警检测函数

DealComFlag=1;          //串口任务处理标志

}

     在主函数中,根据标志位调用相应的函数进行数据处理,然后将标志位清除,等到下一个时间片到来后再开始新一轮的数据处理。                                                      

int main(void)

{

   if(CC1100_SendFlag==1) { ... ; CC1100_SendFlag=0; }    //无线收发任务处理标志

if(DealComFlag==1){ ... ; DealComFlag=0; }                         //串口任务处理标志

   ......

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-8-4 20:00:51 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-8-4 20:45:57 | 显示全部楼层
现在的嵌入式系统也已经很小了,占用的内存也小。

出0入0汤圆

发表于 2011-8-11 22:58:34 | 显示全部楼层
很好~

出0入0汤圆

发表于 2011-11-11 11:16:35 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-11-11 11:23:11 | 显示全部楼层
对于一些逻辑较多教复杂的软实时(1ms级)监控程序

我一般用三把斧头:
合作式时间调度器
状态机
施密特事件触发器

出0入0汤圆

发表于 2017-4-11 11:30:48 | 显示全部楼层
blue.fox 发表于 2011-11-11 11:23
对于一些逻辑较多教复杂的软实时(1ms级)监控程序

我一般用三把斧头:

前辈可以请教一下您三板斧的细节吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表