12.1.2 ERTOS基础知识

更新于 2026年10月10日 版权声明
12.1.2 ERTOS基础知识

1.前后台系统

在MPU应用中,常把一些不复杂的应用项目设计成图12.1所示的结构,这种结构的系统可被称为前后台系统,它包含一个后台(应用程序)和多个前台(中断服务程序)。应用程序是一个无限的循环程序,循环中调用相应的函数完成相应的操作,被称为后台行为;中断服务程序处理紧急事件,被称为前台行为;时间相关性很强的关键操作是由中断服务来完成的。这种系统的任务响应时间较长,因为中断服务提供的信息要等到后台程序处理这个信息时才能得到处理。很多小型的MCU产品采用前后台系统设计,如电饭锅、电风扇、电话、玩具等。

图示

图12.1 前后台系统

2.实时内核系统

实时内核系统是用于实时管理微型计算机的硬件资源和软件算法的软件系统。在实时多任务系统中,内核负责管理各个任务,为每个任务分配获得CPU运行的时间,并且负责任务之间的通信。内核对于各任务提供的基本服务是任务切换,让优先级高或最需要处理的任务优先执行。实时内核允许将应用分成若干个任务,由实时内核来管理它们,使用实时内核可以大大简化应用系统。

应注意的是,实时内核本身也增加了应用程序的额外负荷,代码空间增加了ROM的用量,内核本身的数据结构和每个任务的栈空间增加了RAM的用量,所以对于具体的应用项目要根据实际情况取舍。

3.调度器

调度器是实时操作系统的主要部件之一,其作用是决定哪个任务运行。实时内核的调度算法有基于优先级调度算法和时间片轮转调度算法。

(1)基于优先级调度算法是根据每个任务重要程度的不同,赋予其一定的优先级。CPU总是让处在就绪态的优先级最高的任务先运行。然而,究竟何时让高优先级任务掌握CPU的使用权,还要看用的是不可剥夺型内核还是可剥夺型内核。

①不可剥夺型内核。不可剥夺型内核允许每个任务运行,直到该任务自愿放弃CPU的控制权,中断运行着的任务。不可剥夺型内核的优点是响应中断的速度快,不需要使用信号量保护共享数据,任务级响应时间远快于前后台系统,但响应时间仍是不可知的,因此商业软件一般不采用不可剥夺型内核。

②可剥夺型内核。可剥夺型内核的系统响应时间快,最高优先级的任务一旦就绪,总能获得CPU的使用权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态时,当前任务的CPU使用权就被剥夺了(或者说被挂起了),高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,高优先级的任务开始运行。

采用可剥夺型内核时,最高优先级的任务什么时候可以执行、可以得到CPU的控制权是可知的,使用可剥夺型内核使任务级响应时间得以最优化。FreeRTOS属于可剥夺型内核。

(2)时间片轮转调度算法。当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间(这段时间叫作时间额度),然后切换给另一个任务。内核在满足以下条件时,把CPU控制权交给下一个处于就绪态的任务。

①当前任务时间片时间已到。

②当前任务在时间片还没结束时已经完成了。

FreeRTOS支持时间片轮转调度算法,如果应用程序中各任务对时间的要求不高,可以将优先级设为相同。

4.任务及状态

任务是指一段相对独立的程序,也称作一个线程,这段程序认为CPU完全只属于它。实时应用程序的设计包括如何把问题分割成多个任务,每个任务都是整个应用的一部分,每个任务被赋予一定的优先级,有一套独立的CPU寄存器和栈空间。

无论是用户任务还是系统任务,在某一个时候,每个任务至少处于就绪、运行和阻塞这3种状态中的一种,如图12.2所示。就绪是指任务被创建或准备运行的状态,运行是指任务正在被CPU执行的状态,阻塞是指任务在等待一个资源变为可用时的状态。

任务在就绪且优先级为最高的状态下,就可以被调度器调度,获得CPU运行。运行状态下的任务由于某种原因,比如延时等待,可进入阻塞状态。当阻塞的条件满足要求,任务又可以进入就绪状态。如果该任务的优先级最高,就又可以被调度执行。(https://www.daowen.com)

图示

图12.2 任务运行状态

5.资源

在RTOS中,任务的资源是指任务所占用的实体。资源可以是输入/输出设备,如打印机、键盘、显示器,资源也可以是一个变量、一个结构或一个数组等。

共享资源是指可以被一个以上任务使用的资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源。

代码的临界段也被称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行就不允许中断。为确保临界段代码的执行,在进入临界段之前要关闭中断,而临界段代码执行完以后要立即打开中断。例如,任务调度时就需要进行保护,要关闭中断。

FreeRTOS中的taskENTER_CRITICAL()函数的作用就是关闭中断,taskEXIT_CRITICAL()函数的作用是打开中断,它们之间的代码被称为临界段代码。

6.任务的同步与互斥

在前后台系统中,程序间的数据通信一般采用全局变量。但在实时系统中,一般不采用全局变量,其原因是各任务被CPU调度运行的次数不一致,全局变量的修改不可预知,因此要采用同步与互斥的方式实现任务间通信。

任务同步是指多个任务中发生的事件存在某种时序关系,必须协同完成一个任务,因此同步是一种协作关系。例如,工厂的流水线,每道工序都有自己特定的任务,前一道工序没有完成或不合格,后一道工序就不能进行。

任务互斥是指多个任务在运行过程中都需要某一个资源,当某个任务获取资源时,其他任务只能在该任务释放资源之后才能去访问该资源。互斥是一种竞争关系。例如,多个任务同时申请一台打印机,先申请打印机的任务先使用打印机,当它用完后释放打印机,在打印机被任务使用期间,其他任务必须等待。

在FreeRTOS中,通过信号量、消息队列、事件标志组、任务通信来实现任务间的同步与互斥。

7.时钟节拍

RTOS中的时钟节拍是特定的周期性中断,这个中断相当于该系统的“心脏”跳动。中断时间间隔取决于不同的应用,一般在1 ms到200 ms之间。时钟的节拍式中断使内核可以将任务延时若干个整数时钟节拍,当任务等待事件发生时,它还可以提供等待超时的依据。时钟节拍越快,系统的额外开销就越大。

时钟节拍在RTOS中起着重要的作用,一般采用定时器中断方式来实现。在定时中断服务程序中,要调用RTOS的节拍处理函数,该函数遍历所有优先级任务,检查任务由于阻塞而等待的条件是否满足。若满足条件,则让任务就绪,否则继续等待。

例如,ARM Cortex-M3内核有一个24位的节拍定时器SysTick,就是用来实现时钟节拍的。

8.存储器需求

RTOS的存储器需求包括程序存储器和数据存储器:程序存储器存放程序和RTOS代码,数据存储器存放变量和任务的堆栈。

根据任务要求,程序存储器一般需要几KB以上的空间。内核本身需要代码空间(ROM),内核的大小取决于多种因素,1~100 KB都是可能的。例如,若8位CPU使用的最小内核只提供任务调度、任务切换、信号量处理、延时及超时服务,则需要1~3 KB代码空间。代码空间总需求量=应用程序代码空间+内核代码空间。

至于对数据存储器的需求,因为每个任务都是独立运行的,必须给每个任务提供单独的栈空间(RAM)。栈空间不仅包括任务本身的需求(局部变量、函数调用等),还包括最多中断嵌套层数(保存寄存器、中断服务程序中的局部变量等)的需求。根据不同的MPU和内核类型,任务栈和系统栈可以分开,分别设置不同任务的栈空间大小来减小对RAM的需求。

下面将以开源、免费的FreeRTOS为例,分析操作系统的内核运行机制。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)