轮询系统(Polling Systems)
嵌入式系统发展初期,嵌入式软件的开发是基于汇编语言和C语言直接编程,不需要操作系统的支持,这样的系统也被称为裸板嵌入式操作系统。
用过8051单片机的都知道,8051单片机的程序从开始到结束基本上都是顺序的,最后必定有一个类似于while的死循环。
这种方式必须不停地去轮询条件来查询要做什么事,因此这样的操作系统被称为轮询系统,该方式虽然实现了宏观上执行多个事务的功能,但有几个明显的缺点:
- 轮询系统是一种顺序执行的系统,事物执行的顺序必须最开始就确定,缺乏动态性,减少了系统的灵活性,也增加了系统设计的复杂度。
- 系统运行过程中无法接收和响应外部请求,无法处理紧急事情。
- 事物之间的耦合性太大,这主要是因为事物不可剥夺的原因,正因为不可剥夺,导致一个事物的任何错误都会使其它的任务长久等待或错误。
前后台系统(Foreground Background Systems)
后台系统与轮询系统一样也是顺序执行,只有一个main程序,程序功能的实现是依靠死循环来实现的。
但前台系统引入了中断机制,能处理外来请求。
对于实时性要求比较高的事物,可以交给中断服务程序(ISR)进行处理,因为中断处理速度快;对于非实时性的事物,可以交给后台顺序执行。
不足:
- 事物不可剥夺,高优先级任务不可抢占低优先级任务。
- 事物不可阻塞,也就是说事物没有暂停这一功能来阻塞自己。
简单内核
RTOS可简单认为是功能强大的主控程序,系统复位后首先执行。
它负责在硬件基础上为应用软件建立一个功能强大的运行环境,用户的应用程序都建立在RTOS之上。
其至少实现如下功能:
- 任务调度。有了操作系统,多个任务就能并发执行,但是系统中的CPU资源是有限的(如单核环境下只有一个CPU核),于是需要特定的调度策略来决定哪个任务先执行?哪个任务后执行?哪个任务执行多长时间?而要实现特定的调度策略、支持多任务并发执行,还必须有任务切换机制的支持。任务切换本质上是为了解决任务的不可剥夺和不可抢占性,因此任务切换可分为两种。
被动切换:也就是被剥夺(对应上面的第一条),优先级高的任务来了,或者当前任务的执行时间完了。
主动切换:也就是当前任务调用相关函数主动放弃CPU,阻塞自己,让别人去使用CPU。 - 任务协调机制,即任务的互斥、同步、通信机制等。
- 内存管理机制。系统中多个任务并发执行,所有任务的执行代码和所需数据都是存储在内存中的,那各个任务及相关数据如何被分到内存中的?就需要RTOS提供内存管理机制。
对于不同的应用需求,内存管理机制会不一样,对于PC等桌面应用,内存管理着重考虑的是如何有效利用内存空间,实时性不是特别重要;而对于嵌入式实时应用,内存管理的重点是内存分配和释放时间的确定性,因此RTOS中,内存管理的动态性就少许多。