原文地址::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》觉得这种方法对于构建复杂的系统很有参考意义!!!