前言 小型嵌入式系统中的多任务
关于FreeRTOS
FreeRTOS是由实时工程师有限公司[1]独家拥有、开发和维护的实时内核。十几年来,为了向用户提供这套曾获大奖、达到商业等级而且完全免费的高质量软件,实时工程师有限公司一直与世界领先的芯片公司保持着密切合作。
对于采用微控制器或小型微处理器的深度嵌入式实时应用,FreeRTOS非常合适。通常,这类应用对硬实时性和软实时性都规定了时间期限。
软实时性,突破期限不会使系统功能丧失。例如,对按键的响应速度太慢,可能使系统响应看起来令人讨厌,但不影响系统的正常使用。
硬实时性,突破期限将导致系统功能完全失效。例如,驾驶员的安全气囊对碰撞传感器输入反应太慢,其潜在的风险往往是致命的。
FreeRTOS是一种实时内核或者实时调度器,在其基础上可以构建嵌入式应用程序,以满足系统的硬实时性要求。FreeRTOS将应用程序组织成独立执行线程的集合,在只有一个核的处理器上,任何时候只能执行一个线程。内核通过检查编程人员分配给每个线程的优先级来决定应该执行哪个线程。在最简单的情况下,编程人员可以给需实现硬实时要求的线程分配较高的优先级,给需实现软实时要求的线程分配较低的优先级。这将确保硬实时线程总是先于软实时线程执行,但是优先级分配策略并不总是那么简单。
如果还没有完全理解前一段的概念,也不必担心。本书下面的章节将通过示例来详细解释,帮助读者理解如何使用实时内核,特别是如何使用FreeRTOS。
价值观
FreeRTOS在全球范围内取得的巨大成功来自其令人信服的价值观:FreeRTOS是专业开发的,具有严格的质量控制、健壮性和技术支持,没有所有权含糊不清的知识产权。在商业应用中FreeRTOS是免费的,不需要暴露用户的专有源代码。用户可以使用FreeRTOS将产品推向市场,整个过程不需要和实时工程师有限公司沟通,当然也就没有支付费用的问题。如果用户想收到软件包的额外备份,或者用户的法律团队需要额外的书面保证或赔偿,也有简单低成本的商业化升级方案,用户可以在任何必要的时候选择走商业化路线。
关于术语的说明
FreeRTOS中执行的线程称为“任务”。在嵌入式社区内部,虽然对于术语并没有达成共识,但我更倾向于使用“任务”而不是“线程”,因为线程在某些应用领域可能有特定的含义。
使用实时内核的理由
在不使用内核的情况下,有大量成熟技术用于写出好的嵌入式软件;如果开发的系统很简单,这些技术就会提供最合适的解决方案。在比较复杂的情况下,使用内核可能更合适,但是孰优孰劣的争议总是主观的。
如前所述,任务优先级有助于确保应用程序满足其处理期限要求,但是内核也会带来其他不太明显的优势。下面简要列出其中的部分优势。
• 对时间信息进行抽象
内核负责执行时间,同时也为应用程序提供与时间相关的API函数。这使得应用程序代码的结构更简单,整体代码量也更小。
• 可维护性/可扩展性
抽象化时间细节会减少模块之间的相互依赖性,并允许软件以可控和可预测的方式运行。此外,内核负责执行时间,因此应用程序的性能不易受到底层硬件变化的影响。
• 模块化
任务是独立的模块,每个模块都应该有明确的目的。
• 团队开发
任务还应该有明确定义的接口,使团队开发更容易进行。
• 更容易测试
如果任务是规划良好且具有明确接口的独立模块,则可以对任务开展隔离测试。
• 代码复用
更大的模块化和更少的相互依赖性使得代码能够以更小的代价进行复用。
• 提高效率
使用内核允许软件完全由事件驱动,因此轮询尚未发生的事件不会浪费处理时间,代码仅在有必须完成的事情时才会执行。
与提高效率相反的是,需要处理RTOS的滴答(tick)[2]中断,并把执行从一个任务切换到另一个任务。然而,不使用RTOS的应用程序通常也会包含某种形式的滴答中断。
• 空闲时间
在启动调度器时,将自动创建空闲任务。在没有希望执行的应用程序任务时,空闲任务就会被执行。空闲任务可以用来测量备用处理能力,执行后台检查,或者仅仅是将处理器置于低功耗模式。
• 电源管理
通过使用RTOS获得的效率提升,可以使处理器在低功耗模式下运行更长的时间。
每当空闲任务运行时,将处理器置于低功耗模式,从而大大降低系统功耗。FreeRTOS还有一种特殊的无滴答(tick-less)模式,该模式使处理器进入比其他方式更低的功耗模式,并在低功耗模式下运行更长的时间。
• 灵活的中断处理
通过将具体的处理分配给编程人员创建的任务或FreeRTOS守护任务,中断处理程序可以保持短小精悍。
• 混合处理需求
通过简单的设计模式就可以在应用程序中实现周期性、连续和事件驱动的混合处理。此外,通过选择适当的任务和中断优先级,可以满足系统的硬实时性和软实时性需求。
FreeRTOS特性
FreeRTOS具有以下标准特性。
• 任务的抢占式或协同式运行模式
• 非常灵活的任务优先级分配
• 灵活、快速、轻量级的任务通知机制
• 队列
• 二进制信号量
• 计数信号量
• 互斥量
• 递归互斥量
• 软件定时器
• 事件组
• 滴答钩子函数
• 空闲钩子函数
• 栈溢出检查
• 跟踪记录
• 任务运行时统计数据收集
• 可选的商业许可和支持
• 完整的中断嵌套模型(针对某些架构)
• 适用于极端低功率应用的无滴答模式
• 适当的软件管理中断堆栈(此特性有助于节省RAM)
许可证,以及FreeRTOS、OpenRTOS和SafeRTOS家族
OpenRTOS是FreeRTOS的商业授权版本,由实时工程师有限公司授权的第三方组织提供。SafeRTOS与FreeRTOS具有相同的使用模式,但SafeRTOS是根据要求符合各种国际公认的安全相关标准所需的实践、程序和流程开发的。
FreeRTOS开放源码许可证旨在确保用户拥有以下权利:
FreeRTOS可以用于商业应用。
FreeRTOS本身仍然免费提供给所有用户。
FreeRTOS用户保留其知识产权的所有权。
参见FreeRTOS官网,以获取最新的开源许可信息。
本书所包含的源文件和工程
获取本书所附的示例
本书配有电子资源,包含示例中所用的源代码、预配置的工程文件和完整的构建说明,读者可登录华信教育资源网(www.hxedu.com.cn)免费下载,还可以从FreeRTOS的官方网站下载电子资源的压缩文件(该压缩文件可能不含最新版本的FreeRTOS)。
本书包含的屏幕截图是在微软Windows环境下使用FreeRTOS Windows移植[3]执行示例时拍摄的。使用FreeRTOS Windows移植的工程是预先配置好的,可以使用免费的Visual Studio Express版本进行构建。Visual Studio开发软件可以从微软官网中下载。请注意,FreeRTOS Windows移植虽然提供了一个便捷的评估、测试和开发平台,但并没有提供真正的实时行为。
[1]译者注:目前该公司的业务已转移至亚马逊网络服务(Amazon Web Services)公司。
[2]译者注:tick是RTOS中使用频率最高的词汇之一,目前还没有统一的中文译法,有人将其翻译成“时钟节拍”,也有人将其翻译成“心跳”,但编程人员通常更愿意直呼tick。本书中文版将其翻译为“滴答”,对应时钟节拍的滴答声,读者将滴答与tick对应即可。
[3]译者注:FreeRTOS可以在多种处理器架构上运行,而在不同的处理器架构上运行就需要完成相应的移植工作。本书提供的示例运行在Windows的FreeRTOS仿真程序上,相当于在模拟器上运行。Windows是通用操作系统,FreeRTOS是嵌入式实时操作系统,说FreeRTOS移植到Windows上是不恰当的。但翻译时为与原文对应,将FreeRTOS Windows port直译为FreeRTOS Windows移植。