首页 > 其他分享 >【FreeRTOS】任务调度与任务状态的介绍(二)

【FreeRTOS】任务调度与任务状态的介绍(二)

时间:2024-08-22 19:52:50浏览次数:8  
标签:Task1 Task2 Task3 优先级 FreeRTOS 任务 任务调度 运行

一、任务调度

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务
FreeRTOS 一共支持三种任务调度方式:

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

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的运行

2.时间片调度

运行条件:
1、创建三个任务:Task1、Task2、Task3
2、Task1、Task2、Task3的优先级均为1;即3个任务同等优先级
在这里插入图片描述
运行过程如下:
1、首先Task1运行完一个时间片后,切换至Task2运行
2、Task2运行完一个时间片后,切换至Task3运行
3、Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1
4、Task1运行完一个时间片后,切换至Task2运行
注意事项:
1、同等优先级任务,轮流执行;时间片流转
2、一个时间片大小,取决为滴答定时器中断周期
3、注意没有用完的时间片不会再使用,下次任务Task3得到执行
还是按照一个时间片的时钟节拍运行

二、任务状态

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

四种任务状态之间的转换图:
四种任务状态之间的转换图
总结:
1、仅就绪态可转变成运行态。
2、其他状态的任务想运行,必须先转变成就绪态。
3、FreeRTOS中无非就四种状态,运行态,就绪态、阻塞态、挂起态。这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。
就绪列表:pxReadyTasksLists[x],其中x代表任务优先级数值
阻塞列表:pxDelayedTaskList
挂起列表:xSuspendedTaskList

假设,创建三个任务分别是:task1、task2、task3,优先级分别是:1、2、3
在这里插入图片描述

标签:Task1,Task2,Task3,优先级,FreeRTOS,任务,任务调度,运行
From: https://blog.csdn.net/weixin_43882765/article/details/141435380

相关文章

  • 大模型 Agent 任务 ,如何开发一个 AI 代理?
    代理AgentAgent最初出现在强化学习任务中,智能体拥有状态空间和动作空间,每执行一个action都需要通过状态空间和激励来决定下一个action。而大模型代理使用类似的思想,利用大模型的自然语言分析能力根据当前对话梳理达到目标需要执行的策略,然后一边执行操作一边根据反馈分......
  • ThinkPHP6定时任务同步千万级流水数据
    ThinkPHP6定时任务同步千万级流水数据多数据源配置自定义指令<?phpdeclare(strict_types=1);namespaceapp\command\SyncDtaTask;usethink\console\Command;usethink\console\Input;usethink\console\Output;usethink\Exception;usethink\facade\Db;/***......
  • FreeRTOS--列表和列表项
    目录1列表(Lists)2列表项(ListItems)3使用列表和列表项4使用实例在FreeRTOS中,列表和列表项是非常重要的数据结构,用于实现任务管理和调度。以下是关于这两个概念的详细介绍:1列表(Lists)列表是FreeRTOS中的一种数据结构,用于存储任务状态的信息。主要有两种类型的......
  • Java当中有几种方式来创建线程执行任务?
    1.继承thread类publicclassyxextendsThreads{publicstaticvoidmain(String[]args)[yxthread=newyx();thread.start();}@Overridepublicvoidrun(){system.out.println("helloyx&qu......
  • .NetCore里使用定时任务BackgroundService
    原文链接:https://blog.csdn.net/x1234w4321/article/details/140797306namespaceXCGWebApp.TimerService{///<summary>///后台定时任务///</summary>publicclassTimerBackgroundService:BackgroundService{protectedoverrid......
  • FreeRTOS 快速入门(五)之信号量
    目录一、信号量的特性1、信号量跟队列的对比2、两种信号量的对比二、信号量1、二值信号量1.1二值信号量用于同步1.2二值信号量用于互斥2、计数信号量三、信号量函数1、创建2、删除3、give/take一、信号量的特性信号量(Semaphore)是一种实现任务间通信的机制,可以......
  • 仿Muduo库实现高并发服务器——任务定时器模块
    任务定时器模块TimerWheel在本项目中的简单使用:        下面这张图是channel模块,poller模块,TimerWheel模块,EventLoop模块,LoopThreadPool模块进行组合。便于大家对这个项目的理解,因为代码看起来挺复杂的。上面右下角就是定时器模块。TimerTask类的实现:usingTaskF......
  • 深入探索分布式任务调度框架:MySQL实现高效锁机制
    本文主要介绍项目中怎么使用MySQL实现分布式锁的背景假如我们现在要做一个高性能、可扩展的分布式任务调度框架,要怎么设计呢?下面是我之前自己设计的一个架构图。为了方便后续的分布式锁的设计,我们大致描述下各个角色都做了哪些事情(这不是本篇文章的重点)scheduler-c......
  • 使用PowerShell自动化Windows系统管理任务
    1.管理服务列出所有服务Get-Service启动服务Start-Service-Name"ServiceName"停止服务Stop-Service-Name"ServiceName"2.管理计划任务创建计划任务$Action=New-ScheduledTaskAction-Execute"C:\Path\To\Executable.exe"$Trigger=New-ScheduledTask......
  • python apscheduler定时任务处理
    ApschedulerApscheduler是一个基于Quartz的python定时任务框架,提供了基于日期、固定时间间隔以及corntab类型的任务,并且可持久化任务。安装apscheduler依赖库pipinstallapschedulerAPScheduler组件:schedulers-调度器triggers-触发器jobstores-作业存储器exec......