FreeRTOS 从入门到精通 - 精华总结 - 知乎 (zhihu.com)
FreeRTOS的官网地址是 https://www.freertos.org/
FreeRTOS的源码可以通过官网进行下载,也可以在GitHub上进行下载。当前最新版本已经更新到10.xx版本。当然也可以下载之前的旧版本。
FreeRTOS文档可以在这个网站进行下载FreeRTOS 文档。同时我们在官网也可以看到,有对这些函数进行说明的一些网页。
- 《Mastering the FreeRTOS Real Time Kernel》一书深入浅出地介绍了FreeRTOS内核的工作原理,本专栏的很多内容都是借鉴于此书强烈推荐一读;
- 《Mastering the FreeRTOS Real Time Kernel》罗列了FreeRTOS的API函数及其使用说明,可作为参考文献。
FreeRTOS基础知识原理 - 知乎 (zhihu.com)
相对 μC/OS-II/III、embOS 等商业操作系统,FreeRTOS 操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。
商业 RTOS 介绍:
embOS:
- embOS 是 SEGGER 公司开发的一款 RTOS,支持抢占调度和时间片轮询调度。embOS 内存占用少,ROM 最少只占用1.7KB。代码符合 MISRA-C:2012,支持低功耗管理,支持市面上主流的编译器和处理器架构。
- embOS 对教育和非商业用途提供免费评估,以二进制库的方式提供,可以登录 SEGGER 官网根据所使用的编译器和处理器进行下载。
μC/OS:
- μC/OS 英文全称 Micro-Controller Operating Systems,是一款实时操作系统,Jean J. Labrosse 于1991年设计出来,是一种基于优先级的抢占式内核,用C语言编写,主要用于嵌入式系统。
- Jean J. Labrosse 最初是 Micrium, Inc 公司的一员,开发了商业版本 μC/OS-II 和 μC/OS-III。
- 2016年,Micrium, Inc. 被 Silicon Laboratories收购,随后 μC/OS 在 Apache 许可下作为开源软件发布。Silicon Labs 继续维护一个名为 Micrium OS 的开源产品用于他们自己的芯片。一群前 Micrium, Inc. 员工(包括 Labrosse)为 μC/OS 和 Cesium RTOS 提供咨询和支持,这是一个专有分支是在开源发布之后制作的。
- Cesium RTOS 是一个全功能的嵌入式操作系统(包含 μC/OS、uC-TCP-IP、uC-FS 等),最初是从 Micrium µC/OS 派生出来的。代码库由 Weston Embedded Solutions 严格开发和维护。它支持 TCP/IP、USB 主机/设备和 Modbus, 以及强大的文件系统。
- Cesium RTOS 的核心是 μC/OS-II 和 μC/OS-III 实时内核;用于微处理器、微控制器和 DSP 的高度便携、可扩展、抢占式、实时、确定性、多任务内核。
- μC/OS-III 采用 Apache Licence 2.0 许可协议:鼓励代码共享,允许代码修改,作为开源或商业软件再发布;但需要尊重代码作者的著作权。
μC/OS 与 Cesium RTOS 区别?μC/OS 只是一个操作系统内核,归属于 Cesium RTOS;Cesium RTOS 除了含有 μC/OS 还有其他功能组件,如 μC-TCP-IP、μC-FS 等。本文主要针对于 μC/OS-III 操作系统内核进行介绍。
μC/OS-III 于2009年推出,提供了 μC/OS-II 的所有特性和功能。最大的区别是支持的任务数量。对于最多 255 个任务,μC/OS-II 只允许 255 个优先级中的每一个有 1 个任务。μC/OS-III 允许任意数量的应用程序任务、优先级和每个级别的任务,仅受处理器对内存的访问限制。
μC/OS-III的移植需要 uC-OS3 、uC-CPU、uC-LIB 三个组件,具体移植思想后续更新。
Weston Embedded Solutions · GitHub
下面为大家分享一下 μC/OS、μC/OS-II、μC/OS-III三个版本的区别:
功能 | uC/OS | uC/OS-II | uC/OS-III |
诞生年份 | 1992 | 1998 | 2009 |
书籍 | 有 | 有 | 有 |
提供源代码 | 是 | 是 | 是 |
抢占式多任务 | 是 | 是 | 是 |
最大任务数 | 64 | 256 | 无限制 |
每个优先级的任务 | 1 | 1 | 无限制 |
时间片轮转 | 否 | 否 | 是 |
信号量 | 是 | 是 | 是 |
互斥信号量 | 否 | 是 | 是(可嵌套的) |
事件标志 | 否 | 是 | 是 |
消息邮箱 | 是 | 是 | 否(不需要了) |
消息队列 | 是 | 是 | 是 |
固定大小的内存管 | 否 | 是 | 是 |
不通过信号量标记 | 否 | 否 | 是 |
不通过消息队列发 | 否 | 否 | 是 |
软件定时器 | 否 | 是 | 是 |
任务停止/恢复 | 否 | 是 | 是(可嵌套的) |
死锁预防 | 是 | 是 | 是 |
可扩展的 | 是 | 是 | 是 |
代码段需求 | 3K 到 8K | 6K 到 26K | 6K 到 20K |
数据段需求 | 1K+ | 1K+ | 1K+ |
可固化 | 是 | 是 | 是 |
在运行时配置 | 否 | 否 | 是 |
编译时配置 | 是 | 是 | 是 |
每个对象命名 | 否 | 是 | 是 |
挂起多个对象 | 否 | 是 | 是 |
任务寄存器 | 否 | 是 | 是 |
嵌入的测量功能 | 否 | 有限制 | 大量的 |
用户可定义的 hook | 否 | 是 | 是 |
时间戳 | 否 | 否 | 是 |
嵌入的内核调试 | 否 | 是 | 是 |
汇编可优化 | 否 | 否 | 是 |
任务级的时基定时 | 否 | 否 | 是 |
提供的服务 | ~20 | ~90 | ~70 |
MISRA-C:1998 | 否 | 是(除了 10 个规 | N/A |
MISRA-C:2004 | 否 | 否 | 是(除了 7 个规则) |
DO178B | 否 | 是 | 申请中 |
FDA 认证 | 否 | 是 | 申请中 |
SIL3/SIL4 IEC | 否 | 是 | 申请中 |
IEC-61508 | 否 | 是 | 申请中 |
嵌入式操作系统µC/OS的那段故事 (qq.com) 提到 μC/OS 发展历程的一些故事。
Protothreads -- Lightweight,Stackless Threads in C
Protothreads 是一种轻量级的协程库,主要用于嵌入式系统和无操作系统的单片机。它可以使编写嵌入式应用程序更加容易和高效,并提高系统的响应性和可靠性。最早由 Adam Dunkels 在2006年创立。
Protothreads 具有以下主要特点:
- 非常小的内存开销——每个 protothread 只有两个字节,没有额外的堆栈。
- 高度可移植性——protothreads 库是 100% 纯 C 的,没有特定于体系结构的汇编代码。
- 可以被使用在有操作系统或者没有操作系统的软件中。
- 提供阻塞等待而无需完整多线程或堆栈切换。
- 在 BSD 的开源许可协议下免费使用。
协程介绍:
协程是一种轻量级的线程,也被称为用户级线程,它是一种在单个线程内部的并发执行方式,通过在代码中插入特殊的挂起点来实现并发性。
用户级线程:
首先跟具有操作系统概念的线程不一样, 协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。协程不是被操作系统内核所管理,而完全是用户由程序所控制。实际上协程的概念比线程还要早。可以将协程理解为一次函数调用,只不过协程这种函数调用可以从上次返回点继续执行。
并发性:
- 协程最主要的作用是在单线程的条件下实现并发的效果,但实际上还是串行的。只不过通过特殊的挂点实现阻塞,让出 CPU 去执行其它的协程,在用户感觉上是并发。
- 如果有多核 CPU 的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的。
- 这个特殊的挂点也就是协程库所实现的东西。
进程,线程和协程的区别:
进程 | 线程 | 协程 | |
---|---|---|---|
调度方式 | 操作系统 | 操作系统 | 用户 |
切换时机 | 操作系统策略 | 操作系统策略 | 用户 |
资源消耗 | 上下文保存于内核栈 | 上下文保存于内核栈 | 用户栈(全局变量) |
通信 | 共享内存… | 信号量… | 共享变量 |
- 调度方式:进程和线程是由操作系统进行调度的,并且在切换时会涉及到上下文切换的开销。而协程的调度是由用户代码控制的,不需要操作系统介入,因此切换开销较小。也就是说:进程、线程切换过程是:用户态-内核态-用户态;而协程只有用户态。
- 切换时机:进程、线程根据操作系统自己的切换策略,用户不感知,而协程在什么时候切换是由用户(程序)自己决定。
- 资源消耗:进程和线程上下文切换时,会将上下文内容保存于内核栈中;而协程将上下文保存于用户栈中(一个全局变量)。
- 通信方式:进程和线程之间的通信和数据共享较为复杂,需要使用特殊的机制(进程:共享内存、消息队列…;线程:信号量、互斥锁…)。而协程可以通过直接调用函数、共享变量等简单的方式进行通信和数据共享。
- 运行机制区别:线程和进程是同步机制,而协程是异步机制。
总的来说,协程是一种更轻量、更灵活的并发编程方式,适用于需要高效利用计算资源、处理大量并发任务但又不需要真正的并行执行的场景。
一个“蝇量级” C 语言协程库 | 酷 壳 - CoolShell