FreeRTOS学习笔记-基于STM32(1)基础知识

一、裸机与RTOS

我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点:

1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行这个任务;

2、浪费资源。在程序delay延时的时候会进入空等待,此时CPU不执行其他代码;

3、结构臃肿。实现的功能都放在无限循环中。

RTOS(Real Time OS)实时操作系统就可以解决这些问题。RTOS有以下特点:

1、分而治之。实现的功能可以划分为多个任务;

2、任务调度。在延时函数时,不会进入空等待,而是让CPU执行其他任务;

3、抢占式。高优先级的任务可以抢占低优先级的任务;

4、任务堆栈。每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。

注意:中断可以打断任意任务;任务可以同等优先级。

二、任务调度

1、任务调度器

使用相关的调度算法来决定当前需要执行的任务

2、调度方式

①抢占式调度:

主要针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务先执行,高优先级的任务可以抢占低优先级的任务;

        注意:

        高优先级的任务优先执行;

        高优先级的任务不停止,低优先级的任务无法执行;

        被抢占的任务将进入就绪态

②时间片调度:

主要针对优先级相同的任务,优先级任务相同的时候,任务调度器在每一个系统时钟节拍到的时候切换任务,即每一个任务执行一个滴答定时器中断周期的时间,然后执行别的任务;

        注意:

        同等优先级任务会轮流执行,时间片流转;

        一个时间片大小取决于滴答定时器中断频率

        如果任务被中途打断或阻塞,没有用完的时间片不会再次使用,而是直接跳过

③协程式调度(了解即可):

一个任务执行完后才能执行另一个任务,且不能被抢占。

三、任务状态

1、FreeRTOS的任务状态

①运行态:即正在执行的任务,STM32中,同一时间只有一个任务处于运行态

②就绪态:任务已经能够被执行但还未执行;

③阻塞态:任务因延时或等待外部事件发生;

④挂起态:类似暂停,调用vTaskSuspend()进入挂起态,调用vTaskResume()解挂函数解除挂起态。

        注意:

        ①:挂起态解除后会进入就绪态;

        ②:仅就绪态才可以转变为运行态;

        ③:其他状态想要运行,必须先转变为就绪态。

2、状态之间的转换

四、状态列表

这四种状态中,除了运行态,其他三种任务状态都有对应的任务状态列表:就绪列表(pxReadyTasksList[x]);阻塞列表(pxDelayedTaskList[x]);挂起列表(xSuspendedTaskList[x])其中x代表任务优先级数值,为0~31。

而任务调度器总是在所有处于就绪列表的任务中,选择优先级最高的任务来执行,如果优先级相同,就使用时间片调度,“同时”执行同一优先级的任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505723.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的网上服装商城

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【JS】解构赋值注意点,解构赋值报错

报错代码 const 小明 { email: 6, pwd: 66 } const 小刚 { email: 9, pwd: 99 }const { email } 小明 const { email } 小刚 报错图 原因 2个常量重复,重复在同一个作用域内是不能重复的,例如大括号内{const a 1; const a 2} 小伙伴A提问 问&…

2024 年适用于电脑的十大录制屏幕软件

录制屏幕软件的设计和开发旨在让您的工作流程更轻松、更高效。这些漂亮的工具有助于为教育目的捕获图像快照或记录屏幕以与客户共享模型。无论您寻找桌面屏幕录像机的原因是什么,这里都有最好的付费和免费实用程序。该类别中我们最喜欢的一些选择是 奇客录屏助手和 …

关于阿里云oss的冗余存储类型问题

不得不说一个问题,阿里云服务方便我们的同时 ,他们的文档写的是真的差劲。 东一块,西一块的。非常不好系统的阅读,文档结构比较散。 关于阿里云oss的冗余存储类型问题,这里说一下,简直是个坑。 首页阿里…

【python】`assert`断言语句

assert是一个断言语句,用于在代码中检查某个条件是否为真。 如果条件为假,将触发AssertionError 异常,从而指示存在错误。

Windows11下载、安装和配置JDK(包含多个版本的JDK配置)

下载JDK17 下载地址 JDK_DOWNLOAD选择JDK17版本 安装JDK17 双击打开安装包 -> 选择下一步 -> 选择安装路径(注意不要安装在带有中文的路径下)->修改完路径后点击下一步->安装完成。 检验安装是否成功,打开cmd,输…

js中的任务处理机制

众所周知(不知道的话去查),js是以单线程的方式执行的,在执行的过程中,某一时刻上只能执行一个任务,也就是说,我们写好了代码后执行的时候,程序是根据代码从上到下依次排队执行,只有上一个任务执…

大模型理论基础(so-large-lm)课程笔记!

Datawhale干货 作者:辣条,Datawhale优秀学习者 前 言 在当前信息时代,大型语言模型(Large Language Models,LLMs)的发展速度和影响力日益显著。随着技术进步,我们见证了从基本的Transformer架构…

Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin

Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin 这里 Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin-CSDN博客 实现的是把原图中心区域的一片小图挖取出来放大放到下面的ImageView里面…

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自,内容并不相同:13ARPG网络游戏编程实践(十三):角色选择UI及创建面板制作(四)_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中,函数名UserHandler(是从OnMess…

JAVA *数据库连接池 * 接JDBC

一.介绍: 数据库连接池实际上就是一个 " 容器 " 当有多个拥护需要访问数据库的时候, 一个用户会打开一个数据库连接, 但是!当用户离开的时候,就会断开数据库连接,那么数据库连接就作废了,之后如果还有用户需要进行访问,需要再建立一个数据库连接......循环往复, …

web基础03-JavaScript

目录 一、JavaScript基础 1.变量 2.输出 3.变量提升 4.区块 5.JavaScript数据类型 6.查看数值类型 7.undefined和null 8.布尔值 9.和的区别 10.算数/三元/比较/逻辑/赋值运算符 11.特殊字符 12.字符串 (1)获取字符串长度 (2&am…