UCOSii多任务实时操作系统的理解:
1.项目是不是真需要用多任务操作系统:
如果你的任务可折分性较差,折分后的各个任务之间有 N 多的同步问题和复用资源问题,还是不要用多任务操作系统,或者将这些功能都放在一个任务里面。
多任务是用降低实时性来换取软件开发的独立性,不要被实时多任务操作系统的实时两个字骗了,这个实时只是相对于其它非实时性多任务操作系统来讲的,实时性最高的当然是你自已编写的单任务程序。
2.多任务并发运行的本质
在多任务系统中,可以同时执行多个并行任务,各个任务之间互相独立。通过操作系统执行任务调度而实现宏观上的“并发运行”。其实在单一CPU 的情况下,是不存在真正的多任务机制的,只有操作系统让不同的任务轮流使用 CPU,所以本质上还是单任务的。
3.多任务的优势
多任务的优势:充分利用硬件资源,如在单任务时(大循环结构,如大部分 51
程序)遇到 delay 函数时,CPU 在空转;多任务系统在运行当前任务时,只要遇到delay延时或需等待资源时系统会自动运行下一个任务,等条件满足再回来运行先前的任务,这样就充分利用了 CPU,提高了效率。
4.抢占式调度
调度的概念,通俗的说就是系统在多个任务中选择合适的任务执行。
系统如何知道何时该执行哪个任务?
可以为每个任务安排一个唯一的优先级,当同时有多个任务就绪时,优先级较高的任务先运行。同时,任务的优先级也作为任务的唯一标识号。代码中都是对标识号来完成对任务的操作的。如 OSDelPrioRdy(prio),OSSetPrioRdy(prio)等。不同的优先级对应就绪表中的每一位。低位对应高优先级。优先级 0 的优先权最高,优先级 31 的优先权最低。
所谓“抢占式调度”是指:一旦就绪状态中出现优先权更高的任务,便立即剥夺当前任务的运行权,把 CPU 分配给更高优先级的任务。这样 CPU 总是执行处于就绪条件下优先级最高的任务。
5.多任务系统的时间管理
与人一样,多任务系统也需要一个“心跳”来维持其正常运行,这个心跳叫做时钟节拍,通常由定时器产生一个固定周期的中断来充当,频率一般为 50-100Hz。在TargetInit.c 文件中有下面的定时器 0 初始化函数,T0 用作系统心跳计时,产生时钟节拍。
OSTimeDly 函数就是以时钟节拍为基准来延时的。这个函数完成功能很简单,就是先挂起当起当前任务,设定其延时节拍数,然后进行任务切换,在指定的时钟节拍数到来之后,将当前任务恢复为就绪状态。任务必须通过 OSTimeDly 或 OSTaskSuspend 让出CPU的使用权,使更低优先级任务有机会运行。在 T0 的中断服务函数中,依次对各个延时任务的延时节拍数减1。若发现某个任务的延时节拍数变为0,则把它从挂起态置为就绪态。系统自身创建了一个空闲任务,并设它为最低优先级,当系统没有任何任务就绪时,则运行这个任务,让 CPU“有事可干”用户程序可以在这个任务中加入一些“无关紧要”的功能,如统计 CPU 使用率等。不要在空闲任务中运行有可能使任务挂起的函数。空闲任务应该一直处于就绪状态。