Skip to content

1 前言

1.1 小型嵌入式系统中的多任务

1.1.1 关于 FreeRTOS 内核

FreeRTOS 是一组 C 语言库的集合,由实时内核以及一组实现补充功能的模块化库组成。

Richard Barry 大约在 2003 年最初开发了 FreeRTOS。Richard 的公司 Real-Time Engineers Ltd 与全球领先芯片厂商紧密合作,持续推进 FreeRTOS 的开发,直到 2016 年 Amazon Web Services(AWS)接管 FreeRTOS 的维护。如今 Richard 作为 AWS IoT 团队的高级首席工程师,继续从事 FreeRTOS 相关工作。FreeRTOS 采用 MIT 开源许可证,任何用途都可使用。你无需成为 AWS 客户,也能从 AWS 对 FreeRTOS 的维护中受益!

FreeRTOS 内核非常适合运行在微控制器或小型微处理器上的深度嵌入式实时应用。这类应用通常同时包含硬实时和软实时需求。

软实时需求会给出时间截止点——但即便超过截止点,系统也不会失去可用性。例如,对按键响应过慢会让系统显得迟钝、令人烦躁,但不至于完全无法使用。

硬实时需求同样会给出时间截止点——但一旦超过截止点,系统将彻底失效。例如,汽车安全气囊若对碰撞传感器输入响应过慢,可能带来比不触发更严重的后果。

FreeRTOS 内核是一个实时内核(或实时调度器),可帮助基于 FreeRTOS 构建的应用满足硬实时需求。它使应用能够组织为多个彼此独立的执行线程。比如在单核处理器上,任意时刻只能执行一个线程。内核会根据应用设计者为各线程分配的优先级来决定当前执行哪个线程。在最简单的情况下,设计者可以把实现硬实时需求的线程设为高优先级,把实现软实时需求的线程设为低优先级。这样可确保硬实时线程总是先于软实时线程执行,但优先级分配并不总是如此简单。

如果你还没有完全理解上一段中的概念,不必担心。后续章节会通过大量示例进行详细说明,帮助你理解如何使用实时内核,尤其是 FreeRTOS。

1.1.2 价值主张

FreeRTOS 内核在全球范围取得了前所未有的成功,源于其极具吸引力的价值主张:FreeRTOS 由专业团队开发,遵循严格的质量控制,健壮可靠,提供支持,不存在知识产权归属不清的问题,并且可真正免费用于商业产品,而无需公开你的专有源代码。此外,AWS 的接管带来了全球化支持能力、专业的安全事件响应流程、规模大且多元化的开发团队、形式化验证能力、渗透测试能力、内存安全证明能力以及长期支持——同时依然保持 FreeRTOS 作为硬件中立、开发工具中立、云服务中立的开源项目。FreeRTOS 在 GitHub 上以透明、社区驱动的方式开发,不要求使用任何特殊工具或特殊开发流程。

你可以使用 FreeRTOS 把产品推向市场,甚至不需要通知我们,更不用支付任何费用——已有成千上万家公司这样做。如果你希望获得额外保障,或你的法务团队需要额外的书面保证或赔偿承诺,我们的战略合作伙伴也提供简洁且低成本的商业授权方案。让人安心的是:你可以在任何时候自行选择转向商业路线。

1.1.3 关于术语的一点说明

在 FreeRTOS 中,每一个执行线程都称为“任务(task)”。嵌入式社区在术语上并未完全统一,但我更倾向使用“任务”而不是“线程(thread)”,因为在某些应用领域中“线程”具有更具体的含义。

1.1.4 为什么要使用 RTOS?

即使不使用多线程内核,也有许多成熟方法可编写高质量嵌入式软件。如果正在开发的系统较为简单,这些方法可能就是最合适的方案。对于更复杂的系统,使用内核通常更有优势,但两者的分界点始终带有主观性。

如前所述,任务优先级可以帮助应用满足处理时限,但内核还能带来一些不那么直观的收益。下面简要列出其中一部分:

  • 抽象掉时序细节

RTOS 负责执行时序,并向应用提供时间相关 API。这使应用代码结构更直接、整体代码体积更小。

  • 可维护性 / 可扩展性

时序细节被抽象后,模块间依赖更少,软件可更可控、可预测地演进。同时,由内核统一负责时序,使应用性能不易受底层硬件变化影响。

  • 模块化

任务是彼此独立的模块,每个任务都应有明确目标。

  • 团队协作开发

任务也应具备定义清晰的接口,从而更便于团队分工协作。

  • 更易测试

具备清晰接口、相互独立的任务模块,更容易进行隔离测试。

  • 代码复用

模块化程度更高、相互依赖更少的代码更易复用。

  • 更高效率

基于 RTOS 的应用代码可以完全事件驱动。无需通过轮询去浪费处理时间检查尚未发生的事件。

与事件驱动带来的效率提升相对应的开销,是需要处理 RTOS 的 tick 中断以及任务切换。不过,不使用 RTOS 的应用通常也会以某种形式引入 tick 中断。

  • 空闲时间利用

当没有应用任务需要处理时,系统自动创建的空闲任务(Idle task)会执行。空闲任务可用于测量富余算力、执行后台检查,或让处理器进入低功耗模式。

  • 电源管理

使用 RTOS 带来的效率提升,能让处理器有更多时间停留在低功耗模式。

每次空闲任务运行时将处理器切入低功耗状态,可显著降低功耗。FreeRTOS 还提供专门的无 tick(tick-less)模式。使用 tick-less 模式可让处理器进入更深的低功耗状态,并且保持更长时间。

  • 灵活的中断处理

可将中断处理程序保持得非常短,把后续处理延后到应用创建的任务,或者延后到 RTOS 自动创建的守护任务(daemon task,也称 timer task)中执行。

  • 混合处理需求

使用简单设计模式即可在同一应用中同时实现周期处理、连续处理和事件驱动处理。此外,通过合理设置任务与中断优先级,还可以同时满足硬实时和软实时需求。

1.1.5 FreeRTOS 内核特性

FreeRTOS 内核具备以下标准特性:

  • 抢占式或协作式调度
  • 可选时间片轮转
  • 非常灵活的任务优先级分配
  • 灵活、快速、轻量级的任务通知机制
  • 队列(Queues)
  • 二值信号量(Binary Semaphores)
  • 计数信号量(Counting Semaphores)
  • 互斥量(Mutexes)
  • 递归互斥量(Recursive Mutexes)
  • 软件定时器(Software Timers)
  • 事件组(Event Groups)
  • 流缓冲区(Stream Buffers)
  • 消息缓冲区(Message Buffers)
  • 协程(Co-routines,已弃用)
  • Tick Hook 函数
  • Idle Hook 函数
  • 栈溢出检测
  • 跟踪宏(Trace Macros)
  • 任务运行时统计采集
  • 可选商业授权与支持
  • 完整的中断嵌套模型(部分架构支持)
  • 面向极低功耗应用的无 tick 能力(部分架构支持)
  • 用于任务隔离与提升应用安全性的 MPU 支持(部分架构支持)
  • 适用时采用软件管理中断栈(可帮助节省 RAM)
  • 支持使用静态内存或动态内存创建 RTOS 对象

1.1.6 许可证,以及 FreeRTOS、OpenRTOS、SafeRTOS 家族

FreeRTOS 的 MIT 开源许可证旨在确保:

  • FreeRTOS 可用于商业应用。

  • FreeRTOS 本身始终对所有人免费开放。

  • FreeRTOS 用户保有其知识产权所有权。

最新开源许可证信息请参见 https://www.FreeRTOS.org/license

OpenRTOS 是 FreeRTOS 的商业授权版本,由第三方在 Amazon Web Services 授权下提供。

SafeRTOS 与 FreeRTOS 采用相同的使用模型,但其开发遵循了相关实践、流程与过程,可用于声明符合多项国际认可的安全标准。

1.2 随书附带源码与工程

1.2.1 获取本书配套示例

可从 https://www.FreeRTOS.org/Documentation/code 下载 zip 文件,其中包含构建与运行本书示例所需的全部源代码、预配置工程文件以及说明文档。请注意,该 zip 文件不一定包含 FreeRTOS 的最新版本。

本书中的截图展示了示例在 Microsoft Windows 环境下、使用 FreeRTOS Windows 移植层运行的效果。使用 FreeRTOS Windows 移植层的工程已预配置为可通过 Visual Studio 免费 Community 版本构建,下载地址为 https://www.visualstudio.com/。需要说明的是,尽管 FreeRTOS Windows 移植层是一个方便的评估、测试与开发平台,但它提供真正的实时行为。