FreeRtos任务调度

一.创建任务函数

  xTaskCreate(            (TaskFunction_t )start_task,           /*要执行的函数,开始任务*/(const char*    )"start_task",         /*任务名字,建议个函数名一样*/(uint16_t       )START_STK_SIZE,    (void*          )NULL,(UBaseType_t    )START_TASK_PRIO,       /*任务优先级*/(TaskHandle_t*  )&StartTask_Handler);   /*任务句柄*/

TaskHandle_t TCB结构体,保存任务的基本信息

![2024-02-19T11:57:10.png][1]

创建一个巨大的数组,用来模拟栈。r15保存函数地址,r0保存函数参数

![2024-02-19T12:14:25.png][2]

二.任务调度机制

1.优先级

在使用操作系统中的实时操作系统(RTOS)如FreeRTOS时,任务调度器负责根据任务的优先级来决定优先级最高的任务是否应该抢占当前正在执行的任务。如果优先级最高的任务需要运行,则它会中断当前任务的执行,并立即执行高优先级任务。

在FreeRTOS中,默认情况下,相同优先级的任务是按照“时间片轮转”的方式进行调度,即每个任务都会被分配一个时间片(时间片长度可以配置),当时间片用完后,调度器会将控制权转移到下一个相同优先级的任务上。这种方式确保了相同优先级的任务平等地共享系统资源。

而当有优先级更高的任务准备运行时,调度器会立即抢占当前正在执行的任务,将执行权交给高优先级任务。这种抢占式调度机制确保了高优先级任务的及时响应和执行,以满足实时性的要求。

需要注意的是,任务的优先级越高,任务被执行的频率也会越高,因此在任务的优先级设置上要慎重,以避免导致低优先级任务饥饿(Starvation)的情况发生。

在FreeRTOS中,可以使用任务API提供的函数,如vTaskPrioritySet()来设置任务的优先级,以及vTaskDelay()来实现任务延迟等操作来控制任务的调度行为。

  • 高优先级的任务,优先执行,可以抢占低优先级的任务。
  • 高优先级的任务不停止,低优先级的任务永远无法执行。
  • 同等优先级的任务,轮流执行:时间片轮转 I

2.状态

在FreeRTOS中,任务(task)可以处于不同的状态,这些状态反映了任务当前的运行状况和调度状态。常见的任务状态包括以下几种:

  1. Ready(就绪)

    • 任务已经被创建,具备运行的条件,但还未被调度执行。一般而言,当任务处于就绪状态时,它只需要等待CPU分配执行时间就可以开始运行。
  2. Running(运行)

    • 当前正在执行的任务状态。每个时刻只能有一个任务处于运行状态。
  3. Blocked(阻塞)

    • 任务由于某些原因而无法继续执行,例如等待某个事件的发生、等待定时器超时、等待信号量等。任务在阻塞状态下不会被调度执行,直到条件满足才会转为就绪状态。
  4. Suspended(挂起)

    • 任务被明确挂起,暂时停止执行。挂起的任务不会被调度执行,直到被明确恢复为止。
  5. Deleted(删除)

    • 任务已被删除,但其资源尚未被释放。任务在被删除后,其占用的资源会在内存中保留一段时间,以便RTOS后续做清理工作。

这些任务状态可以帮助开发人员了解任务当前的运行状况,有助于调试和排查问题。在FreeRTOS中,可以使用任务管理API提供的函数来获取和控制任务的状态,例如eTaskState()函数可以获取任务的当前状态,vTaskSuspend()函数可以将任务挂起,vTaskResume()函数可以恢复挂起的任务等。

3.怎么管理

在FreeRTOS中,任务调度器会根据任务的优先级来选择要运行的任务。当调度器需要选择下一个要运行的任务时,它会采取以下步骤:

  1. 首先,调度器会检查就绪态的任务中是否存在优先级更高的任务。如果有,调度器会选择优先级最高的任务,并立即切换到该任务的上下文继续执行。

  2. 如果就绪态的任务中没有优先级更高的任务,则调度器会遍历具有相同最高优先级的任务,并按照轮询的方式选择下一个要运行的任务。这样,任务会按照队列的顺序依次运行。

  3. 当一个任务被调度器选中运行后,它会被分配一个时间片(称为时间片轮转),即一定的运行时间。当时间片用完后,调度器会将控制权转移到下一个相同优先级的任务上,以保证所有平级任务都有机会运行。

  4. 如果一个任务在运行期间被阻塞或被挂起,它将不参与调度,直到改变其状态并重新进入就绪态。

需要注意的是,任务的调度行为和策略可以通过RTOS的配置选项进行调整和优化。例如,可以通过更改任务优先级、调整时间片长度、使用抢占式调度器等来满足特定的应用需求。

4.谁进行调度

![2024-02-19T14:25:05.png][3]

在FreeRTOS中,滴答定时器(tick timer)是用于触发任务调度的关键组件。滴答定时器负责以固定的时间间隔触发中断,并在中断服务例程(ISR)中调用任务调度器。

以下是执行调度函数(滴答定时器)的基本步骤:

  1. 配置滴答定时器:

    • 首先,你需要配置滴答定时器的时钟源和计数周期。这个配置通常在FreeRTOS的配置文件中进行,如FreeRTOSConfig.h
    • 确保滴答定时器的时钟源和计数周期设置合适,以满足任务调度的需求。
  2. 实现滴答定时器中断处理程序:

    • 在滴答定时器中断处理程序中,你需要调用任务调度器的函数。这个函数通常是xTaskIncrementTick()vTaskIncrementTick()
    • 该函数会在每次滴答定时器中断发生时执行,对系统的时基进行更新,并决定是否进行任务切换。
  3. 启用滴答定时器中断:

    • 在系统初始化阶段,你需要启用滴答定时器中断。
    • 这通常涉及到设置中断优先级、使能中断以及将中断处理程序(即步骤2中实现的函数)注册到中断向量表中。
  4. 启动滴答定时器:

    • 在系统初始化完成后,你需要启动滴答定时器,使其开始计数。
    • 这通常涉及到调用启动滴答定时器的函数,如xTickCountStart()vTaskStartScheduler()

一旦滴答定时器启动并配置正确,它将以设置的时间间隔进行计数,并在每次计数满时触发中断。中断处理程序中会执行任务调度器的调度函数,根据任务的优先级和调度策略来决定下一个要运行的任务。
![2024-02-19T14:30:05.png][4]

5.状态切换

![2024-02-20T11:28:16.png][5]

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

这些状态之间的转换是通过任务管理 API 函数来实现的,例如 vTaskDelay() 可以使任务从 “Running” 状态转换为 “Blocked” 状态,vTaskResume() 可以从 “Suspended” 状态恢复任务。

任务的状态转换在 FreeRTOS 中由调度器自动管理,开发人员只需根据应用程序的需要,使用适当的任务管理 API 函数进行状态转换。正确的状态转换是实现多任务应用程序的关键,它可以提供任务之间的协调和合作。

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

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

相关文章

【PX4-AutoPilot教程-TIPS】PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法

PX4控制无人机在Gazebo中飞行时由于视角跟随无人机在画面中心导致视角乱晃的解决方法 问题描述解决方法 问题描述 无人机在Gazebo中飞行时,无人机始终处于画面中央,会带着视角乱晃,在Gazebo中进行任何操作视角都无法固定。 观察Gazebo左侧Wo…

最全软件测试面试问题和回答,全文背熟不拿下offer算我输!

求职,类似于打仗,是一场挑战自己的战斗,也是一场跟用人单位的博弈,更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了:"知己知彼,百战不殆;不知彼而知己,一胜一负&a…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后,在打开localhost 成功! 2. PHPBrew(PHP版本管…

Web基础①HTTP协议

一.HTTP协议的定义 HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。 1.HTTP协议版本 (1)HTTP/0.9:已过时。只接…

C语言实现位数组(BitArray)

简介 所谓的位数组,主要是为了有效地利用内存空间而设计的一种存储数据的方式。在这种结构中一个整数在内存中用一位(1 bit)表示。这里所谓的表示就是如果整数存在,相应的二进制位就为1,否则为0。 在嵌入式裸机开发中,ram资源是…

单片机01天_stm32f407zg_创建新工程

创建“寄存器版工程” 1、创建工程文件夹 创建工程文件夹“Project”,内部包含文件夹“CMSIS”&&“USER”。 CMSIS:Cortex系列内核接口驱动文件。 USER:存放用户编写的程序文件。 “USER”文件夹内包含“Inc”&&“Src”…

陶陶摘苹果C++

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int main(){//一、分析问题//已知&#xff1a;10 个苹果到地面的高度a[10],陶陶把手伸直的时候能够达到的最大高度height//未知&#xff1a;陶陶能够摘到的苹果的数目sum。//关系&#xff…

Google:Gemini 1.5跨数百万上下文令牌解锁多模态理解技术报告(中文)

1、概述 在本报告中,我们展示了 Gemini 系列的最新模型 Gemini 1.5 Pro,这是一个计算效率极高的多模态专家混合模型,能够从数百万个上下文标记中回忆和推理细粒度信息,包括多个长文档和数小时的视频和音频。Gemini 1.5Pro 在跨模态的长上下文检索任务上实现了近乎完美的召回…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例&#xff1a;配置本地开发环境案例 Demo&#xff1a;配置本地 Solidity 环境案例代码&#xff1a;HelloWorld.sol 2.1.3 拓展案例 1&#xff1a;设置 Remix …

【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、安装…

Burp常见问题

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

2 F. Greetings(离散化+树状数组)

题目链接 F. Greetings 题意 题解 由于两个人的速度是一样的&#xff0c;所以到达终点之前两个人是不会相遇的&#xff0c;考虑一下什么情况两个人会相遇&#xff0c;其中一个人到达终点时&#xff0c;另一个人&#xff0c;终点所在地的前面&#xff0c;并且它的终点在更右边…

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配&#xff0c;Rust版的模式匹配稍后就端上来&#xff0c;各位先尝尝Java这杯老咖啡还香不香&#x1f604;。 什么是模式匹配&#xff1f; 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞&#xff0c;我们…

Unable to make field private JavacProcessingEnvironment$DiscoveredPro报错解决办法

maven项目打包报错 报错信息 Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not &q…

proxysql

这里是引用 mysql 安装 mysql-3307 mysql -P 3307 -u root -proot -h 10.211.55.8create database db1; CREATE TABLE db1.tab_20240102 (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50),age INT ); CREATE TABLE db1.tab_20240103 (id INT PRIMARY KEY,name V…

2.20总结

根据这周的学习任务在学习KMP算法和哈希算法,这两种算法主要都用于字符串&#xff0c;而且学习起来都有一定的难度&#xff0c;刚开始的时候一个视频要看好几遍才能弄懂&#xff0c;但是经过这两天的学习也有了一定的收KMP 我通过一小段简单的代码来强化我对于KMP算法的理解&a…

postgis sde表在geoserver中服务发布

文章目录 简要说明maven依赖样例代码 简要说明 利用开源工具geoserver-manager&#xff0c;对postgresql的空间表进行地图服务发布 maven依赖 <dependency><groupId>com.github.dov-vlaanderen</groupId><artifactId>geoserver-manager</artifact…

【MySQL】 多表查询与笛卡尔积深入学习

推荐一款AI网站 AI写作与AI绘画智能创作平台 - 海鲸AI | 智能AI助手&#xff0c;可以免费领取GPT3.5无限卡 在数据库操作中&#xff0c;多表查询是一项基础而重要的技能。它允许我们从多个表中检索数据&#xff0c;以便进行复杂的数据分析和报告。本文将深入探讨MySQL中的多表查…

model.train()和model.eval()两种模式的原理

1. model.train() 在使用 pytorch 构建神经网络的时候&#xff0c;训练过程中会在程序上方添加一句model.train()&#xff0c;作用是 启用 batch normalization 和 dropout 。 如果模型中有BN层&#xff08;Batch Normalization&#xff09;和 Dropout &#xff0c;需要在 训练…

3. B. Milena and Admirer(贪心、小结论、思维)

题目链接 B. Milena and Admirer 题意 给一个长度为 n n n的序列&#xff0c;我们通过操作使这个序列变成非递减序列 操作&#xff1a;对 a [ i ] a[i] a[i]&#xff0c;我们将 a [ i ] a[i] a[i]删除&#xff0c;将 a [ i ] − x 、 x a[i]-x、x a[i]−x、x插入原位置&…