第1章 初识FreeRTOS一、为何学习RTOS
- RTOS(Real Time Operation System 实时操作系统)
- 传统的单片机中,通常采用的是裸机编写。
- 对于复杂的,庞大的,多功能的项目,裸机编写就会非常困难,这时可以引入操作系统,实现项目多任务的执行。
- 常用的RTOS 有国外的FreeRTOS、μC/OS、RTX 和国内的 RT-Thread、Huawei 5. 引入RTOS对项目进行多任务的管理
- 作为嵌入式软件工程师,学习这个是必要的
二、如何学习RTOS
- 最简单的就是在别人移植好的系统之上,看看 RTOS 里面的 API 使用说明,然后调用这些 API 实现自己想要的功能即可。
- 如果是学习,只会简单的调用API,那是不可取的,我们应该深入的学习其中一款 RTOS。
- 这里有一个最有效也是最难的方法,就是阅读 RTOS 的源码,深究内核和每个组件的实现方式,这个过程枯燥且痛苦。
三、FreeRTOS特点介绍
FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括:
- FreeRTOS 的内核支持抢占式(高优先级的任务优先执行),合作式和时间片调度。
- SafeRTOS衍生自FreeRTOS,SafeRTOS 在代码完整性上相比 FreeRTOS 更胜一筹。
- 提供了一个用于低功耗的 Tickless 模式(空闲的时候,把不需要的外设和时钟关闭)。
- 系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队 列、信号量、软件定时器等等。
- 已经在超过 30 种架构的芯片上进行了移植。
- FreeRTOS-MPU支持Corex-M 系列中的 MPU 单元,如 STM32F407。
- FreeRTOS系统简单、小巧、易用,通常情况下内核占用4k-9k 字节的 空间。
- 高可移植性,代码主要C语言编写。
- 支持实时任务和协程(co-routines 也有称为合作式、协同程序,本教程 均成为协程)。
- 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号 量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
- 创新的事件组(或者事件标志)。
- 具有优先级继承特性的互斥信号量。
- 高效的软件定时器。
- 强大的跟踪执行功能。
- 堆栈溢出检测功能。
- 任务数量不限(受限于RAM)。
- 任务优先级不限。
四、为何选择FreeRTOS
- FreeRTOS版权
- 美国一个公司在2013年发布
- 市场占有率最高
- 2018年被亚马逊收购,改名AWSFreeRTOS
- FreeRTOS收费问题
- FreeRTOS(收费)
- OpenRTOS
- SaveRTOS(做了一些安全性方面,收费)

五、获取FreeRTOS资料
- 官网
www.freertos.org
获得。

- 如果想下载以往版本的可从托管网址:
https://sourceforge.net/projects/freertos/files/FreeRTOS

六、FreeRTOS编程风格
- 数据类型

- 在FreeRTOS中,int型是从来不使用的
- short是16位的,long是32位的
- 详细数据类型定义:在一个头文件:Portmacro.h中
- 变量名
- 比如 char 型变量的前缀是 c,short型变量的前缀是s,long 型变量的前缀是l,portBASE_TYPE 类型变量的前缀是x。还有其他的数据类型,比如数据结构,任务句柄,队列句柄等定义的变量名的前缀也是 x。
- 如果一个变量是无符号型的那么会有一个前缀 u,如果是一个指针变量则会有一个前缀 p。因此,当我们定义一个无符号的 char 型变量的时候会加一个 uc 前缀,当定义一个char型的指针变量的时候会有一个pc前缀。
- 函数名
- 如果是私有的函数则会加一个prv(private)的前缀。
- ①vTaskPrioritySet()函数的返回值为 void 型,在task.c 这个文件中定义。
- ②xQueueReceive()函数的返回值为 portBASE_TYPE 型,在 queue.c 这个文件中定义。
- ③vSemaphoreCreateBinary()函数的返回值为 void 型,在 semphr.h 这个文件中定义。
- 宏定义

