RTOS简介
RTOS是实时操作系统的总称。以前在开发的简单项目的时候基本都会选择芯片裸跑,程序设计基本都是前后台设计模式,但自从RTOS出现之后,为我们设计复杂应用提供了基础。RTOS的核心其实就是多任务和实时性。 操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。 实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这 种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。 目前RTOS的种类非常的多,但国内使用最多有如下几个:
- UCOS(吐槽一下,UCOS的版本更新实在太慢了而且还收费):这是一个收费的RTOS,我个人认为之所以在国内使用的比较多,是因为在RTOS兴起的初期它的文档实在太详细。之后有时间我也会讲解UCOS,毕竟国内用的企业还是很多的
- FreeRTOS:这是一个免费的RTOS。目前FreeRTOS已经发展的很好了,大多数的芯片厂商在发布芯片的时候都会在芯片的demo板上集成FreeRTOS。官网的文档也很详细。目前已经被亚马逊收购
- RT-Thread:这是国内的一家公司开发的RTOS,扩展了很多的实用的组件,之前研究的时候这个系统的文档是真的不是友善,看起来很全面,但真正用的时候。。。
- zephyr:这个RTOS系统是linux开源基金会发布的,这是一个免费的RTOS。对比前面的三个RTOS系统,这个系统在国内并不出名,但这个系统是我本人特别推荐的。
来说说我对这几个RTOS系统的个人理解吧,以下纯属个人理解,如果有理解的不对的地方希望指出。
- UCOS和FreeRTOS这两个系统其实我个人认为学习了一个之后另外一个基本不需要去系统的学习,思想基本是一样的(一些细节有差异,比如队列的操作中,UCOS是指针传递,FreeRTOS是值传递),无非API不一样。这两个系统对于初学者是很容易上手的,缺点是在采用这两个系统开发的时候,官方并没有将驱动和应用做分离,这带来的问题就是如果我们在STM32上写好了一个应用,这个时候如果想换芯片那基本这个项目就得重新来过。还有一个缺点是它们本身生态并不强大,而且扩展性并不好,比如我想集成github开源的另外一个项目,基本只能自己一步一步的来,并没有一个规范。
- RT-Thread是国产的一个系统,这个系统生态还算强大,但目前支持的芯片较少,如果想要支持那就需要自己移植。
zephyr这个系统给我的感觉就是linux系统的一个翻版,只不过它可以用在资源较少的芯片上。而且目前它支持的芯片特别多,常用的芯片基本都支持,并且支持驱动和应用分离、生态强大。换句话说,这个系统可以让你在STM32上写的应用,几乎可以无修改的移植到EMF32上,这就是我比较推荐这个系统的原因。不过这个系统的上手难度还是很高的。其实在大公司都会做自己的中间库,这个中间库无非是将每种芯片的驱动都抽离出来然后封装,这样可以让上层应用不需要知道底层驱动的原理,zephyr其实可以看成这样的一个中间库。
FreeRTOS的简介
接下来我们以FreeRTOS的V9.0版本进行讲解在上面我们已经介绍了几种RTOS,这里我们来说说FreeRTOS。FreeRTOS的是免费的,这就造成了它发展的特别快,而且稳定性也相对有保证,资料也很齐全。以下是FreeRTOS的特点:
FreeRTOS 的内核支持抢占式,合作式和时间片调度。
- 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、软件定时器等等。
- 已经在超过 30 种架构的芯片上进行了移植。
- FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F429。
- FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
- 高可移植性,代码主要 C 语言编写。
- 支持实时任务和协程(co-routines 也有称为合作式、协同程序,本教程均成为协程)。
- 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
- 创新的事件组(或者事件标志)。
- 具有优先级继承特性的互斥信号量。
- 高效的软件定时器。
- 强大的跟踪执行功能。
- 堆栈溢出检测功能。
- 任务数量不限。
- 任务优先级不限。
下载FreeRTOS
官网
下载地址目前最新版本是V10.4,这里我们以V9.0进行说明,所以要下载V9.0版本。因为V10.0版本之后是亚马逊收购了FreeRTOS之后才出来的版本,主要添加了一些云端组件,我们本书所讲的FreeRTOS是实时内核,采用V9.0版本足以。FreeRTOS的源码目录游览
FreeRTOS 文件夹
- Demo 文件夹:Demo 文件夹里面就是 FreeRTOS 的相关例程,FreeRTOS 针对不同的 MCU 提供了非常多的 Demo
- License 文件夹:这个文件夹里面就是相关的许可信息,要用 FreeRTOS 做产品的得仔细看看,尤其是要出口的产品。
- Source 文件夹:这就FreeRTOS的源码了。
- include 文件夹是一些头文件,移植的时候是需要的,下面的这些.C 文件就是 FreeRTOS 的源码文件了,移植的时候肯定也是需要的。
- portable 文件夹里面的东西就是 FreeRTOS系统和具体的硬件之间的连接桥梁!不同的编译环境,不同的 MCU,其桥梁应该是不同的。
MemMang 这个文件夹是跟内存管理相关的,我们移植的时候是必须的
FreeRTOS-Plus 文件夹
这文件夹其实并不是FreeRTOS的源码,而是是在这个 FreeRTOS系统上另外增加的一些功能代码,比如 CLI、FAT、Trace 等等。这些其实就是FreeRTOS系统自带的生态。我们这里不介绍这部分的代码,感兴趣的可以自己去学习。
- Demo文件夹:这里面也是存放了一些例程
- source文件夹:功能代码的源码
FreeRTOS的移植
这里关于FreeRTOS在芯片上的移植我是不打算讲解,因为网上这方面的资料很多很多。而且移植FreeRTOS的时候是特定于芯片和编译工具的,所以只有确认了芯片和编译之后才可以去找相关的移植步骤。举个例子:我想去把FreeRTOS移植到STM32芯片上,STM32编译采用的MDK工具,那我们就可以利用STM32CubeMX工具直接以图形化的方式去生成移植后的工程。这里要注意如果采用Clion开发工具STM32和采用MDK开发STM32移植FreeRTOS的文件的不一样的。也可以参考DEMO下的已经移植好的芯片工程去移植。 总之一句话移植FreeRTOS必须先确认芯片和编译环境。这里我不去讨论移植,并非移植不重要,而是网上有很多相关的文章都写的很好。只有将FreeRTOS移植到我们芯片上之后,我们才能谈下一步的去使用它。
FreeRTOS的功能概述
- 任务
- 时钟管理
- 内存管理
- 队列
- 信号量
- 软件定时器
- 时间标志组