FreeRTOS学习笔记2:FreeRTOS的基础知识

news/2025/2/2 20:42:23 标签: STM32, FreeRTOS

1.FreeRTOS介绍

FreeRTOS是一个免费的嵌入式实时操作系统,同时它在市面上也是一款主流的操作系统,是工作上必不可少的技能。它具有以下六种特点:

1.免费开源:在商业产品中使用,无潜在商业风险,无需担心。

2.可裁剪:可以在小的芯片上使用FreeRTOS的核心代码9000行左右。

3.简单:简单易用,可移植性强。

4.优先级不限:任务优先级分配没有限制,多任务可同一优先级(软件/通用优先级上没有限制,硬件上的优先级受限于芯片的架构如STM32单片机是32位的,优先级范围只有[0-31],优先级的数字越大,优先级越高)。

5.任务不限:可创建的实时任务数量没有软件限制。

6.抢占/协程/时间片:支持抢占式,协程式,时间片流转任务调度


2.任务调度器简介

任务调度器就是使用相关的调度算法来决定当前需要执行哪个任务,FreeRTOS一共支持三种任务调度方式,分别为:

1.抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

2.时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。

3.协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务(官方已经表示不再更新协程式调度)。

2.1抢占式调度

FreeRTOS中创建了三个任务,分别是Task1、Task2、Task3,它们的优先级分别为1、2、3,优先级的数值越大,优先级越高,所以Task3的优先级越高。

运行过程如下:

1.首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行,如上图所示,Task1被Task2抢占后,会从运行态变为就绪态。

2.Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行,如上图所示,如上图所示,Task2被Task3抢占后,会从运行态变为就绪态。

3.Task3运行过程中,Task3阻塞了(系统延时(delay)或等待信号量等),此时就绪态中,优先级最高的任务Task2执行。

4.Task3阻塞解除了(延迟到了或者是接收到信号量),此时Task3恢复到就绪态中,抢占Task2的运行。

总结:

1.高优先级任务,优先执行

2.高优先级任务不停止,低优先级任务无法执行

3.被抢占的任务会进入就绪态

2.2时间片调度

同等优先级任务轮流享有相同CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片的大小由SysTick(滴答定时器)中断周期来决定。

FreeRTOS中创建了三个任务,分别是Task1、Task2、Task3,它们的优先级相同,均为1。

运行过程如下:

1.当Task1运行完一个时间片后,切换至Task2运行。

2.当Task2运行完一个时间片后,切换至Task3运行。

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

4.当Task1运行完一个时间片后,切换至Task2运行。

总结:

1.同等优先级任务,轮流执行,时间片流转。

2.一个时间片大小,取决于滴答定时器中断周期。

3.没有用完的时间片不会再使用,下次任务Task3得到执行后还是按照一个时间片的时钟节拍运行。


3.任务状态

FreeRTOS中任务共存在4种状态,分别为:

1.运行态:正在执行的任务,该任务就处于运行态,在STM32中,同一个时间只有一个任务处于运行态。

2.就绪态:如果该任务已经能被执行,但当前还未被执行,那么该任务处于就绪态,只有就绪态才会变成运行态。

3.阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。当延时结束或等待外部事件结束才能变为就绪态。

4.挂起态:类似于暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

四种任务状态之间的转换图:

总结:

1.仅就绪态可转变成运行态

2.其他状态的任务想运行,必须先转变成就绪态

3.1任务状态列表

FreeRTOS无非就四种状态,运行态,就绪态,阻塞态,挂起态,这四种状态,除了运行态,其他三种任务状态都有其对应的任务状态列表(这里的列表就是链表,数据结构的链表)。

就绪列表:pxReadyTasksLists[x],x代表任务优先级数值,软件/通用优先级上数值无限大,硬件上STM32是32位的,所以x的值为32

阻塞列表:pxDelayedTasksLists。

挂起列表:pxSuspendedTasksLists。


如果任务处于就绪态,FreeRTOS会将该任务挂到就绪列表(链表),如下图所示:

如果任务处于就阻塞态,FreeRTOS会将该任务挂到阻塞列表,任务处于挂起态,FreeRTOS会将该任务挂到挂起列表。


正在执行的任务状态为运行态,当处于运行态的任务执行结束(时间片到了/延时或等待外部事件发生),需要切换下一个任务执行,FreeRTOS就会在就绪列表中挑选优先级高的任务来执行,处于阻塞列表和挂起列表里的任务需要解除阻塞状态和解除挂起状态后成为就绪态,并且挂载到就绪列表,才会被执行。


就绪列表pxReadyTasksLists[x],x代表任务优先级数值,如果用硬件上的优先级就绪列表初始化后就有32个就绪列表(就绪链表),如下图所示:

如果创建3个任务,Task1、Task2、Task3,它们优先级分别为31,30,1。新创建的任务处于就绪态,FreeRTOS会将这3个任务按照优先级挂载到对应的就绪列表,如下图所示:

当处于运行态的任务执行完毕,FreeRTOS就会在就绪列表中选择优先级最高的Task1任务进行运行,Task1就会从就绪态转变为运行态。


如果Task1、Task2、Task3这三个任务的优先级相同,均为1,那么这三个任务会被连接到同一个就绪列表上,如下图所示:


FreeRTOS是怎么知道32个就绪列表中是否挂载有任务呢?用一个32位的变量,当就绪列表中挂载有任务时,变量对应的优先级位的bit位置一,如下图所示:

当32位的变量的某个位为1时,代表所对应的优先级列表有任务存在。任务调度器总是在所有处于就绪列表任务中选择具有最高优先级的任务来执行。


http://www.niftyadmin.cn/n/5840285.html

相关文章

NIST的 临床质量指标的简介

啥是NIST? 美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)直属美国商务部,从事物理、生物和工程方面的基础和应用研究,以及测量技术和测试方法方面的研究,提…

leetcode 2563. 统计公平数对的数目

题目如下 数据范围 显然数组长度最大可以到10的5次方n方的复杂度必然超时,阅读题目实际上就是寻找两个位置不同的数满足不等式即可(实际上i j无所谓是哪个 我们只要把位置小的想成i就行)。 按照上面的思路我们只需要排序数组然后从前往后遍历数组然后利用二分查找…

操作系统知识速记:死锁

操作系统知识速记:死锁 什么是死锁? 死锁是指两个或多个进程因争夺资源而造成的一种相互等待的状态,进程间形成循环等待,导致所有进程均无法继续执行。通常情况下,死锁的发生有以下四个必要条件: 互斥条…

Java小白入门教程:封装、继承、多态、重载、重写、抽象、接口

目录 一、封装(Encapsulation) 基本语法举例 真实实例 二、继承(Inheritance) 基本语法举例 真实实例 三、多态(Polymorphism) 基本语法举例 真实实例 四、重载(Overloading&#xff0…

蓝桥杯算法笔记|差分学习

&#xff01;前情回顾 前缀和18437蓝桥账户中心 练习代码&#xff1a; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int n,q;cin>>n>>q;int a[n];for(int i0;i<n;i){cin>>a[i];}int sum[n];sum[0]a[0];for(int …

SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?

目录 1 场景描述 1.1 用户行为转移概率矩阵概念 1.2 用户行为转移概率矩阵构建方法 (1) 数据收集

C语言怯魅——指针和数组

C语言怯魅——指针和数组 指针—— C的精华&#xff0c;也是重难点&#xff0c;很多人将C作为入门语言&#xff0c;指针往往成了新手入门编程的拦路虎。 其本质很简单&#xff0c;但由于衍生出来的用法多样&#xff0c;知晓如何以及何时使用指针并不简单。 以下是我个人的一些经…

lstm代码解析1.2

在使用 LSTM&#xff08;长短期记忆网络&#xff09;进行训练时&#xff0c;model.fit 方法的输入数据 X 和目标数据 y 的形状要求是不同的。具体来说&#xff1a; 1. 输入数据 X 的形状 LSTM 层期望输入数据 X 是三维张量&#xff0c;形状为 (samples, timesteps, features)…