第二章 RTOS基础知识
2.1什么是RTOS?
打个比方,若是单片机不跑RTOS,用主循环+中断处理程序完成功能(前后台系统),就好比老板一人开了一家公司,老板一人负责“研发”、“销售”、“售后”三种工作(任务)。比如老板正在搞研发,突然来客户了,老板就要暂停研发转而去搞“销售”,销售完后再回来继续研发(把销售看成一种中断)。那比如客户买的产品出了问题,那老板得暂停研发去做售后(售后是另一种中断)。问题就出来了,老板一个人始终无法同时顾及研发、销售、售后三个工作,导致公司运营不佳。这里读者们想到了,可以多顾几名员工啊?说对了,单片机跑RTOS就是相当于开公司多了很多员工。RTOS就是一个可以将单片机扩展成多个“相对独立小任务”的平台,老板可以顾3名员工,让3个员工分别负责“研发”、“销售”、“售后”三个工作,老板的工作就是负责将3名员工各自的任务分配好即可。
各个“相对独立小任务”宏观上来看是同时执行的,这是RTOS一个显著特点,可能有人要问“只有一个CPU,怎么能做到同时执行多个代码呢?”巧妙之处就在这里,RTOS在微观上是在各个“相对独立小任务”之间快速切换的,切换速度快到宏观上感觉小任务是同时运行的。这个“切换速度”,就是RTOS里边所说的系统节拍。
怎么理解“相对独立小任务”中“独立”二字呢?独立的意思就是各个小任务之间的执行过程是相对独立的,互不干扰。3名员工的工作是各不相同的,各执其责的。但为何要“相对独立”呢?比方搞研发的员工没有开发出产品,那么销售就没东西可卖,售后也相应没事儿做了,要想整体运行正确,则各个任务必须协调好,互相汇报进度。这就是RTOS中的任务间通信概念。
这三名员工的工作其实是有轻重缓急之分的。前期搞研发的优先级最高,搞出产品后销售就是主角了,销售完后呢?售后就要做的更好。要想经营好整个公司,老板就要决定哪个员工何时该抓点紧,哪个员工工作可以放慢些,总也有个任务分配策略。这个分配策略,就是RTOS中的调度算法。
相信读者对RTOS有个简单的概念了吧。RTOS从功能上是将单片机单一的执行结构扩展成了多个“相对独立小任务”。从开发角度上由原来的“主循环+中断处理程序”思想扩展成了“编写N个执行任务”思想。为我们开发复杂多任务程序提供了便利。
2.2 RTOS的优点与缺点
2.2.1 RTOS优点
1.提高开发效率
RTOS使单片机开发多任务程序变得简单直观,用户只关心任务分配即可,比如我们要做一个电子时钟的程序,完全可以把“数码管刷新”、“秒计时”、“按键检测“、”调节时间程序”分为4个任务,这样程序会编写容易而且维护方便。
2.运行效率高
我们平时编程用到延时是很常见的,在RTOS里面延时OS_Delay()和普通程序的Delay()是完全不一样的。普通的程序延时仅仅是CPU执行循环代码,是不是感觉做了很多无用功?在RTOS里边,延时其实是主动将CPU让给其他任务代码,等到延时时间一到,再将CPU“拽”回来。
3.移植方便
各种平台之间程序大体风格是不变的,得益于RTOS的标准框架,使得程序整体代码风格趋于一致化,这将使程序移植变得简单可靠。
2.2.2 RTOS缺点
1.需要占用额外的资源
单片机使用RTOS,由于要在各个任务代码之间进行快速切换,以达到“同时”运行的目的,执行调度函数最增加CPU负荷。
2.使单片机中断响应变差
一般微型RTOS在切换任务时候需要关闭系统总中断,否则会错误的操作堆栈,这段时间是不响应任何中断的。从而使单片机在中断响应上要慢一些。
2.3单片机跑RTOS有必要吗?
这估计是爱好者们争论最多的了,既然看到了RTOS的利与弊,我们应当正确对待RTOS在单片机开发中的位置。
因为RTOS需要单片机提供额外的RAM ROM运行,并且会增加一些CPU负荷,如果一个单片机在项目上有很大余量,那么可以选择使用RTOS来做。如果单片机本身资源就很紧张,那就得不偿失了,不仅RTOS跑不起来,连基本功能代码都放不下了。
本文要在51上写一个小型RTOS,主要为了学习RTOS原理用,以后读者从51编程转ARM学习会容易很多。笔者曾将该RTOS移植在AVR和STM8上,占用200B ram 1KB rom,运行良好。
2.4 RTOS的一些基本概念
2.4.1 任务(TASK)
任务(Task)是RTOS中最重要的操作对象,每个任务在RTOS调用下由CPU分时运行。
2.4.2 调度(Sched)
调度是RTOS的核心,调度就是RTOS使CPU在各个任务之间进行切换,达到宏观上同时执行的效果,调度也称为“上下文切换”。
2.4.3 抢占和协作
在21ic上有一个经典例子比喻,“你(小工)在用厕所,经理在外面排第一,老板在外面排第二。如果是前后台,不管是谁,都必须按排队的次序使用厕所;如果是协作式,那么可以等你用完厕所,老板就要比经理先进入;如果是占先式,只要有更高级的人在外面等,那么厕所里无论是谁,都要第一时间让出来,让最高级别的人先用。”
2.4.4 系统节拍
RTOS调度时候是一直在各个TASK之间切换的,切换的快慢就是系统节拍,如果系统节拍是100Hz,那么每秒TASK会被RTOS切换100次(不算主动切换次数)。
2.4.5 中断级调度和任务级调度
中断级调度就是由系统节拍引起的被动的调度,在当前执行任务即使还未释放CPU时也会发生的。任务级调度是任务主动去释放CPU而发生的调度。
2.4.6 任务堆栈
每个任务(TASK)执行都有自己的一个任务堆栈,存放着自己的入口,各个寄存器值、中间执行结果等。各个任务的任务环境都是独立私有的,互不干扰。比如TASK1有自己的堆栈Task1Stack[20],TASK2有自己的堆栈Task2Stack[20],两个堆栈内容是不一样的。
RTOS基本术语还有很多,就不一一罗列了,笔者尽量用简练的语言来让读者学会单片机RTOS的概念,争取也写出自己的RTOS。