参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili
一、概述
1、裸机
(1)裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。
(2)裸机的特点:
①实时性很差,应用程序得依次执行。
②容易出现空等待的情况,浪费CPU资源。
③结构臃肿,所有功能的代码放在一个主循环中。

2、RTOS
(1)RTOS的全称为Real Time Operation System,即实时操作系统。
(2)常用的RTOS有国外的FreeRTOS、μC/OS、RTX和国内的RT-Thread、Huawei LiteOS和AliOS-Things等,它们有一定的相似性,只要学会其中一个,其它的实时操作系统也能很快上手,这里主要以FreeRTOS展开介绍。
(3)RTOS的特点:
①分而治之,复杂的功能可以划分为多个任务。
②有任务调度机制,增加CPU资源的利用率。
③高优先级任务可以抢占低优先级任务(任务可以同等优先级)。
④每个任务都有自己的栈空间,当任务被打断时,栈空间将保存断点的数据,当任务继续执行时从断点继续开始。
⑤为防止高优先级任务长时间占用CPU,可以令其阻塞,让出CPU资源。

二、FreeRTOS简介
1、FreeRTOS的主要特点
(1)FreeRTOS的内核支持抢占式、合作式和时间片调度。
(2)系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队列、信号量、软件定时器等等。
(3)提供了一个用于低功耗的Tickless模式(在任务空闲时,关闭其外设时钟)。
(4)FreeRTOS-MPU支持Corex-M系列中的MPU单元,如STM32F407。
(5)FreeRTOS系统简单、小巧、易用,通常情况下内核占用4k-9k字节的空间,主要用C语言进行代码的编写,具有很高的可移植性。
(6)任务数量不限(不考虑硬件的情况下),任务优先级不限(不考虑硬件的情况下)。
(7)支持实时任务和协程(即co-routines,也有称为合作式、协同程序)。
(8)任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
(9)具有堆栈溢出检测功能。
(10)具有高效的软件定时器。
2、FreeRTOS的编程风格
(1)数据类型重定义(在FreeRTOSConfig.h文件中可查看):

(2)变量名:
①char型变量的变量名前缀是c,short型变量的变量名前缀是s,long型变量的变量名前缀是l,以此类推;portBASE_TYPE 类型变量的变量名前缀是x,还有其它的数据类型,比如数据结构、任务句柄、队列句柄等定义的变量名前缀也是x。
②如果一个变量是无符号型的,那么其变量名会有一个前缀u;如果一个变量是指针变量,那么其变量名会有一个前缀p。因此,当我们定义一个无符号的char型变量的时候会加一个uc前缀,当定义一个char型的指针变量的时候会加一个pc前缀。
(3)函数名:
①如果是私有的函数,则其函数名会加一个前缀prv(private)。
②很多函数的函数名中有其定义所在文件的文件名及返回值类型,如:
[1]vTaskPrioritySet()函数的返回值为void型(前缀v),在task.c这个文件中定义。
[2]xQueueReceive()函数的返回值为portBASE TYPE型(前缀x),在queue.c这个文件中定义。
[3]vSemaphoreCreateBinary()函数的返回值为void型(前缀v),在semphr.h这文件中定义。
(4)宏的名称一般是由小写前缀和大写主体构成,其中小写前缀就是宏定义所在头文件的文件名。

除了上表列出的宏定义以外,FreeRTOS中还有如下通用的宏定义。

3、操作系统知识与FreeRTOS的关联
(1)FreeRTOS一共支持三种任务调度方式:
①抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
创建三个任务——Task1、Task2、Task3,Task1、Task2、Task3的优先级分别为1、2、3(在FreeRTOS中任务设置的数值越大,优先级越高,所以TASK3的优先级最高)
运行过程如下:
首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行,Task1进入就绪态
Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行,Task2进入就绪态
Task3运行过程中,Task3自我阻塞了(依靠系统延时或等待信号量等),此时就绪态中优先级最高的任务Task2执行
Task3的阻塞解除后(延时到了或者接收到信号量)便恢复到就绪态中,抢占TasK2的运行,Task2进入就绪态

②时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务;同等优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick(滴答定时器)中断周期。
创建三个任务——Task1、Task2、Task3,Task1、Task2、Task3的优先级均为1
运行过程如下:
首先Task1运行完一个时间片后,切换至Task2运行
Task2运行完一个时间片后,切换至Task3运行
Task3运行过程中自我阻塞了(如果还不到一个时间片,没有用完的时间片不会再使用),此时直接切换到下一个任务Task1运行
Task1运行完一个时间片后,切换至Task2运行

③协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。(了解即可)
(2)FreeRTOS中任务共存在4种状态:
①运行态:正在执行的任务处于运行态,在STM32中,同一时间仅一个任务处于运行态。
②就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
③阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。
④挂起态:类似暂停状态,调用函数vTaskSuspend()可使任务进入挂起态,需要调用解挂函数vTaskResume()任务才可以进入就绪态。

(3)运行态、就绪态、阻塞态、挂起态这四种状态中,除了运行态,其它三种任务状态的任务都有其对应的任务状态列表,如下图所示,其中就绪列表为每个优先级都建立了一个子列表,相同优先级的任务会连接在同一个就绪列表上,调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。

5002

被折叠的 条评论
为什么被折叠?



