μC/OS-III相比于μC/OS-II做了很多的改进,是一款全新的内核,在效率方面有了很大提升,并且支持任务的时间片轮转调度,摒弃了一些不必要的内容,如消息邮箱,对于熟悉μC/OS-II的工程师来说,上手μC/OS-III还是比较容易的,先来了解一下μC/OS-III做了哪些具体的改进。
一、时钟节拍的改进
在RTOS中,任务可通过调用延时函数(如OSTimeDly( )函数)将自己延时挂起一段时间,任务在延时的过程中会释放CPU,延时的任务不占用宝贵的CPU资源,而是由时钟节拍服务统一管理,时钟节拍服务是一个周期性运行的任务,由周期的时钟节拍中断触发,而时钟节拍中断可由硬件定时器产生,以此来分担CPU的工作量。
在μC/OS-II中,时钟节拍服务是在时钟节拍中断服务程序中完成的,每次时钟节拍服务都会遍历整个任务链表,依次处理每个任务,如果该任务的延时计数为0,则跳过该任务,如果计数非0,则进行减1操作,并判断减1后是否为0,为0则表明延时时间已到,使相关任务进入就绪态。如果系统的任务数目较多的话,时钟节拍服务遍历整个任务链表的时间较长,而且该服务函数在中断中被调用,因此也会导致中断执行的时间过长,不符合实时操作系统的设计理念。
在μC/OS-III中,周期性的硬件定时器通过中断触发中断服务函数,在中断服务函数中调用时钟节拍服务函数,但是该时钟节拍服务函数不需要遍历整个任务链表,只是发送一个信号量,即可结束中断,时钟节拍任务接收该信号量,恢复运行,处理延时函数,为了提高时钟节拍的处理速度,还采用了哈希散列表机制来管理任务,使得查找速度更加高效合理。
二、任务调度的改进
在μC/OS-II中,任务调度是完全基于优先级的,每个任务都有不同的优先级,不允许2个任务具有相同的优先级,并且支持的任务数量是有限制的。
在μC/OS-III中,可以支持任意数目的任务和优先级,用户根据实际情况来定,当然在实时操作系统中,要尽可能的精简任务数目,在μC/OS-III中,增加了任务的时间片轮转调度算法,也就是说不同的任务允许具有相同的优先级,因此,任务的数量就可以不受优先级数量的限制了,每一个优先级的任务数量可以有多个,同一优先级的任务根据实际需要分配执行时间,时间到时释放CPU,使得其它任务得以执行,如此循环往复。除此之外,还对任务优先级查找算法进行了改进,在此不再详述。
三、信号量的改进
在多任务实时操作系统中,信号量是最基本最常用的机制,用来实现任务之间的通信和同步、任务和中断之间的通信和同步以及对共享资源的访问,在μC/OS-II中,提供了基本的信号量创建、等待和释放等操作。
在μC/OS-III中,对信号量的使用增加了一些可选参数,如非阻塞等待、释放但不进行任务调度等操作,具有较高的灵活性。更为方便和重要的是,在μC/OS-III中增加了任务内嵌的信号量,用户无需创建信号量便可和其它任务通信,使用起来比普通信号量更加简单高效。比如两个任务之间的数据传送很明确,任务A接收数据完成后,只有任务B来执行数据的处理,也就是说只有一个任务等待任务A的信号量,而且任务A知道要将信号量发送给哪个任务,便可以使用内嵌信号量来进行通信和同步。
四、小结
以上仅列举了几点在μC/OS-III中比较重要的改进,μC/OS-III实时内核无论在效率、稳定性、用户使用灵活性方面都做了重要的改进,是一款全新的实时内核。