当前位置: 首页 > news >正文

FreeRTOS内部机制学习01(任务创建的细节以及任务调度的内部机制)

文章目录

  • 前言:首先要谢谢韦东山老师的无私奉献,让我学到了很多东西,我做这个笔记是害怕我会忘记,所以就记录了下来,希望对大家有帮助!
  • 关于寄存器
    • CPU内部的寄存器
    • 这些寄存器到底要保存一些什么?
    • 某些寄存器记录的场景
  • FreeRTOS中怎么创建任务
    • 创建任务的函数:
    • 创建任务时函数内部都干了什么?:
  • 任务的调度
    • 任务调度的基本机制
    • 任务调度的核心
    • 再深度一点任务链表调度
    • 任务调度切换做了什么?
    • 关于任务挂起以及休眠期间的行为

前言:首先要谢谢韦东山老师的无私奉献,让我学到了很多东西,我做这个笔记是害怕我会忘记,所以就记录了下来,希望对大家有帮助!

关于寄存器

关于任务的轮换以及中断恢复继续得以原来为止继续运行,一点也离不开寄存器的作用,所以想要了解任务,了解寄存器也是必不可少的!

CPU内部的寄存器

CPU内部有R0、R1、……、R15共16个寄存器
某些寄存器有特殊作用
R13,别名SP,栈寄存器,保存着栈的地址
R14,别名LR,返回地址,保存着函数的返回地址
R15,别名PC,程序计数器,也就是当期程序运行到哪了

这些寄存器到底要保存一些什么?

记录程序运行到了哪里实际上是靠PC寄存器来完成的?PC寄存器的值

函数中一般也会有着函数嵌套的使用,一个函数中还调用了另外一个函数,当这个函数运行完成后,要怎么返回到调用的地址呢?这就要靠LR来记录了!

其他寄存器也有着他们各自要记录的数据,比如R0,R1就专门用来传函数参的!

某些寄存器记录的场景

1、函数调用 2、中断处理 3、任务切换

FreeRTOS中怎么创建任务

创建任务的核心:栈、TCB结构体

创建任务的函数:

在这里插入图片描述
看到这个函数的参数中的栈的大小,我们疑惑该如何合理定义他的大小呢?这个定义的栈的内存又是从哪里来的呢?

创建任务时函数内部都干了什么?:

大小的定义:这个一般取决于我们任务重的局部变量的大小以及函数调用的深度来决定的,我们使用过程中一般都会使用动态分配,所以就不再深究了。
哪里来?
打开一个工程,我们可以从里面的heap2.c文件中看到,里面开辟了一个数组(空闲的内存),这个就是用于各个任务的栈。
在这里插入图片描述

分配好了栈后,这个栈的起始地址就会存在这个任务的TCB结构体里面的pxstack.
再根据起始地址找到PC,得以继续从原来地方继续往下运行,假如给一个任务分配好了,大概样子就会是这样:

假设这个任务被中断了,各个寄存器就会保存好当前的东西,到时候这个任务再次运行的时候就恢复,继续在上次运行到的地方继续运行!
在这里插入图片描述
创建每个任务时,都会给每个任务分配一个结构体(TCB结构体)
在这里插入图片描述
关于结构体(有删减,保留了主要的内容):

在这里插入图片描述

任务的调度

任务调度的基本机制

优先级不同
1、高优先级的任务,优先执行,可以抢占低优先级的任务
2、高优先级的任务不停止,低优先级的任务永远无法执行
3、同等优先级的任务,轮流执行:时间片轮转
状态
运行态:running
就绪态:ready
阻塞:blocked,等待某件事(时间、事件)
暂停:suspend,休息去了
怎么管理?
找到最高优先级的运行态、就绪态任务,运行它
如果大家平级,轮流执行:排队,链表前面的先运行,运行1个tick后乖乖地去链表尾部排队
谁进行调度?
TICK中断!

任务调度的核心

任务的调度的核心就是链表!!!
在每次创建任务时,都会产生一个TCB结构体,上面也有讲,每次创建任务时,里面的操作还会将这个任务的TCB结构体加入到一个链表里面。
在这里插入图片描述
循序渐进,我们可以发现里面定义了很多链表,现在我们就先来了解其中关于任务创建的链表:
在这里插入图片描述
在这里插入图片描述
相信可以从链表的英文名就可以看出,这些链表的命名与任务的状态有关系。自然而然的就知道了其中的奥妙了吧!
创建任务时会把任务的TCB放入到Ready链表中,“就绪了,准备发车!“。

再深度一点任务链表调度

在这里插入图片描述

我们首先创建两个优先级一样的任务,好了,函数就会把他们两个的TCB放入Ready链表里面,那么到底是谁先运行呢?我刚开始以为是随机的,起始不然,程序运行时,内核会逐个的从高优先级往下找,找到高优先级的就先运行
在这里插入图片描述
这里只创建了两个相同优先级的任务,这里先创建的任务1,其次再是任务2,等级都为0,那么Ready链表里面存有它们的TCB,里面会有一个“指针”寻址这位置,创建任务一时,指向任务1,创建任务2时,就指向了2了,所以这里会先找到任务2,运行了任务2再到任务1!(TCB里面有着每个任务的栈的起始地址,再根据起始地址找到PC)

任务调度切换做了什么?

精简四字概括:保留,恢复
在这里插入图片描述

关于任务挂起以及休眠期间的行为

在这里插入图片描述
Delay函数就会做出这样的行为:
在这里插入图片描述
这里delay了五个Tick:
接下来没一个Tick,系统都会去Delay链表里面看看任务的时间有没有到,如果到了,就会将Task3的TCB从Delay链表中移去,重新加入到Reeay链表中!
在这里插入图片描述

相关文章:

FreeRTOS内部机制学习01(任务创建的细节以及任务调度的内部机制)

文章目录 前言:首先要谢谢韦东山老师的无私奉献,让我学到了很多东西,我做这个笔记是害怕我会忘记,所以就记录了下来,希望对大家有帮助!关于寄存器CPU内部的寄存器这些寄存器到底要保存一些什么?…...

CANoe突然出现Trace窗口筛选项无法显示的问题

原因:和最近window的推送的补丁包有关 同事通过网上的操作,一顿操作猛如虎,卸载掉了这个插件,结果电脑文件夹无法打开和闪退。 IT的同事通过cmd命令也无法恢复。 dism /online /cleanup-image /scanhealth dism /online /cleanu…...

Linux日志-sar日志

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具,它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…...

全国计算机二级考试C语言篇3——选择题

C语言部分——C语言概述 1.程序模块化的优点 程序模块化的优点在于它可以使程序的开发、维护和复用变得更简单。下面是一些主要的优点: 降低复杂度:模块化可以将复杂的问题分解成更小的、更易管理的部分。 可维护性:模块化使得代码更易于维护…...

Python实现混合蛙跳算法

博客目录 引言 什么是混合蛙跳算法(Shuffled Frog Leaping Algorithm, SFLA)?混合蛙跳算法的应用场景为什么使用混合蛙跳算法? 混合蛙跳算法的原理 混合蛙跳算法的基本概念蛙群分组与局部搜索全局混洗与更新混合蛙跳算法的流程 …...

印度再现超级大片,豪华阵容加顶级特效

最近,印度影坛再次掀起了风潮,一部名为《毗湿奴降临》的神话大片强势登陆各大影院,上映首周票房就飙升至105亿卢比,成功占据了票房榜首的位置。之后,这部电影也在北美上映,海外市场的表现同样不俗&#xff…...

Git使用经验总结6-删除远端历史记录

删除远端的历史记录但是不影响最新的仓库内容是笔者一直想实现的功能,有两个很不错的用处: 有的历史提交不慎包含了比较敏感的信息,提交的时候没注意,过了一段时间才发现。这个时候已经有了很多新的历史提交,无法再回…...

Linux 下查找运行中的 Java 进程及 .jar 文件位置

在 Linux 环境中,有时我们需要查找正在运行的 Java 进程以及它们对应的 .jar 文件位置。本文将介绍如何使用命令行工具来实现这一目标。 前言 在 Linux 系统中,我们经常需要监控正在运行的应用程序,特别是在出现问题时,了解应用程…...

Openwrt 安装 AX210 无线网卡

安装 TTYD 我安装的是官方原版的 Openwrt,首先需要安装 YYTD 来从网页控制 Openwrt。 安装驱动 参考这个链接,跟着做。 iwlwifi-firmware-ax210 不要直接拷贝粘贴,CSDN 复制文字最后面有网站添加的信息。 lspci opkg update opkg instal…...

在VitePress中进行页面链接:最佳实践与实例

在使用VitePress构建静态网站时,页面之间的链接是必不可少的。本文将介绍如何在VitePress中正确链接页面,包括内部页面和外部非VitePress页面的链接方法,并通过实例代码进行详细解释。 一、链接VitePress内部页面 在VitePress中&#xff0c…...

Qt/C++百度地图/高德地图/天地图/腾讯地图/谷歌地图/加载绘图工具栏

一、前言说明 在地图中提供一个绘图工具栏,可以便捷的在地图上添加各种覆盖物,比如折线、多边形、矩形、圆形等,然后可以获取这些覆盖物的路径以及中心点等属性。这里有几个小插曲,比如百度地图gl版本默认不提供这个功能&#xf…...

Vue2 与 Vue3 的区别有哪些

Vue 2 和 Vue 3 在许多方面都有显著的区别,包括性能、API 设计、功能特性等。以下是它们主要的区别: 1. 响应式系统 Vue 2: 基于 Object.defineProperty: Vue 2 使用 Object.defineProperty 来实现响应式数据。这种方法在处理对象属性时有一定的局限性…...

加锁造成的线程优先级反转

优先级反转(Priority Inversion),也称优先级翻转,一般是在优先级不同的多线程环境中发生。在桌面操作系统中,线程的优先级不是太重要,因此较少见优先级反转的现象。但是,优先级反转是实时操作系统(RTOS)中一个常见的问题,特别是在采用优先级调度算法的系统中。这个问…...

【日常记录-Java】SpringBoot中使用无返回值的异步方法

Author:赵志乾 Date:2024-09-05 Declaration:All Right Reserved!!! 1. 简介 在SpringBoot中,使用Async注解可以很方便地标记一个方法为异步执行。好处是调用者无需等待这些方法完成便可继续执…...

【深度学习】多层感知机的从零开始实现与简洁实现

可以说,到现在我们才真正接触到深度网络。最简单的深度网络称为多层感知机。 多层感知机由多层神经元组成,每一层与它的上一层相连,从中接收输入;同时每一层也与它的下一层相连,影响当前层的神经元。 和以前相同&…...

4、Django Admin对自定义的计算字段进行排序

通常,Django会为模型属性字段,自动添加排序功能。当你添加计算字段时,Django不知道如何执行order_by,因此它不会在该字段上添加排序功能。 如果要在计算字段上添加排序,则必须告诉Django需要排序的内容。你可以通过在…...

rsync搭建全网备份

rsync搭建全网备份 1. 总体概述1.1 目标1.2 简易指导图1.3 涉及工具或命令1.4 环境 2. 实施2.1 配置备份服务器2.2 备份文件准备2.3 整合命令2.4 扩展功能 1. 总体概述 1.1 目标 本次搭建目标: 每天定时把服务器数据备份到备份服务器备份完成后进行校验把过期数据…...

网络安全售前入门09安全服务——安全加固服务

目录 1.服务概述 2.流程及工具 2.1服务流程 2.2服务工具 3.服务内容 ​​​​​​​4.服务方式 ​​​​​​​5.风险规避措施 ​​​​​​​6.服务输出 1.服务概述 安全加固服务是参照风险评估、等保测评、安全检查等工作的结果,基于科学的安全思维方式、长期的安全…...

【Android】GreenDao数据库的使用方式

需求 使用GreenDao数据库进行数据的存储。 介绍 GreenDao 是一个轻量级的对象关系映射(ORM)库,用于简化 Android 应用中的数据库操作。它提供了以下主要功能: 简化数据库操作:通过注解定义实体类,Green…...

搜索算法之线性搜索详细解读(附带Java代码解读)

1. 基本概念 线性搜索(Linear Search),也称为顺序搜索,是一种在列表中查找特定元素的算法。它从列表的第一个元素开始,逐个检查每个元素,直到找到目标元素或检查完所有元素。 2. 工作原理 线性搜索的操作…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...