FreeRTOS 从入门到精通1--实时操作系统的前世今生

FreeRTOS 从入门到精通1--实时操作系统的前世今生

专栏前言

笔者计划用专栏文章介绍当前在嵌入式系统中比较流行的开源实时操作系统FreeRTOS及其在意法半导体STM32平台,乐鑫科技ESP32平台Arduino平台上的开发与运用。

在当前工业4.0,智能制造,物联网IoT和工业物联网IIoT蓬勃发展的大环境下,在底层提供支持的实时操作系统将有着更为广泛的应用前景。“从入门到精通”这个标题起得可能有些大,更多的是想起到抛砖引玉的作用,能有个契机与感兴趣的童鞋们和从事嵌入式行业的同僚们互相切磋交流。

作为开篇笔者想简单介绍下实时操作系统的概念以及我们为什么要在资源紧张的嵌入式系统中使用实时操作系统。

从起源中理解事物,就是从本质上理解事物。 -杜勒鲁奇

什么是实时操作系统

操作系统的定义

操作系统的定位

一个计算机系统可以大致分为三个部分:硬件(Hardware),操作系统(operating system),应用程序(application programs)。硬件包含了芯片,存储空间,输入输出等设备为整个系统提供了基础的计算资源。操作系统是一个控制程序,作为硬件和应用程序之间的桥梁,主要是和硬件打交道,负责协调分配计算资源和内存资源给不同的应用程序使用,并防止系统出现故障。面对来自不同应用程序的大量且互相竞争的资源请求,操作系统通过一个调度算法和内存管理算法尽可能把资源公平且有效率地分配给不同的程序。应用程序则通过调用操作系统提供的API接口获得相应资源完成指定的任务。

一个通用操作系统提供的主要功能有(可见下图蓝色的部分,之后系列文章会详细谈到):

  • 任务(应用程序)的调度管理
  • 堆栈和内存管理
  • 文件管理
  • 队列管理
  • 中断和定时器管理
  • 资源管理
  • 输入输出管理
通用操作系统提供的功能

值得注意的是,操作系统自身需要占用一定的计算资源和内存资源,对于片上资源有限的单片机,可能需要根据需求剪裁操作系统的大小和功能。

实时性的含义

实时操作系统(RTOS-Real Time Operating System)中实时(Real Time)指的是任务(Task)或者说实现一个功能的线程(Thread)必须在给定的时间(Deadline)内完成。

人们总有种误解认为如果能堆砌更多的处理器核心数目,更高的处理器频率,更大的内存,更快的总线速度系统就一定能达到实时性。然而事与愿违强大的计算能力并不能保证系统的实时性。举一个简单的例子比如汽车中的安全气囊,在传感器检测到汽车发生碰撞后,安全气囊需要在30ms内完全打开,不然司机和乘客的人身安全将受到极大的威胁。倘若车载ECU有很强大的计算能力,但是如果因为要执行其他复杂计算任务或者任务调度的问题导致对汽车异常状态的监测和安全气囊的响应时间超过了规定的时间,系统实时性将无法得到保障从而导致系统失效和人员伤亡,这将会是非常严重的问题。

再举个例子比如特斯拉的车载系统:车机系统采用的是Linux系统,而汽车的驱动模块和刹车模块使用的是各自独自的系统。整个娱乐系统,触摸屏以及智能驾驶系统为了确保了系统的实时性都与汽车的驱动系统完全分开。

The whole entertainment system, those touchscreens, all of the applications you might load are totally separate from the propulsion of the car. In fact you could, if you had to, turn off the screens in the car while driving and the car still drives just fine. You couldn‘t see your Google Map, but you could still drive and stop and do everything else.
整个车载娱乐系统,触摸屏和所有你可能加载的应用都独立于汽车驱动系统。事实上你可以在驾驶过程中随意关闭屏幕而汽车依旧能正确的运行。你将无法看到你的导航应用但并不妨碍正常驾驶汽车。

一些其它的实时任务包括导弹的制导,无人驾驶等。为了保障这些实时任务能在给定的时间内完成,需要一个实时系统对这些任务进行调度和管理。一个实时操作系统能尽力保障每个任务的运行时间在规定时间内完成,这包括

  • 对中断和内部异常的处理
  • 对安全相关的事件的处理
  • 任务调度机制等

在这里举一个反例便是大众汽车开发车载操作系统VW.OS的最初,想要把70 个供应商的ECU直接集成到VW.OS中,在一开始产生了很多的问题。想单纯通过叠加硬件算力解决问题是很难的。

当然系统的稳定性不能仅仅依靠实时操作系统,安全功能(fail-safe function)相关的设计也是必须要考虑到的。在Netflix的纪录片《一落千丈:波音大调查》中就提到,导致两起波音最新机型737 Max的失事事故的直接原因在于当飞机的迎角传感器发生故障,机上装载的机动特性增强系统(MCAS)误认为飞机处于失速状态,无视飞行员的操纵强制自动接管飞机,持续压机头导致了惨剧的发生。可见纵使波音的飞控系统非常稳定,但如果对传感器的数值判定和使用不当并缺少安全性冗余设计,系统的整体稳定性依然无法得到保障。


操作系统的种类

2018年IoT设备所采用操作系统的倾向性调查

目前比较流行的实时操作系统包括黑莓QNX,FreeRTOS,uCOS,RT-Thread等。在上图中可以看出,除了Linux和Windows通用操作系统外,接下来便是FreeRTOS受到广大开发者的青睐。图表中也罗列了一些国产的系统。比如腾讯发布和开源的TencentOS tiny,这是一个面向物联网的实时操作系统。华为也推出了鸿蒙LiteOS, 万物互联,遥遥领先。

实时操作系统(Real Time Operating System)相对应的是通用操作系统(General Purpose Operating System)。通用操作系统包括Linux,Windows,MAC等主流的操作系统。这些操作系统大家每天都在使用,功能也十分强大,只是它们有时为了保障系统的流畅运行,就不能保证每个程序都能实时响应,在易用性和实时性之间有所取舍。而且单片机有限的片上资源也不足以支撑通用操作系统的运行。

正所谓术业有专攻在嵌入式领域中,嵌入式实时操作系统(RTOS)可以更合理、更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,从而更好地保证系统的实时性和可靠性。

下面的几个链接分别是FreeRTOS,RT-Thread,TencentOS tiny,鸿蒙LiteOS的源代码链接


FreeRTOS的介绍

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。
--百度百科

FreeRTOS的官网地址是

官网上会有关于FreeRTOS的最新新闻和技术文档,如果大家吃透了FreeRTOS的技术文档的话,其实也就不需要读我的文章了哈哈。我将在之后文章中简单介绍下FreeRTOS的移植要点。笔者将分别对ESP32平台和STM32平台进行介绍。

FreeRTOS的特性

  • 具有抢占式或者合作式的实时操作系统内核
  • 功能可裁剪,最小占用10kB左右rom空间,0.5kB ram空间
  • 灵活的任务优先级分配
  • 具有低功耗模式
  • 有互斥锁、信号量、消息队列等功能
  • 运行过程可追踪
  • 支持中断嵌套

对称多处理(SMP)

对称多处理器(Symmetric Multi-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。它是相对非对称多处理技术而言的、应用十分广泛的并行技术

在嵌入式系统中通常是指

  • 芯片有多个核心独立运行,每个核心有自己的寄存器,中断和中断处理
  • 共享内存

对称多处理器相对于绝大多数单核单片机的优势是

  • 能同时处理更多的任务,吞吐量更大
  • 任务在多核处理器中可以按需切换核心运行,理论上通过优化调度可以达到更高的CPU占有率

ESP32芯片是有双核心(CPU0和CPU1)的,所以基于ESP32平台的FreeRTOS是修改支持SMP技术的。下图是ESP32在初始化中任务的创建过程,可以看到不同的任务被分别分配到了CPU0和CPU1。更多的技术概念会在接下来的文章中进行介绍。

ESP32初始化中任务的创建

详细的技术说明可以参考官方的文档

STM32CubeIDE

STM32CubeIDE是一个多功能的集成开发工具,集成了TrueSTUDIO和STM32CubeMX,它是STM32Cube软件生态系统的一部分。STM32CubeIDE是一个先进的C/C++开发平台,具有STM32微控制器的IP配置,代码生成,代码编译和调试功能。

相对而言对使用STM32平台的童鞋们来说使用FreeRTOS非常方便和强大,因为它被集成到了STM32的开发环境当中。

STM32CubeIDE的主界面
STM32CubeIDE的FreeRTOS设置界面

如上图所示,强烈安利使用STM32CubeIDE进行STM32平台项目的开发。通过举手之间的配置,FreeRTOS就被部署到了项目中去。在项目结构中中间件(Middlewares)你可以看到FreeRTOS这个文件。同时FreeRTOS的参数设置,添加删除任务,定时器,消息队列等都可以通过下面的图形化界面进行配置,之后文章会详细介绍。

FreeRTOS的图形化配置界面


标准库和HAL库

还有一点要说明的事情,STM32的开发包括寄存器开发标准库文件开发,还有HAL库开发三种开发方式。市面上很多应用教程都是针对标准库设计的。本系列教程将统一采用HAL(Hardware Abstraction Layer)库,这是一个痛苦的选择,但是因为意法半导体(ST)已经停止对标准库文件的维护和开发,为了与时俱和移植性便利性选择了HAL库。HAL库的原理和标准库大同小异,所以学起来其实并不会太累,只是需要跳离舒适区慢慢适应,适应好之后也就学会了屠龙之术。

One More Thing

之前在油管上看到了一个关于RTOS系统的介绍和应用视频,感觉可以用来很好的总结本章的内容。(如果需要字幕翻译的话,留言点赞的人多的话我会考虑做的哈哈)

RTOS实时系统的介绍和应用https://www.zhihu.com/video/1451628572633432064

入门FreeRTOS的最简单且基础的方法就是入手一块开发板,可以结合之后的章节多跑点程序去试错和尝试

然后手头能有一本FreeRTOS的工具书时刻可以参考

阅读量统计

本篇文章大约有十八万多个小伙伴阅读过,到了第十篇文章有四万多个小伙伴坚持了下来,希望大家都能坚持下来,共同进步和提高!

笔者本职是在德国做自动化工程师,嵌入式开发是我的业余爱好。祝大家都能学有所成!Alles gute!

系列的总结文章

编辑于 2024-03-18 03:36・IP 属地德国