单片机时间片轮询法

摘要:
我今天有一点空闲时间。让我们谈谈我在最近的项目中使用时间切片轮询方法的经验。这里将不解释时间片轮询方法的具体结构。需要了解的网友可以去看最后一篇建筑帖子,这篇帖子描述得非常详细。请注意你不明白的地方,我会尽力把它说清楚。自从发布架构文章以来,我的项目开发一直使用时间片轮询方法进行开发,我刚刚遇到了很多问题。在解释注意事项之前,我想特别指出,您必须相信可以由操作系统实现的时间片轮询方法是可以实现的。

原文地址::http://bbs.eeworld.com.cn/thread-319810-1-1.html

上次发帖《浅谈单片机应用程序架构》后,很多网友都希望有下午,详细说明3中架构的具体应用。而在这一段时间以来本人一直在考虑写这样一个帖子,但是由于工作的原因基本上没有时间写这样一个贴。今天有点空余时间,就这里谈谈,本人在最近几个项目中使用《时间片轮询法》的一些心得。至于网友希望获取3中架构的应用实例,只能看以后有时间后来编写了,希望大家支持与理解。

对于时间片轮询法的具体架构在这里就不在阐述了,需要了解的网友可以去看上次发的架构贴,里边已经说的很详细了,不明白的地方请留意,本人会尽量说明白。

在发架构贴之前本人也从来没有使用过时间片轮询法,一直都只是知道这个概念。所以上次发的架构贴也是本人的一种摸索,但是架构一定的正确可行的,而且它的优势也是很明显的。

自从发了架构贴以后,本人的项目开发均使用了时间片轮询法进行开发,刚开始遇到了不少问题。让我对此法有些怀疑了,觉得还是需要操作系统才能实现真正的任务级编程。大家都知道操作系统中,并不需要我们去了解任务之间的切换。而我们只有划分好任务,以及任务之间的通讯就可以了。但是时间片轮询法中所以的任务之间的通讯,任务之间的切换等等都必须是程序员来实现,那么在使用此法时应该注意些什么才能实现真正的任务级编程呢?

在说明注意事项之前,本人要特别说明,你要相信操作系统能实现的时间片轮询法一定能实现。同样能让人感受到多任务的快感,只是这些都直接考验了一个编程人员的技巧以及思维(需要的是多任务的思维方式)。

注意事项:

1.任务的划分:任务一定要划分的非常合理,尽量做到任务的相对独立;

2.任务的优先:一定要注意任务优先级的设计,把需要及时处理的任务排到任务的最前面;

3.任务的执行:任务的执行一定要尽量的快,一定要保证在毫秒级,否则任务还没执行完,其他任务都再等,就到不到实时系统的要求,也谈不上多任务了;

4.时间的划分:时间片的划分是整个系统的关键,一定要保证任务在需要执行的时候能够进入该执行的任务中,否则就不能实现真正的时间片轮询了。

通过以上的介绍,我想大家多觉得特别抽象吧。下面就针对以下几点举例说明:

1.任务的划分:

任务的划分并不难,你需要先全面的了解你的项目是要实现什么功能,把其划分成多个功能模块,每一个模块就是一个任务,每一个任务对应一个函数。

例如一个时钟产品,一般由:按键、显示、时间、闹铃、菜单(设置/查询等)等组成。那么我们可以把其划分成5个任务。

2.任务的优先:

同样通过以上事例来说明任务优先级,可能划分的方法有很多种,而且看不出很大的区别,这里只是本人认为最为合理的方式:

A. 时间,这里的时间就是从时钟芯片中获取时间;

B. 闹铃,获取时间后应该首先判断是否是设置的闹铃时间,如果是就进行闹铃提示,否则,退出执行下一个任务;

C. 显示,显示时间,如果有闹铃,则显示闹铃标志;

D. 按键,判断是否有按键,如果有就进入相应的操作;
E. 菜单,通过按键进入相应的菜单,如果没有按键,就不执行菜单任务直接退出。

这就是整个时钟产品需要实现的整个过程,任务之间的通讯已经任务之间的相互制约都是通过全局变量实现的,例如进入时间设置等时,就没有有必要实现时间的读取,闹铃的判断,以及时间的显示。这时只需要执行按键任务以及菜单任务即可,直至退出为止。这里需要说明的是不执行的任务是在判断任务执行情况后不具体执行任务代码,并不是一直在菜单程序中死等等,直至菜单退出。因为那样的话就不是真正的多任务级了,也谈不上时间片了。

3.任务的执行:

任务的执行一定要尽量的快,一定不能因为某个任务需要等等特殊的东西,而影响的其他任务,也不能在任务中调用大的延时函数,一定要保证任务的运行速度,要知道每一个任务的具体执行时间。例如上例中,绝对不能因为等等按键的释放而导致其他任务的不运行。那么怎么消抖呢?这个方法有很多,你可要通过利用两次按键任务是时间实现消抖,例如第一按键后,你做个标志,表示有键,但是不执行菜单,可要通过第二次进入按键任务判断,是否是按键的按键,还是误按,这种情况下就必须要保证按键任务的运行时间在消抖也许的时间内容,例如20ms。

再例如:在应用GPRS时,由于GPRS发送指令到接收到应答的时间都是秒级的,所以一定不能发完指令后,一定要等到应答才执行下一个任务,而是通过双线程的思想,把GPRS的发送和接收分为两条线,一条发,一条接,而这两条线之间都是同样全局变量来连线。每次进入GPRS任务时都判断是否由发送和接收,如果有发送就发送,有接收就判断是否为上次发送的应答,如果是就可以继续发送了,否则继续等待应答的接收,以最快的速度实现任务的执行。

4.时间的划分:

时间片的划分尤为重要,需要保证每一任务都能在该执行的时间内运行。就以时钟事例来说,显示和获取时钟一般一秒一次就可以了,如果你有时钟冒号“:”的显示,那么1秒必须执行两次以上才能保证显示的正常。当然在系统允许的情况下可以尽量多允许几次,但一定最低的允许次数。像按键可以使用20ms作为任务的时间片,因为一般按键的消抖时间为20ms,那么时间片划分为20ms完全可以保证即不漏掉按键,也不会误读按键。

//================================================================================

备注:

1》觉得这种方法对于构建复杂的系统很有参考意义!!!

其他:

https://www.cnblogs.com/zhliao/archive/2012/08/11/2633630.html

https://www.baidu.com/link?url=Fjx4b-9Vc4GlTPzSkjm1yCZwM9g70AvIl0-gfeaZu5uKf7QUe4iUcGbEzYTIcEt7tVFehIqFhVHnzpEaVMnKHa&wd=&eqid=969703ee00014e3b000000025be50000

类似于,比如,你有10个MM,每晚陪一个,无差别轮流陪,每个MM给一晚时间,这就是无占先先、无优先级的时间片轮询,任何MM不能打断你当前陪的MM,直到结束。
无占先、有优先级轮询,就是你陪玩一个MM后,下一晚,你看看哪个MM急于要你陪,可能有多个,然后看其排队取舍(队列、FIFO等等)。
有占先的,则及时你正在陪一个MM,但是其中一个更霸道的MM来要你先陪,那么你就得中断跟当前这个MM的亲热,先去处理霸道MM,完事了,回来再继续跟原来这个MM好。

免责声明:文章转载自《单片机时间片轮询法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇weblogic弱口令+后台getshell使用TensorFlow遇到的若干问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

时间片轮询-应用程序架构

大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。 2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。 3. 操作系统,此法应该是应用程序编写的最高境界。 下面就分别谈谈这三种方法的利弊和适应范围 1. 前后台顺序执行法 前后台程序一般是指没有...

7-FreeRTOS时间片进行任务调度

注意: ①任务切换会存在时间片开销; FreeRTOS 支持时间片,每个优先级可以支持无限多个任务,这些任务的调度就是时间片调度; 在 FreeRTOS 中允许一个任务运行一个时间片(一个时钟节拍的长度)后让出 CPU 的使用权,让拥有同优先级的下一个任务运行, 至于下一个要运行哪个任务? 由时间片来调度,时间片调度发生在滴答定时器的中断服务函数中 。 下...

《Python》并发编程

手工操作 —— 穿孔卡片       1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。             程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果...