关注+星标公众号,不错过精彩内容!
RTOS是实时操作系统的简称,所谓的实时,就是能够快速响应内部、外部事件,而且响应时间可控。这里举例解释一下时间可控,在ucosii中,不管有多少线程,从这些线程中找出最高优先级并进行任务调度,所消耗的时间是一样的,这就是时间可控。有些人写操作系统时设计了一个链表,每次进行任务调度时,沿着链表查找,最终找到最高优先级,链表长度不一样,耗时不一样,这就是时间不可控。
再来继续说实时,在RTOS中内部实时程度也不一样,在RTOS中中断函数是最实时的部分,比如事件产生(Timer,UART、外部中断等),经过中断优先级仲裁后立即执行ISR,所以中断程序是最实时的。那么RTOS里的中断和非OS的中断有什么区别呢?RTOS中的中断也有些特殊,可以翻看一下RTOS代码,里面有很多开关全局中断的代码,出现的很频繁,用于保护全局变量等。全局中断的开关会导致外部事件响应延迟,当然这个延时很短很短,但是总体来说实时性是降低的。所以说最实时的还是自己写的一个大循环的代码。
在RTOS中,事件产生后,需要做耗时长的工作,如果在中断中直接执行,影响了其它低优先级中断以及线程的运行。可以这样写代码,事件产生后,经过中断优先级仲裁后立即执行ISR,ISR中发送信号/邮件等给相应的线程去处理,这样的好处是,能够及时退出中断,把“任务”交给线程去做。因为信号/邮件的发送与接收,线程的调度都会占用处理器的时间,比在ISR直接执行“任务”实时性降低。这种实时性降低是没有办法的,世上没有十全十美的事情,享受了RTOS高级功能,就要容忍它带来的实时性能降低。
RTOS的线程调度有时候依赖系统定时器,比如时间片轮转方式,一般系统定时器的优先级较低,当系统中中断比较多时,总被其他中断抢占,这样可能会影响时间片精度,也就导致线程调度不实时,这也是没有办法的事情。有朋友说了,这可是实时操作系统啊,怎么能不准,没有什么不可以。实时本来就是个相对概念,个人理解RTOS设计初衷是尽量保证事件(中断)的实时性,时间片的准确性放到次要位置。
总结
实时操作系统是在尽量保证实时的同时,给编程者提供一个多线程环境,以及线程之间通讯方法。