购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

7.2 嵌入式操作系统基本概念

嵌入式操作系统保护了很多全新的概念,包括多任务、任务调度、上下文切换及实时性等。FreeRTOS 也同样具有这些特色。这里首先介绍一下 FreeRTOS 嵌入式操作系统用到的基本概念,这些概念同样适用于其他嵌入式操作系统。

7.2.1 多任务

在一个操作系统内部,内核是最核心的部件。像Linux那样的操作系统使用的内核,从表面上看允许用户并发访问计算机,多个用户似乎可以并行执行多个程序。其实,在操作系统的控制下,每个正在执行的程序就是一个任务(task)。如果一个操作系统能够以这种方法执行多个任务,就叫做多任务(multitasking)操作系统。

多任务操作系统的使用可以简化应用程序的设计,主要体现在如下几方面:

● 操作系统的多任务和任务间通信的机制允许复杂的应用程序被分成一系列更小的和更多的可以管理的任务。

● 程序的划分使软件测试更容易,不同的功能由不同的设计人员来编写和测试,有利于模块化设计。

● 复杂的定时和先后顺序的细节可以从应用程序代码中删除。

这里需要注意的是多任务和并发的区别。传统的处理器同时只能执行一个任务。但通过快速的任务切换,一个多任务操作系统可以使它看起来好像每个任务并行执行一样。其实,操作系统划分多个时间片,多个任务在不同的时间片上轮换工作。这样所有可用的任务都好像在执行,但实际上在任何一个时刻都只有一个任务在执行。

7.2.2 调度

调度器是内核中负责决定在某个特殊时间哪个任务应该执行的部分。内核可以在任务的生命期挂起,恢复一个任务许多次。

调度策略是调度器用来决定哪个任务在哪个时间点执行的算法。一个(非实时)多用户系统的策略很可能分配给每个任务一个公平的处理器时间片。用在实时系统/嵌入式系统的策略稍后再描述。

除了被RTOS内核无意地挂起外,一个任务还可以自己挂起自己。如果一个任务想延迟一段固定的时间,或者等待某个资源可用(例如一个串口),或者等待一个事件出现(例如一个键按下)。一个阻塞或者睡眠的任务是不能执行的,不会为它分配任何处理时间。

一个典型的任务调度实例如图7-1所示。其中包括了三个任务,Task1、Task2和Task3。任务调度的过程如下。

图7-1 任务调度实例

(1)首先,Task1正在运行。

(2)操作系统内核挂起Task1。

(3)系统恢复任务Task2。

(4)Task2正在执行,为独占访问,它锁定一个处理器外设。

(5)系统内核挂起Task2。

(6)系统恢复Task3。

(7)Task3试图访问同样的处理器外设,发现它被锁定,Task3不能继续,所以自己挂起自己。

(8)内核恢复Task1。

(9)接下来,Task2执行。它完成了对处理器外设的访问,所以解锁它。

(10)然后,Task3执行。它发现现在可以访问处理器外设了,于是开始执行,直到被内核挂起。

7.2.3 上下文切换

跟任何其他程序一样,一个任务执行时,它使用处理器/微控制器的寄存器,访问RAM和ROM。这些资源一起组成任务的执行上下文。

一个任务是一个连续有序的代码片段。它并不知道它将何时被内核挂起或者恢复,甚至不知道这些事情(挂起或者恢复)在什么时候已经发生了。

为了避免挂起任务中用到的寄存器被别的任务修改,必须保证在恢复一个任务之后,其上下文环境跟即将挂起前是一样的。操作系统内核有责任通过在任务挂起前保存其上下文来确保这种状况。当任务恢复时,保存的上下文就被操作系统内核恢复到先前的执行情况。保存一个被挂起的任务的上下文并在任务恢复时恢复其上下文的处理过程就叫做上下文切换。

7.2.4 实时应用和调度

实时操作系统与普通的多任务操作系统通过同样的原理达到多任务的目的。但它们的目标与那些非实时系统相比是很不一样的。不同的目标影响到不同的调度策略。实时/嵌入式系统设计成提供一个对真实世界的事件的及时响应。出现在真实世界中的事件可能有一个时间限制,在此期限之前,实时/嵌入式系统必须给出响应,RTOS调度策略必须确保时间限制是恰当的。

为了达到这个目的,软件工程师必须首先为每个任务设置一个优先级。RTOS的调度策略只是简单地确认能被执行的最高优先级别的任务是分配了处理时间的任务。这可能要求如果它们准备并发运行,能够在相同优先级的任务之间公平地共享处理时间。 r8eMgZktUnDlA34++2dyQ2gCvJeeQ24bodPNXIB3kKwUO13iTZif9gRqH+ckUaCl

点击中间区域
呼出菜单
上一章
目录
下一章
×