通过以上的介绍,我想大家多觉得特别抽象吧。下面就针对以下几点举例说明:
1. 任务的划分:
任务的划分并不难,你需要先全面的了解你的项目是要实现什么功能,把其划分成多个功能模块,每一个模块就是一个任务,每一个任务对应一个函数。
例如一个时钟产品,一般由:按键、显示、时间、闹铃、菜单(设置/查询等)等组成。那么我们可以把其划分成5个任务。
2. 任务的优先:
同样通过以上事例来说明任务优先级,可能划分的方法有很多种,而且看不出很大的区别,这里只是本人认为最为合理的方式:
A. 时间,这里的时间就是从时钟芯片中获取时间;
B. 闹铃,获取时间后应该首先判断是否是设置的闹铃时间,如果是就进行闹铃提示,否则,退出执行下一个任务;
C. 显示,显示时间,如果有闹铃,则显示闹铃标志;
D. 按键,判断是否有按键,如果有就进入相应的操作; E. 菜单,通过按键进入相应的菜单,如果没有按键,就不执行菜单任务直接退出。
这就是整个时钟产品需要实现的整个过程,任务之间的通讯已经任务之间的相互制约都是通过全局变量实现的,例如进入时间设置等时,就没有有必要实现时间的读取,闹铃的判断,以及时间的显示。这时只需要执行按键任务以及菜单任务即可,直至退出为止。这里需要说明的是不执行的任务是在判断任务执行情况后不具体执行任务代码,并不是一直在菜单程序中死等等,直至菜单退出。因为那样的话就不是真正的多任务级了,也谈不上时间片了。
3. 任务的执行:
任务的执行一定要尽量的快,一定不能因为某个任务需要等等特殊的东西,而影响的其他任务,也不能在任务中调用大的延时函数,一定要保证任务的运行速度,要知道每一个任务的具体执行时间。例如上例中,绝对不能因为等等按键的释放而导致其他任务的不运行。那么怎么消抖呢?这个方法有很多,你可要通过利用两次按键任务是时间实现消抖,例如第一按键后,你做个标志,表示有键,但是不执行菜单,可要通过第二次进入按键任务判断,是否是按键的按键,还是误按,这种情况下就必须要保证按键任务的运行时间在消抖也许的时间内容,例如20ms。
再例如:在应用GPRS时,由于GPRS发送指令到接收到应答的时间都是秒级的,所以一定不能发完指令后,一定要等到应答才执行下一个任务,而是通过双线程的思想,把GPRS的发送和接收分为两条线,一条发,一条接,而这两条线之间都是同样全局变量来连线。每次进入GPRS任务时都判断是否由发送和接收,如果有发送就发送,有接收就判断是否为上次发送的应答,如果是就可以继续发送了,否则继续等待应答的接收,以最快的速度实现任务的执行。
4. 时间的划分:
时间片的划分尤为重要,需要保证每一任务都能在该执行的时间内运行。就以时钟事例来说,显示和获取时钟一般一秒一次就可以了,如果你有时钟冒号“:”的显示,那么1秒必须执行两次以上才能保证显示的正常。当然在系统允许的情况下可以尽量多允许几次,但一定最低的允许次数。像按键可以使用20ms作为任务的时间片,因为一般按键的消抖时间为20ms,那么时间片划分为20ms完全可以保证即不漏掉按键,也不会误读按键。
[ 本帖最后由 zhaojun_xf 于 2012-3-4 08:56 编辑 ] |