FreeRTOS学习笔记2: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时,代表所对应的优先级列表有任务存在。任务调度器总是在所有处于就绪列表任务中选择具有最高优先级的任务来执行。
相关文章:
FreeRTOS学习笔记2:FreeRTOS的基础知识
1.FreeRTOS介绍 FreeRTOS是一个免费的嵌入式实时操作系统,同时它在市面上也是一款主流的操作系统,是工作上必不可少的技能。它具有以下六种特点: 1.免费开源:在商业产品中使用,无潜在商业风险,无需担心。 2…...
计算机网络之计算机网络的分类
计算机网络可以根据不同的角度进行分类,以下是几种常见的分类方式: 1. 按照规模和范围: 局域网(LAN,Local Area Network):覆盖较小范围(例如一个建筑物或校园)…...
从理论到实践:Linux 进程替换与 exec 系列函数
个人主页:chian-ocean 文章专栏-Linux 前言: 在Linux中,进程替换(Process Substitution)是一个非常强大的特性,它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…...
Flutter常用Widget小部件
小部件Widget是一个类,按照继承方式,分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件:lib/app/app.dart。 import package:flutter/material.dart;class App exte…...
微信小程序实战0 设置
1.调节模拟器到右侧位置 2.设置编辑页面的字体和行距。...
2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存
一、DouyinLiveRecorder软件介绍(文末提供下载) 官方地址:GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具,基于FFmpeg实现多平台直播源录制,支持自定义配置录制…...
使用 postman 测试思源笔记接口
思源笔记 API 权鉴 官方文档-中文:https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图: 对应的xxx,在软件中查看 如上图:在每次发送 API 请求时,需要在 Header 中添加 以下键值对&a…...
当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例
目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…...
阿里最新普通x231 逆向分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向前言 12月份的时候更新了过一次…...
php的使用及storm环境部署
php语法 环境搭建:在小皮中新建网站,注意先填写域名再点击选择根目录。 成功创建网站后,打开发现forbidden,因为新建的网站里是空的,需要新建index.php文件----> 在Phpstorm中左上角打开文件,打开那个文…...
高可用 Keepalived 服务部署流程
一、配置文件 vim /etc/keepalived/keepalived.confGLOBAL CONFIGURATION --- 全局配置部分VRRPD CONFIGURATION --- VRRP协议配置部分LVS CONFIGURATION --- LVS服务管理配置部分[rootlb01 ~]# cat /etc/keepalived/keepalived.…...
【新春特辑】2025年1月科技浪潮中的AI最新时事与科技趋势
2025年1月科技浪潮中的AI最新时事与科技趋势 一、AI科技时事 人工智能代理(AI Agent)的发展 最新进展:人工智能代理正逐步成为科技领域的新热点。这些代理能够自主执行特定任务,如管理日程、回复邮件等。然而,它们仍…...
解决Django非ORM模型提示初始化request问题
提问 Django在DRF时候自定义显示一些非model的字段提示TypeError: Field.__init__() got an unexpected keyword argument request 解答1 错误提示 TypeError: Field.__init__() got an unexpected keyword argument request 显示在创建序列化器实例时,传递了一个…...
G. XOUR
题目链接:Problem - G - Codeforces 题目大意:给你一个n长的序列, 其中你可以将a[i] XOR a[j] 的值 严格小于4的数对进行交换。 你可以操作任何几次, 让最后的数列最小。如果在 x 和 y 不同的第一个位置, xi<yi &…...
有没有个性化的UML图例
绿萝小绿萝 (53****338) 2012-05-10 11:55:45 各位大虾,有没有个性化的UML图例 绿萝小绿萝 (53****338) 2012-05-10 11:56:03 例如部署图或时序图的图例 潘加宇 (35***47) 2012-05-10 12:24:31 "个性化"指的是? 你的意思使用你自己的图标&…...
【RAG】SKLearnVectorStore 避免使用gpt4all会connection err
gpt4all 列表中包含了多个开源的大模型,如 Qwen2.5、Llama 3、DeepSeek、Mistral 等,但 不包含 OpenAI 的 GPT-4o。GPT-4o 是 OpenAI 提供的闭源模型,目前只能通过 OpenAI API 或 ChatGPT 官方应用(网页版、移动端)访问,并不支持本地运行,也没有 GGUF 量化格式的模型文件…...
vue框架技术相关概述以及前端框架整合
vue框架技术概述及前端框架整合 1 node.js 介绍:什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。 作用 1 运行java需要安装JDK,而Node.js是JavaScript的运行环…...
Spring Boot + Facade Pattern : 通过统一接口简化多模块业务
文章目录 Pre概述在编程中,外观模式是如何工作的?外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…...
牛客周赛 Round 78
题目目录 A-时间表查询!解题思路参考代码 B-一起做很甜的梦!解题思路参考代码 C-翻之解题思路参考代码 D-乘之解题思路参考代码 E-在树上游玩解题思路参考代码 A-时间表查询! \hspace{15pt} 今天是2025年1月25日,今年的六场牛客寒…...
【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类
一、贝叶斯原理 贝叶斯算法是基于贝叶斯公式的,其公式为: 其中叫做先验概率,叫做条件概率,叫做观察概率,叫做后验概率,也是我们求解的结果,通过比较后验概率的大小,将后验概率最大的…...
VSCode光标主题定制指南:从颜色令牌到扩展开发
1. 项目概述:一个为开发者定制的光标主题集合如果你和我一样,每天有超过8小时的时间都泡在代码编辑器里,那么你一定会对编辑器里那个千篇一律的、闪烁的竖线光标感到审美疲劳。warrenwoodhouse/cursors这个项目,就是来解决这个“小…...
手把手教你给STM32MP157开发板接上HDMI显示器(基于Sii9022A芯片与设备树配置)
STM32MP157开发板HDMI显示实战:从硬件连接到设备树配置全解析 引言 当你第一次拿到STM32MP157开发板时,最令人兴奋的莫过于看到图形界面在屏幕上亮起的那一刻。但现实往往很骨感——手头可能没有配套的LCD屏幕,而HDMI显示器却是大多数开发者桌…...
终极指南:如何在Mac上免费备份和导出微信聊天记录
终极指南:如何在Mac上免费备份和导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼?或是需要…...
开源银行API模拟器Bankr Buddy:金融科技开发的本地化测试解决方案
1. 项目概述:一个为开发者准备的银行API模拟器如果你正在开发一个需要与银行账户数据打交道的应用,无论是个人财务管理工具、预算分析软件,还是企业级的财务聚合服务,你肯定遇到过同一个难题:如何在不触碰真实用户敏感…...
Emacs AI编程助手:ai-code-interface.el深度集成指南
1. 项目概述:一个为Emacs注入AI灵魂的代码接口如果你是一位Emacs的深度用户,同时又对AI辅助编程抱有极大的热情,那么你很可能已经厌倦了在浏览器、终端和编辑器之间反复横跳的割裂体验。tninja/ai-code-interface.el这个项目,正是…...
用51单片机和HC-SR04超声波模块DIY一个倒车雷达(附完整代码和立创EDA原理图)
51单片机与HC-SR04超声波模块实战:打造高精度倒车雷达系统 在汽车电子和智能硬件领域,倒车雷达作为基础安全装置,其DIY实现不仅能帮助理解超声波测距原理,更是掌握嵌入式系统开发的绝佳实践。本文将手把手教你使用经典的STC89C52单…...
Go语言SDK开发实战:为AI编程助手Cursor构建高效API客户端
1. 项目概述:一个为AI编程助手Cursor定制的Go语言SDK如果你和我一样,日常重度依赖Cursor这类AI编程助手来提升开发效率,同时又是个Go语言的忠实拥趸,那你肯定遇到过这样的场景:想用Go写个脚本,自动化处理一…...
多智能体强化学习环境PettingZoo:从核心概念到工程实践
1. 项目概述:从零理解PettingZoo如果你正在寻找一个能让你快速上手、高效构建多智能体强化学习(Multi-Agent Reinforcement Learning, MARL)实验环境的工具,那么Farama Foundation旗下的PettingZoo项目,绝对是你绕不开…...
基于Vanilla JS与IndexedDB构建本地化Markdown笔记工具
1. 项目概述:从零开始构建一个轻量级笔记工具最近在整理个人知识库时,发现市面上的笔记软件要么功能过于臃肿,要么云端同步存在隐私顾虑,要么就是定制化程度不够。作为一个有十多年开发经验的从业者,我决定自己动手&am…...
手把手教你用SystemVerilog Interface搭建一个可复用的DMA寄存器验证环境
基于SystemVerilog Interface构建模块化DMA验证环境的工程实践 在数字IC验证领域,DMA(直接内存访问)控制器作为关键IP核,其寄存器验证环境的搭建效率直接影响项目进度。传统验证方法中信号连接冗长、时序控制分散的问题ÿ…...







