1. 课程视频(375.1)
- 此教程不会讲过多理论,以动手实操为主,解决大伙学了半天 FreeRTOS 操作系统不知道干什么的问题。
为什么要学 FreeRTOS ?
- 更有钱途!!
- 只会祼机开发的单片机工程师,薪资注定不会高于会 FreeRTOS 的工程师;
- 有了 FreeRTOS 基础,对于将来学习 Linux 操作系统会更加有帮助;
如何学好 FreeRTOS ?
- 无它,多写代码,多做项目!
- 一定要把本课程里所有项目全部自己动手做一遍,加深理解。光看不练假把式!!
学习本课程前置要求
- C 语言熟练;
- 上官二号课程一定要好好学一遍,本课程依然基于上官二号。
2. FreeRTOS介绍(376.2)
什么是 FreeRTOS ?
- Free 即免费的,RTOS 的全称是 Real time operating system,中文就是实时操作系统。
- 注意:RTOS 不是指某一个确定的系统,而是指一类操作系统。比如:uc/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
FreeRTOS 是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满
足较小系统的需要。 由于 RTOS 需占用一定的系统资源(尤其是 RAM 资源),只有 μC/OS-II、
embOS、salvo、FreeRTOS 等少数实时操作系统能在小 RAM 单片机上运行。相对 μC/OS-II、embOS 等商业操作系统,FreeRTOS 操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为 10.4.4 版。
为什么选择 FreeRTOS ?
- FreeRTOS 是免费的;
- 很多半导体厂商产品的 SDK(Software Development Kit)软件开发工具包,就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带有协议栈的芯片或模块。
- 简单,因为 FreeRTOS 的文件数量很少。
FreeRTOS 资料与源码下载
- 最好的资料就是官网提供的资料!点击直达官网
祼机开发与 FreeRTOS
- 众所周知,游戏与女朋友不可兼得!
- 祼机开发:
- 玩游戏,结果女朋友生气,分手!
- 陪女朋友,无法玩游戏,抑郁症!
- FreeRTOS:
- 玩1秒游戏 – 陪1秒女朋友 – 玩1秒游戏 – 陪1秒女朋友 – 玩1秒游戏 – 陪1秒女朋友 …(累死……)
- 但 CPU 是个无情的战斗机器,可以快速在两个乃至多个任务间快速切换,并且不觉得劳累,实现二者兼顾。
- FreeRTOS 实现多任务的原理
- 严格来说 FreeRTOS 并不是实时操作系统,因为它是分时复用的。
- 系统将时间分割成很多时间片,然后轮流执行各个任务。
- 每个任务都是独立运行的,互不影响,由于切换的频率很快,就感觉像是同时运行的一样。
3. 移植FreeRTOS到上官一号平台(377.3)
手动移植
- 过程复杂且繁琐,对新手不友好。如有需要手动移植,可参照以下文章:FreeRTOS移植到STM32教程
使用CubeMX快速移植
快速移植流程
- 在 SYS 选项里,将 Debug 设为 Serial Wire ,并且将 Timebase Source 设为 TIM2 (其它定时器也行)。为何要如此配置?下文解说。
- 将 RCC 里的 HSE 设置为 Crystal/Ceramic Resonator 。
- 时钟按下图配置
- 选择 FREERTOS 选项,并将 Interface 改为 CMSIS_V1 。V1 和 V2 有啥区别?下文解释。
- 配置项目信息,并导出代码。
一些常见问题
- Timebase Source 为什么不能设置为 SysTick ?
- 裸机的时钟源默认是 SysTick,但是开启 FreeRTOS 后,FreeRTOS 会占用 SysTick (用来生成 1ms 定时,用于任务调度),所以需要需要为其他总线提供另外的时钟源。
- FreeRTOS 版本问题
- V2 的内核版本更高,功能更多,在大多数情况下 V1 版本的内核完全够用。
- FreeRTOS 各配置选项卡的解释
- Events:事件相关的创建
- Task and Queues: 任务与队列的创建
- Timers and Semaphores: 定时器和信号量的创建
- Mutexes: 互斥量的创建
- FreeRTOS Heap Usage: 用于查看堆使用情况
- config parameters: 内核参数设置,用户根据自己的实际应用来裁剪定制 FreeRTOS 内核
- Include parameters: FreeRTOS 部分函数的使能
- User Constants: 相关宏的定义,可以自建一些常量在工程中使用
- Advanced settings:高级设置
- 内核配置、函数使能的一些翻译
- 内核参数的理解内容非常多,可以参考以下文章:FreeRTOS 内核配置说明
4. (补充)模板工程打开串口(378.3)
- 打开串口1
- 打开 “Use MicroLIB”
- 添加代码(1.muban)
5. 任务的创建与删除(理论)(379.4)
1. 什么是任务?
- 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。
- 比如:
- 玩游戏、陪女朋友,都可以视为任务
- Windows 系统中的 MarkText 、谷歌浏览器、记事本,都是任务。
- 任务通常都含有 while(1) 死循环。
2. 任务创建与删除相关函数
- 任务创建与删除相关函数有如下三个:
- 任务动态创建与静态创建的区别:
- 动态创建任务的堆栈由系统分配,而静态创建任务的堆栈由用户自己传递。
- 通常情况下使用动态方式创建任务。
- xTaskCreate 函数原型
- pvTaskCode:指向任务函数的指针,任务必须实现为永不返回(即连续循环);
- pcName:任务的名字,主要是用来调试,默认情况下最大长度是16;
- pvParameters:指定的任务栈的大小;
- uxPriority:任务优先级,数值越大,优先级越大;
- pxCreatedTask:用于返回已创建任务的句柄可以被引用。
- 官方案例:
/* Task to be created. */
void vTaskCode( void * pvParameters )
{
/* The parameter value is expected to be 1 as 1 is passed in the
pvParameters value in the call to xTaskCreate() below.
configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
for( ;; )
{
/* Task code goes here. */
}
}
/* Function that creates a task. */
void vOtherFunction( void )