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版本管…

单片机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…

《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…

2.20总结

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

阿里云服务器多少钱?2024年阿里云服务器价格配置表出炉!

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

jmeter 命令行启动 动态参数化

[Jmeter命令行参数] 一、在linux中&#xff0c;使用非gui的方式执行jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应的变量进行修改&#xff0c;比较麻烦。因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 二、参数…

尚硅谷ES基础 - RESTful JSON基本概念倒排索引HTTP

RESTful & JSON REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 Web 应用程序最重要的 REST 原则是&#xff0c;客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。…

自动驾驶中之定位总结

1 前言2 典型的单个定位方式2.1 基于通信的定位方法2.1.1 GNSS 全球卫星导航系统2.1.1.1 gnss的优点与缺点2.1.1.2 gnss定位技术2.1.1.2.1 RTK定位技术2.1.1.2.2 PPP定位技术 2.1.1.2 gnss定位技术总结 2.1.2 车联网定位 2.1 基于航位推算的定位方法2.1.1 惯性测试单元定位IMU2…

Microsoft Office Visio 2007中绘制大括号

文章目录 一、Microsoft Office Visio 2007中绘制大括号 一、Microsoft Office Visio 2007中绘制大括号 在Microsoft Office Visio 2007中绘制大括号的方法如下&#xff1a; 打开Visio 2007——文件——形状——其他Visio方案——标注 此时左侧栏中出现“标注”栏&#xff0c…

代码随想录刷题笔记-Day21

1. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。…

Discuz! X收藏列表页调用封面图片详细教程

Discuz! X默认收藏列表不显示封面图&#xff0c;我们接到客户需求要开发封面图功能在帖子列表&#xff0c;这是我们整理好的详细教程&#xff0c;下载即可查看 修改后&#xff0c;显示封面的收藏列表截图&#xff1a; 详细开发教程下载地址&#xff1a;Discuz! X收藏列表页调用…

【9】知识存储

一、图数据库neo4j Neo4j是一个高性能的,NOSQL图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。单节点的服务器可承载上亿级的节点和关系&#xff0c;单节点性能不够时也可进行分布式集群部…