细说μC/OS-II
扫描二维码
随时随地手机看文章
μC/OS-II嵌入式实时操作系统自1998年推出以来,因其方便移植、代码量小、实时性强、可靠性高、内核可剪裁等优点,成为我国计算机嵌入式应用领域最受喜爱的实时操作系统(Real-Time Opreating System)之一。由于其源码开源,至今,已经成功在诸多厂家的MCU上移植并应用在各行各业的电子产品之中,因而备受瞩目。此文帮助有意向学习μC/OS-II的初学者全面的、系统的了解实时系统的核心思想,也为正在学习μC/OS-II的童鞋们理清思路,更上层楼。
什么是μC/OS-II?
μC/OS-II是一种基于优先级可剥夺型的多任务实时内核,包含了任务调度与管理、时间管理、任务间通信与同步等基本功能。
如何实现多任务?
在μC/OS-II系统中,大多数情况下,1个任务就是一个死循环,特殊情况是,有的任务执行1次后直接销毁自己。既然是死循环如何实现多任务呢?这就涉及到一个完整的任务调度机制,简单来说,就是给每个任务设置合适的优先级,CPU只有一个,优先级高的任务可以抢占优先级低的任务,而独占CPU。在μC/OS-II中,系统可以管理64个任务,有8个任务预留给系统,用户最多可以创建56个任务,而实质上用户不应该创建过多的任务,因为这样的话,优先级最低的任务可能无法得到执行。
何时执行任务调度
简单来说,高优先级的就绪任务发生时,会抢占低优先级任务的CPU,这时系统就会自动执行任务调度。在任务销毁时,挂起时,延时时,中断退出时都会启动任务调度。
这里举个例子,假如下面这段程序具有2个用户任务LED1_TASK,和KEY_TASK。KEY_TASK的任务优先级较高,这段程序无法实现预期的功能,会出现什么问题呢?
LED闪灯任务无法得到执行,因为程序一直的执行按键扫描,其优先级较高(这里假定没有中断发生)一直在独占CPU,而没有释放,也就是无法执行任务调度,在LED任务中,调用OSTimeDly()函数的同时,LED任务即被挂起,交出CPU的控制权,同时执行任务调度,系统会选择一个处于就绪状态的优先级最高的任务来执行。
举上面这个例子是为了说明任务调度是在一定情况下发生的,因为是抢占式的,为了让低优先级的任务得到执行,高优先级任务必须在适当的情况下交出CPU,如果在KEY_TASK任务中,在获取按键信息后面调用OSTimeDly()函数,即可使LED闪灯任务得到执行。
关于中断
中断在实时操作系统中具有举足轻重的作用,所以中断程序的设计无疑是编程的要点及难点,在多任务实时操作系统中,不同的中断任务被安排不同的优先级,在允许中断嵌套的情况下,最高优先级的中断总能得到及时响应。中断级的任务可以看成是比最高优先级的任务级任务的优先级还要高。在用户中断服务程序内部,要尽可能的缩短代码量,不要做耗时的操作,正确的做法是调用任务级任务进行相关的数据处理。
同样,问题来了,在中断服务程序中触发某个任务级任务就绪,是否立即进行任务调度,答案是否定的,因为任务级任务的优先级不够,需等待中断服务程序退出,那系统如何知道中断服务程序是否结束了呢,这就需要的中断程序内部调用系统服务函数OSIntExit();以此来触发任务调度。
硬实时与软实时
这里说一下硬实时与软实时的区别,能够在指定的期限完成实时任务(即便在最坏的处理负载下也能如此)的操作系统称为硬实时系统。但并不是任何情况下都需要硬实时支持。如果操作系统在平均情况下能支持任务的执行期限,则称它为软实时系统。
RTOS的优势是硬实时控制,硬实时不是指“快”,而是指可精确预测可控制,能保证在规定时间内完成任务。因为执行时间可预测,所以当你想快时,只要选一个速度合适的CPU即可,这个需要的速度在μC/OS-II系统中是可以精确算出来的。软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重。
举个例子,汽车发生危险时,汽车气囊弹出必须在一定时间内完成,晚一秒都会造成致命伤害(硬实时)。而在图像传输过程中,偶尔丢失1帧图像数据是可以容忍的(软实时)。
任务同步与数据通信
毫无疑问,任务之间都不是相互割裂的,需要进行数据或者信息的交互,为此,μC/OS-II系统提供了用于任务间通信的手段。任务之间可以通过信号量,事件标志组,消息邮箱,消息队列进行同步。而数据通信最简单的方式是采用全局变量来共享资源,这里面涉及到保障数据可靠性的问题,比如,当一个任务正在读数据的时候,还没有读完,这时一个中断触发高级别的任务运行,高级别的任务要更新数据,这就会导致低级别任务读出来的数据是错误的。未解决此问题,可以采用关中断、关调度、使用互斥信号量、使用计数信号量来解决,关中断与关调度比较生硬,也违反了系统的实时性设计原则,因此推荐使用互斥信号量来解决,所谓互斥信号量,相当于一个钥匙,钥匙只有一个,当一个任务要访问该资源时,必须先取得该钥匙。
时钟节拍
μC/OS-II需要用户提供一个周期性的中断来实现延时和超时等操作,这个周期性的时钟叫“时钟节拍”,其频率范围通常在10~1000Hz之间。时钟节拍的频率大小取决于对定时精度的要求,频率越高,系统的负担越重。
问题:时钟节拍是否是μC/OS-II中必不可少的?没有时钟节拍系统是否能够工作?
答案是:没有时钟节拍,系统照样可以工作,只是无法进行延时或者超时判断,无法调用延时函数来进行任务调度,但是仍然有其它方法可以进行任务切换。