如何学习RTOS

一、学习RTOS目的

两个目的:
一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,我们可以考虑引入RTOS实现多线程管理,这是使用RTOS的最大优势。
二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。(摘自:RT-Thread内核实现与应用开发实战指南)

二、如何学习RTOS

如何学习一个RTOS?最简单的就是在别人移植好的系统之上,看看RTOS里面的API使用说明,然后调用这些API实现自己想要的功能即可。完全,不用关心底层的移植,这是最简单快速的入门方法。这种方法各有利弊,如果是做产品,好处是可以快速的实现功能,将产品推向市场,赢得先机,弊端是当程序出现问题的时候,因对这个RTOS不够了解,会导致调试困难,焦头烂额,一筹莫展。如果是学习,那么只会简单的调用API,那是不可取的,我们应该深入的学习其中一款RTOS。
目前市场上现有的RTOS,它们的内核实现方式都差不多,我们只需要深入学习其中一款就行。万变不离其宗,以后换到其它型号的RTOS,使用起来,那自然是得心应手。那如何深入的学习一款RTOS?这里有一个最有效也是最难的方法,就是阅读RTOS的源码,深究内核和每个组件的实现方式,这个过程枯燥且痛苦。
市面上虽然有一些讲解相关RTOS源码的书,如果你基础不够,且先前没有使用过该款RTOS,那么源码看起来还是会非常枯燥,且并不能从全局掌握整个RTOS的构成和实现。
现在,我们采用一种全新的方法来教大家学习一款RTOS,即不是单纯的讲里面的API如何使用,也不是单纯的拿里面的源码一句句来讲解。而是,从0开始,层层叠加,不断地完善,教大家怎么把一个RTOS从0到1写出来,让你在每一个阶段都能享受到成功的喜悦。在这个RTOS实现的过程中,只需要你具备C语言的基础就行,然后就是跟着野火这个教程笃定前行,最后定有所成。

三、选择什么RTOS

常用的RTOS有国外的FreeRTOS、μC/OS、RTX和国内的RT-Thread、Huawei LiteOS和AliOS-Things等,其中尤以国外开源且免费的FreeRTOS的市场占有率最高。如今国产的RT-Thread经过10来年的发展,声势迅猛,在国产RTOS中占据鳌头。
下面,我从网上查到关于这方面的资料。

1.RT-Thread

RT-Thread是一款来自中国的开源嵌入式实时操作系统,由国内一些专业开发人员从2006年开始开发、维护,除了类似FreeRTOS和UCOS的实时操作系统内核外,也包括一系列应用组件和驱动框架,如TCP/IP协议栈,虚拟文件系统,POSIX接口,图形用户界面,FreeModbus主从协议栈,CAN框架,动态模块等,因为系统稳定,功能丰富的特性被广泛用于新能源,电网,风机等高可靠性行业和设备上,已经被验证是一款高可靠的实时操作系统。
RT-Thread实时操作系统遵循GPLv2+许可证,实时操作系统内核及所有开源组件可以免费在商业产品中使用,不需要公布应用源码,没有任何潜在商业风险。
RT-Thread实时操作系统核心是一个高效的硬实时核心,它具备非常优异的实时性、稳定性、可剪裁性,当进行最小配置时,内核体积可以到 3k ROM 占用、1k RAM 占用。

任务/线程调度
  在RT-Thread中线程是最小的调度单位,线程调度算法是基于优先级的全抢占式多线程调度算法,支持256个线程优先级(也能通过配置文件更改为最大支持32个或8个线程优先级),0优先级代表最高优先级,255优先级留给空闲线程使用支持创建相同优先级线程,相同优先级的线程采用可设置时间片的轮转调度算法调度器寻找下一个最高优先级就绪线程的时间是恒定的(时间复杂度是1,即O(1))。系统不限制线程数量的多少,只和硬件平台的具体内存相关。

任务同步机制
  系统支持semaphore(信号量)、mutex(互斥锁)作为线程间同步机制。mutex采用优先级继存方式以解决优先级翻转问题。semaphore的释放动作可安全用于中断服务例程中。同步机制支持线程按优先级等待或按先进先出方式获取信号量或互斥锁。
  
任务间通信机制
  系统支持event(事件)、mbox(邮箱)和MessageQueue(消息队列)等通信机制。event支持多事件”或触发”及”与触发”,适合于线程等待多个事件情况。mbox中一封邮件的长度固定为4字节,效率较MessageQueue更为高效。通信设施中的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。
时间管理
  系统使用时钟节拍来完成同优先级任务的时间片轮转调度;线程对内核对象的时间敏感性是通过系统定时器来实现的;定时器支持软定时器及硬定时器(软定时器的处理在系统线程的上下文中,硬定时器的处理在中断的上下文中);定时器支持一次性超时及周期性超时。
内存管理
  系统支持静态内存池管理及动态内存堆管理。从静态内存池中获取内存块时间恒定,当内存池为空时,可把申请内存块的线程阻塞(或立刻返回,或等待一段时间后仍未获得内存块返回。这取决于内存块申请时设置的等待时间),当其他线程释内存块到内存池时,将把相应阻塞线程唤醒。动态堆内存管理对于不同的系统资源情况,提供了面向小内存系统的小内存管理算法及大内存系统的SLAB内存管理算法。
设备管理
  系统实现了按名称访问的设备管理子系统,可按照统一的API界面访问硬件设备。在设备驱动接口上,根据嵌入式系统的特点,对不同的设备可以挂接相应的事件,当设备事件触发时,通知给上层的应用程序。

2.FreeRTOS

FreeRTOS是专为小型嵌入式系统设计的可扩展的实时内核。
亮点包括:

  • 微小的封装形式。
  • 免费的RTOS调度程序。
  • 免费嵌入式软件源代码。
  • 免版税。
  • 抢占式,协作式和混合配置选项,可选时间分片。
  • SafeRTOS衍生产品对代码完整性提供了高度的信心。
  • 包括一个为低功耗应用设计的tickless模式。
  • 可以使用动态或静态分配的RAM来创建RTOS对象(任务,队列,信号量,软件定时器,互斥体和事件组)。
  • 官方支持>30个嵌入式系统架构(以ARM7和ARM Cortex-M3为一体架构)。
  • FreeRTOS-MPU支持ARM Cortex-M3内存保护单元(MPU)。
  • 设计小巧,简单易用。通常,RTOS内核二进制映像将在4K到9K字节的区域内。
  • 可移植性非常好的源代码结构,主要用C。
  • 支持实时任务和协同程序。
  • 直接到任务通知,队列,二进制信号量,计数信号量,递归信号量和互斥体,用于任务之间的通信和同步,或实时任务和中断之间。
  • 创新事件组(或事件标志)实施。
  • 具有优先级继承的互斥体
  • 高效的软件定时器。
  • 强大的执行跟踪功能。
  • 堆栈溢出检测选项。
  • 免费监控的论坛支持或可选的商业支持和许可。
  • 对可创建的实时任务数量没有软件限制。
  • 对任务优先级分配没有限制 - 可以为多个实时任务分配相同的优先级。
  • 许多支持的架构的免费开发工具。
  • 从标准的Windows主机开发。

3.uCOS家族(I/II/III)

μC/ OS-II和μC/ OS-III是抢占式,高度便携式和可扩展的实时内核。这些内核旨在便于在大量CPU架构上使用,这些内核是μC/ OS实时操作系统的关键组件。
 关键价值(Key Values):

  • 可移植性。 提供前所未有的易用性,μC/OS内核提供完整的源代码和深入的文档。 μC/ OS内核运行在大量处理器架构上,端口可供下载。
  • 可扩展性。 μC/ OS内核允许无限制的任务和内核对象。内核的内存占用可以缩小,仅包含应用程序所需的功能,通常为6-24 KB的代码空间和1KB的数据空间。
  • 可靠性。 μC/ OS内核包括减少开发时间的调试功能。内核提供广泛的范围检查,包括检查API调用中传递的指针,来自ISR的任务级服务,允许范围内的参数以及有效的指定选项。
  • 高效性。 Micrium的内核还包括有价值的运行时统计信息,使您的应用程序的内部可视化。 识别性能瓶颈,并在开发周期的早期优化电源使用。

μC/ OS内核的特性包括以下亮点(Highlights):

  • 抢占式多任务实时内核,可选择循环调度。
  • 提供完整,干净,一致的源代码,具有深入的文档。
  • 高可扩展性:无限数量的任务,优先级和内核对象。
  • 同时等待多个内核对象。
  • 直接向任务发送信号/消息。
  • 资源高效:6K至24K字节代码空间,1K +字节数据空间)。
  • 非常低的中断禁用时间。
  • 广泛的性能测量指标(可配置)。
  • 可用于关注安全型应用。

下表显示了µC/OS 多年来的演变, 比较了每个版本中可用的功能。
如何学习RTOS

4.RTX

Keil RTX是为ARM和Cortex-M设备设计的免版税,确定性的实时操作系统。它允许您创建同时执行多个功能的程序,并帮助创建更好的结构和更容易维护的应用程序。
 特征:

  • 具有源代码的免版权,确定性RTOS。
  • 灵活的调度:循环,抢占和协作
  • 具有低中断延迟的高速实时操作。
  • 为资源有限的系统提供小封装。
  • 无限数量的任务每个具有254个优先级。、
  • 无限数量的邮箱,信号量,互斥量和计时器。
  • 支持多线程和线程安全操作。
  • 内核感知调试支持MDK-ARM。
  • 使用μVision配置向导的基于对话框的设置。

5.VxWorks

VxWorks是美国WindRiver公司的产品,是目前嵌入式系统领域中应用很广泛,市场占有率比较高的嵌入式操作系统。VxWorks实时操作系统由400多个相对独立、短小精悍的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统;提供基于优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接口)规范的内存管理,以及多处理器控制程序;并且具有简明易懂的用户接口,在核心方面甚至町以微缩到8 KB。