实时操作系统基本原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实时操作系统原理
1 前后台系统的优缺点
前后台系统的架构用一句话来形容的话,就是一个大的循环,加上中断,就形成了一个整的体系。任务级别的称为后台, 中断是异步事件也称为前台。具体的流程图如下:
可以看到图里面处理了模块功能Task 4之后又返回处理模块功能Task 1,轮询不止。然后中断触发异步事件,一般也支持中断嵌套。
一般的单片机系统大多是采用了此种模式编程,优点是简洁,明了,新手的上手速度很快,特别是专注用来做一件事情的时候,一个while循环基本是无敌的。比如实现一个i2c slave ,完全可以用一个while 来模拟实现一个i2c 的slave 控制器。在操作系统上来模拟一个i2c slave 的话,基本不太可能实现,因为实时系统存在最大关中断的时间。
接下来谈谈前后台系统的缺点,前后台系统面临的一个直接困境是,软件规模大了,很难管理。处理的模块一多的话,实时性也根本难以保障。参照上图举例如下:
优先级高的事件一般在后台系统即任务空间去执行,而对于前后台系统而言一般优先级高的事件都是靠中断去解决,中断运行时间太长,后台任务响应速度很慢。假设来了中断然后需要处理事件Task 4,如果Task 4的处理是最紧迫的,但是当
前cpu 只运行到模块Task 1,这样的话,必须还要承受Task 2和Task3的运行时间延迟,才能轮到Task 4的处理,当模块越多的时候很可能情况更糟糕。这样的话可以看到紧急事件Task 4 的处理在时间上是不恒定的,有违实时系统原理。前后台的超循环设计对于紧急事件只能花大时间在中断内部去解决,但是当一个中断执行时间过长的时候会阻塞其它低优先级的中断的响应,继而造成其它中断数据的丢失。前后台系统还有一个缺点是各任务模块之间是相互独立的,缺乏有效的通讯手段。在一个中大型软件项目中,采用此类方法可以说是一种管理的灾难。
对于一个大while循环,另外一种实现方式是采用基于状态机的编程,往往能简化架构,解决复杂问题,比如目前的实时系统QP操作系统就是采取此种架构。但是状态机有一定的学习曲线,并不是每个人轻易能够掌握的。幸运的是raw os 除了支持传统的实时操作系统特性之外,也支持基于状态机的编程,具体细节请参考相应的章节。
综上所述,前后台的缺点是远大于优点的,所以就需要一个实时操作系统来解决这些缺点。
2 实时操作系统特性
实时操作系统存在的主要原因是用来解决前后台系统的不足,实时操作系统专注于管理任务,一个任务的形式通常是一个无限循环,任务和线程的概念是一致的,只是不同的操作系统叫法不同。实时系统目前在MCU,dsp上得到了广泛的应用。
实时操作系统主要是负责多个任务之间的管理通讯等,这样就形成了多任务的环境。多任务看上去像每个任务在同时运行,但是对于单核cpu来说,同一时刻只能跑一个任务。多任务环境相比前后台系统而言,最大化的利用了cpu效率,因为前后台系统存在空转的情况,但是多任务系统可以在系统空闲的时候跑空闲任务,甚至在空闲任务里实现低功耗的功能。
raw os 可以设置成抢占内核或者非抢占内核,当设置成抢占内核的时候,系统永远运行的是最高优先级的任务。如下图所示:
下面来解释下上图:
(1)低优先级任务运行中,高优先级任务处于等待某一事件中。
(2)中断发生了。
(3)中断里面做了一些简单的事情后,通常是接收硬件数据,也就是完成中断上
半部的事情后,就唤醒高优先任务,来进一步处理数据,比如网卡中断接收数据的处理流程。
(4)中断结束后并不会回去运行低优先级的任务,而是调度运行高优先级。
(5)高优先级任务运行中处理中断中接收的相关数据。
(6)高优先级任务执行完毕,继续等待下一次事件,切换给低优先级任务继续运
行。
一般一个实时系统需要占用5%左右的cpu运行时间,raw os 需要占用一定的rom 和ram, 太低端的单片机比如8051是不推荐跑任何RTOS的。低端芯片主要ram 比较紧缺,通过高度配置后,raw os 的ram占用量只有1K左右。一般通常情况是是4K以下的ram 占有量。低端的单片机强烈建议跑raw os的事件触发系统,
只需要几十个字节的ram,完全可以符合开发需求。
3 如何安排实时操作系统任务优先级
很多实时操作系统书籍都没有明确的阐述如何去安排任务的优先级。任务优先级的安排一般都是架构师去安排,因为这个是一个全局性的战略,必须要做到对不同的任务轻重有别。
在安排任务优先级之前还有一个概念,那就是如何安排任务。
程序在CPU中是以任务的方式在运行,所以我们要将系统的处理框图转化为多任务流程图,对处理进行任务划分。任务划分存在这样一对矛盾:如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。在任务划分时要遵循H.Gomma原则:
a. I/O原则:不同的外设执行不同任务;
b.优先级原则:不同优先级处理不同的任务;
c.大量运算:归为一个任务;
d.功能耦合:归为一个任务;
e.偶然耦合:归为一个任务;
f.频率组合:对于周期时间,不同任务处理不同的频率。
以上原则中,不同的外设执行不同任务这个原则尤其显现的重要。比如shell终端会用到串口,这个划分为一个单独的任务。又如网络协议栈会使用到网卡,这个时候协议栈内部会有专门的任务服务网卡。
安排任务的优先级犹如一个公司的老板,如何安排员工的职位。下面是安排任务优先级的一个可能的策略:
首先把系统里有哪些任务全部排列出来,这个是排优先级的基础。
以下是安排任务优先级考虑的两点因素:
1 以任务周期为依据,任务周期越短执行频率越高,优先级越高。
2 根据任务的重要程度,越重要的任务优先级越高。
以上两点有时需要一起综合考虑,因为任务周期越短的任务未必是重要的任务,必须结合第2点综合考虑。