三、初识FreeRTOS之FreeRTOS基础知识

从这节开始,我们正式学习FreeRTOS的一些基础知识,争取做到日更,或者隔日更。如果在学习的过程中哪里有理解错误,希望各位朋友批评指正。因为自己觉得图文并茂好像更容易理解一点,所以在博文中加了大量的图片,仅供参考。

本节我们主要学习以下两点,都是需要熟悉的点,第三节是总结,还是会放思维导图以供大家学习。

1,任务调度简介(熟悉)

2,任务状态(熟悉)

3,总结(掌握)

一、任务调度简介(熟悉)

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

FreeRTOS一支持三种调度方式:

  • 抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占 优先级低的任务。
  • 时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。
  • 协程式调度:但前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务,FreeRTOS虽然现在还支持,但是官方表示已经不再更新协程式调度。

1.1 抢占式调度

运行条件:

1.创建三个任务:Task1、Task2、Task3

2.Task1、Task2、Task3的有优先级分别为1、2、3;在FreeRTOS中任务优先级设置的数值越大,优先级越高,所以Task3的优先级最高。

运行过程如下:

1.首先在Task1的运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行。

2.Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行。

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

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

总结:

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

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

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

1.2 时间片调度

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

运行条件:

1.创建三个任务:Task1、Task2、Task3

2.Task1、Task2、Task3的优先级均为1;即3个任务同等优先级

运行过程如下:

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

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

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

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

总结:同等有优先级任务,轮流执行;时间片流转

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

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

二、任务状态(熟悉)

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

  • 运行态:正在执行的任务,该任务就处于运行状态,注意在STM32中,同一时间仅一个任务处于运行态
  • 就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务就处于就绪状态
  • 阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态
  • 挂起态:类似与暂停,调用函数vTaskSuspend()进入挂起状态,需要调用解挂函数vTaskResume()才可以进入就绪状态

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

总结:

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

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

FreeRTOS中无非就四种状态,运行态,就绪态,阻塞态,挂起态

这四种状态除了运行态,其它三种任务状态都有其对应的任务状态列表(该列表与数据结构中的链表相似,后续会展开说明,本节暂不列出)

 就绪列表X的取值是0-31,所以初始化之后有32个列表。

 32位的变量,当某个位,置1时,代表所对应的优先级就绪列表中有任务存在。

假设,创建三个任务分别是:task1、task2、task3,优先级分别是:1、2、3,假设将task3放在pxReadyTasksLists[3],task2放在pxReadyTasksLists[2],task1放在pxReadyTasksLists[1],此时我们的任务调度器就会从上往下进行搜寻,找变量中的某一位有没有被置1,直到找到变量被置1的任务,此时变量为1的任务,task3的优先级最高,就会将task3转为运行态,当task3进入阻塞态(就会将task3放入阻塞列表pxDelayedTaskList),或者挂起态时(将task3放入挂起列表pxSuspendedTaskList),那么在就绪列表中task3对应的那一位就会被置0,此时任务调度器继续从上往下进行搜寻,那么就会将task2转为运行态,同样的,假设task2进入阻塞态或者被挂起,那么就绪列表就只有task1,就只有task1进入运行态,除非task3阻塞时间到了,就会重新回到就绪列表,此时task3就会墙砖task1。

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

如果,task1、task2、task3的优先级均为1,那么task1、task2、task3就都会挂载到pxReadyTasksLists[1]上,因为相同优先级的任务会连接到同一个就绪列表上,此时Task1会先运行一个时间片的时间,接着切换到Task2运行一个时间片,接着运行到Task3运行一个时间片,再接着回到Task1,这样轮流执行。

三、总结

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

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

相关文章

SpringMVC之自定义注解

目录 一.JAVA注解简介 1.1.Java注解分类 1.2.JDK元注解 二.自定义注解 1.1.如何自定义注解 1.2.自定义注解的基本案例 1.2.1.案例一(获取类与方法上的注解值) 1.2.2.案例二(获取类属性上的注解属性值) 1.2.3. 案例三&#xff…

Qt: 鼠标形状设置

设置全局鼠标形状 设置完毕后,整个APP的任何窗体,包括Dialog中的鼠标形状都会被修改为设定类型,某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…

【初阶数据结构】二叉树全面知识总结

二叉树详解 树的概念及其结构树的概念树的相关概念树的表示方法孩纸兄弟表示法双亲表示法(并查集) 树的实际应用 二叉树二叉树的概念二叉树的种类二叉树的性质二叉树的存储结构 二叉树顺序结构的实现堆的概念及结构堆向上、向下调整法堆的插入堆的删除堆…

Qt-day3

1、完成文本编辑器的保存工作 //保存按钮对应的槽函数 void Widget::on_saveBtn_clicked() {QString fileName QFileDialog::getSaveFileName(this, //父组件"保存文件", //对话框标题"./", //起始路径"All(*.…

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录 1、模拟实现qsort函数 1.1、qsort函数的回顾 1.2、模拟实现qsort函数 2、指针和数组笔试题解析 2.1、一维数组 2.2、字符数组 1、模拟实现qsort函数 1.1、qsort函数的回顾 要模拟实现qsort函数,就要了解清楚qsort函数的参数以及使用方式。 我们先回顾一…

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程” (Performance engineering)是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支,其目的就是确保满足非功能性的性能需求,例如:性能、可靠性等。由于现代软件系统变…

解决谷歌Redux DevTools调试React+Typescript项目数据对不上/连接不上问题

上文 ReactTypescript项目环境中搭建并使用redux环境 我们创建了一个redux项目的环境 但是我们用谷歌浏览器插件调试 会发现 要不 匹配的数据有问题 看不到数据 要不 就压根连接不到 而且 我们点击加减号 去改变值 调试工具也没有任何反应 我们终端输入 npm install --save-d…

【2023全新保姆级教图文教程】三分钟快速安装好Anacaonda3+Pycharm运行Python

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文…

postman发送图片

POSTMAN 如何发送携带图片的请求? 闲话不叙 步骤如下: 新建一个请求,在Headers中添加一对k-v : Content-Type > multipart/form-data 请求的接口: RequestMapping("/fileUploadController")public String fileUpload(MultipartFile fil…

解密堆排序与TopK问题

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【力扣-每日一题】2560. 打家劫舍 IV

class Solution { public:bool check(vector<int> &nums,int max_num,int k){//只需要计算可以偷的房间。在满足最大值为max_num下时&#xff0c;能偷的最多的房间&#xff0c;与k值比较//如果大于K&#xff0c;说明max_num还可以缩小//如果小于看&#xff0c;说明ma…

Spring Security :二【原理解析、会话管理、RBAC中集成认证和授权、JWT】

文章目录 三、原理解析3.1 结构分析3.1 登录认证流程分析3.1.1 **UserDetailsService**3.1.2 自定义UserDetailsService3.1.3 **PasswordEncoder** 3.2 授权流程分析3.2.1 配置方式的原理解析3.2.2 注解方式原理解析 四、会话管理4.1 获取用户身份4.2 会话控制 五、 RBAC中集成…