完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是一个能在PIC16F877A开发板上运行的固定时间片轮询调度汇编程序代码。
为什么要用时间片轮询调度? 假如我们要写一个单片机程序,程序的目的就是用GPIO控制一个灯亮一秒再暗一秒…最简单的写法是用循环来计时,循环n次凑够一秒钟时间,然后去把GPIO的值反一下,然后再继续循环一秒钟… 这样写程序的问题就是,这个程序除了闪灯之外就啥也不能做了,给GPIO赋值只需要一秒钟执行一条指令,并没有消耗什么CPU资源。但CPU资源都浪费在了循环上。所以这种写法在实际应用中基本上是不可取的,而且这样计时也不够精确。 高级一点的写法是用单片机里面的硬件计时器,定时一秒钟,时间到了会触发中断,在中断响应程序中去赋值GPIO点灯。这样CPU在其它时间就空闲了可以干别的事情。但这样写法也有问题,那就是单片机里面的硬件计时器个数是有限的,如果有很多功能都需要定时,计数器不够了怎么办? 解决这个问题的一种方法就是时间片轮询调度法,调度的就是CPU的资源,也就是不同时间片会执行不同的程序。其实现在的操作系统底层都会用这种时间片调度法,也就是分时复用。某个时间片里执行的完成某项功能的程序就类似于一个线程。 该程序干了啥? 程序在开发板上实现了秒表,流水灯,按键检测等几个功能。具体可见代码前面的注释。流水灯一秒走一次,码表100ms加一,按键检测需要10ms检测一次按键值进行按键去抖,数码管需要2ms循环刷新。所以这个程序需要很多个不同时间的定时。其基本程序是一个200μs的时间片循环,然后通过对时间片进行计数,并对这些计数进行判断来决定该在合适调用哪个子程序。具体时间片的分布图,和程序流程图可见“TimeSlice流程图.vsd”文件。 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:52 , Processed in 1.322889 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号