RTOS学习笔记(一):FreeRTOS简介

1.裸机与RTOS介绍

裸机:简单来讲,裸机的首要特点就是没有操作系统。裸机又称为前后台系统,所谓的前台系统指的是中断服务函数,而后台系统则指的是大循环,也就是应用程序。

RTOS学习笔记(一):FreeRTOS简介_第1张图片

RTOS: Real Time Operation System,  实时操作系统。RTOS中的任务可以分为低优先级任务和高优先级任务,低优先级任务在运行过程中可以被高优先级任务打断,而高优先级任务自然可以被更高优先级的任务打断,即使是最高优先级的任务也会被中断服务程序打断。

RTOS学习笔记(一):FreeRTOS简介_第2张图片

相比于裸机,RTOS的优势在于什么呢?

裸机在执行完当前任务后才能够执行下一个任务,RTOS虽然在同一时刻也只能做一项任务,。也就是说,裸机的实时性差,应用程序只能轮流执行,当裸机使用延时函数时,CPU无法执行其它代码,由于裸机实现功能都放在while代码中,所以其结构也比较臃肿。从RTOS的名字也可以看出,RTOS强调的是实时性,每个任务都是一个无限循环。RTOS的延时函数可以用于任务调度,充分利用了CPU的资源,且每个任务都有一个单独的栈空间,这就确保了每次执行完高优先级的任务,都会从之前的打断点开始,继续执行任务。要注意的是,中断能够打断任意任务。

2. FreeRTOS

2.1 FreeRTOS简介

从字面很容易理解,FreeRTOS是一个免费的嵌入式实时操作系统。除了免费之外,稳定性和安全性也是FreeRTOS的亮点之一。此外,FreeRTOS可以裁剪,其核心代码只有9000行,被3个.c文件所包含。在优先级方面,任务的优先级分配没有什么限制,并且多任务可以在同一个优先级,其实时任务数量在软件方面也没有限制。支持抢占式、协程式、时间片流转任务调度。

FreeRTOS官网

2.2 FreeRTOS基础知识

2.2.1任务调度

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。

FreeRTOS共支持三种调度任务:

- 抢占式调度:主要是针对优先级不同的任务,根据任务优先级的不同,调度任务。

- 时间片调度:主要是针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一个系统时钟节拍到的时候切换任务。
- 协程式调度:当前执行任务将会一直执行,同时高优先级的任务不会抢占低优先级任务,但是FreeRTOS官方表示不会再继续更新协程式调度。

抢占式调度

RTOS学习笔记(一):FreeRTOS简介_第3张图片

图中的运行过程为:

  1. Task1在运行中,当Task2就绪时,在抢占式调度器的作用下Task2会抢占Task1的运行
  2. Task2在运行中,当Task3就绪时,在抢占式调度器的作用下Task3会抢占Task2的运行
  3. Task3在运行中,当Task3阻塞(系统延时或等待信号量等)时,此时就绪态中,优先级最高的任务Task2执行。
  4. Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占Task2的运行

抢占式调度的特点可以总结为以下三项:

  • 高优先级任务,优先执行
  • 高优先级任务不停止,低优先级任务无法执行
  • 被抢占的任务将会进入就绪态
时间片调度

同等优先级任务轮流地享有相同的 CPU 时间(可设置), 叫时间片,在FreeRTOS中,一个时间片就等于SysTick 中断周期

RTOS学习笔记(一):FreeRTOS简介_第4张图片

图中的运行过程如下:

  1. Task1运行完一个时间片后,切换至Task2运行。
  2. Task2运行完一个时间片后,切换至Task3运行。
  3. Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1。
  4. Task1运行完一个时间片后,切换至Task2运行。

抢占式调度的特点可以总结为以下三项:

  • 同等优先级任务,轮流执行,时间片流转
  • 一个时间片大小取决为滴答定时器中断周期
  • 注意没有用完的时间片不会再使用,下一次的任务还是会按照整个时间片的时钟节拍运行

2.1.2任务状态

FreeRTOS任务共存在4种任务状态:

  1. 运行态:正在执行的任务就处于运行态,在STM32中,同一时间仅有一个任务处于运行态
  2. 就绪态:如果该任务已经能够被执行,但当前还未被执行,则称该任务目前处于就绪态。
  3. 阻塞态如果一个任务因延时或等待外部事件发生,那么这个任务就处于就绪态。
  4. 挂起态:类似于暂停,可以通过调用函数`vTaskSuspend()`进入挂起态,当需要解挂时,可以通过调用函数`vTaskResume()`解挂。

四种状态之间的转换如下图所示:

RTOS学习笔记(一):FreeRTOS简介_第5张图片

只有就绪态可以转变为运行态,当其他状态的任务想要运行时,必须先转换为就绪态。

任务状态列表

在FreeRTOS的四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。

  • 就绪列表:pxReadyTaskLists[x],其中x代表优先级数值。相同优先级的任务会连接在同一个就绪列表上。
  • 阻塞列表:pxDelayedTaskList
  • 挂起列表:xSuspendedTaskList

调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。

你可能感兴趣的:(RTOS,学习,笔记)