FreeRTOS任务调度主要变量

2023-05-16

之前介绍的和FreeRTOS任务调度相关的数据结构即内存分配实现。xLIST、heap_4、TCB结构体。任务调度就是基于这些结构体实现。这次介绍调度相关的主要变量。

代码在FreeRTOSMini.c文件签名部分。

//当前的任务序号,生成任务唯一号
PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = (UBaseType_t)0U;

//当前执行任务的tcb
PRIVILEGED_DATA TCB_t* volatile pxCurrentTCB = NULL;

//就绪任务列表
//定义优先级个数的就绪任务列表数组。每个优先级可以维持一个任务List
PRIVILEGED_DATA static List_t pxReadyTasksLists[configMAX_PRIORITIES];

//两个延迟列表轮流着用,系统tick溢出了就调换延迟列表
//用两个延迟列表来解决延迟定时器溢出问题。如果延迟计算后的tick小于当前系统tick,那么就延时到溢出了,这时候延时任务就加入延迟溢出列表
//延迟任务列表1
PRIVILEGED_DATA static List_t xDelayedTaskList1;                         
//延迟任务列表2
PRIVILEGED_DATA static List_t xDelayedTaskList2;                         
//延迟任务列表的指针
PRIVILEGED_DATA static List_t* volatile pxDelayedTaskList;              
//延迟超时任务列表的指针
PRIVILEGED_DATA static List_t* volatile pxOverflowDelayedTaskList;      
//调度程序挂起时已准备好的任务,当调度器恢复时,它们将被移动到就绪列表中。
PRIVILEGED_DATA static List_t xPendingReadyList;

//系统节拍计数
PRIVILEGED_DATA static volatile TickType_t xTickCount = (TickType_t)0;

//下一个出块时间
//在调度程序启动之前初始化为 portMAX_DELAY。
PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = (TickType_t)0U;

//任务是否被挂起
PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = (UBaseType_t)pdFALSE;

//调度器是否挂起
PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE;

//是否要执行上下文切换
PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE;

//延迟的节拍数
PRIVILEGED_DATA static volatile TickType_t xPendedTicks = (TickType_t)0U;

//系统任务数
PRIVILEGED_DATA static UBaseType_t uxTaskNumber = (UBaseType_t)0U;

//溢出的节拍次数
PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = (BaseType_t)0;

//空闲任务句柄
PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL;

//最高的就行任务的优先级
PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;

//最高的任务优先级
const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U;

uxCurrentNumberOfTasks是无符号long类型,每创建一个任务就把该私有变量加1,把这个数字设置到创建的任务的TCB里,作为任务唯一号,该变量就是记录唯一号增加的用处。

pxCurrentTCB很重要,该变量存当前运行的任务的TCB,调度任务就是在systick中断判断是否需要换任务运行。如果需要切换任务,那么触发PendSV中断。在PendSV中断函数里先按pxCurrentTCB的栈顶指针压栈保存上下文,然后调用切换任务逻辑,切换任务逻辑按优先级找到要运行的TCB设置到pxCurrentTCB。然后按pxCurrentTCB出栈寄存器值恢复pxCurrentTCB指向的新TCB的上下文,退出PendSV后按新上下文执行切换后的新任务。都是通过pxCurrentTCB变量。

pxReadyTasksLists是优先级个数的xLIST数组。该数组可以保存每个优先级的对应列表。创建任务时候就把创建的任务加入对应优先级位置的就绪列表上。优先级对应pxReadyTasksLists的数组索引,具体TCB的xStateListItem状态列表项挂接到对应位置列表中。调度时候也是按最高优先级往低优先级任务调度执行。相同优先级的任务轮流共享时间片。高优先级任务可以抢占低优先级任务时间片。

xDelayedTaskList1和xDelayedTaskList2用了存调用vTaskDelay进行延时的任务。按解除时间排序。为什么需要两个列表来存延迟任务。因为延时后的解块时间是按OS当前系统节拍xTickCount加上调用延迟函数延迟的节拍数(都是以系统节拍数为参考),既然系统节拍数是个整数,那么总有溢出的时候,溢出后又从0开始。如果一个任务调用延时函数延迟10个节拍。没溢出的情况下该任务解除延时节拍应该在xTickCount+10。如果xTickCount+10>xTickCount那么没溢出,该任务放入没溢出的延迟列表。如果xTickCount+10<xTickCount那么解块时候OS节拍溢出了。对于这些任务该方法溢出延迟列表。OS节拍执行到xTickCount=0时候对调xDelayedTaskList1和xDelayedTaskList2列表。这样就完美解决了溢出问题。pxDelayedTaskList和pxOverflowDelayedTaskList指针正好来回在xDelayedTaskList1和xDelayedTaskList2对调。

xPendingReadyList我目前还没使用。

xTickCount是系统节拍数,每次Systick中断都给该值加一。代表整个系统时钟节拍,延迟到期解除都依据系统节拍计数。

xNextTaskUnblockTime记录最近解除延时的系统节拍。有任务调用延时函数时候都计算更新该值。延迟列表变动时候就把下次最近出块时间算好,避免每次从整个延迟列表计算出块时间,减少性能开销用的。

uxSchedulerSuspended标志调度器是否被挂起。

xSchedulerRunning标志任务调度器是否在运行。

xYieldPending是否要执行上下文切换。在程序中主动设置该变量让OS任务调度进行任务切换。其他切换是按时间片和任务优先级切换。该变量进行主动切换。

uxTaskNumber记录系统的任务数量。

xNumOfOverflows记录溢出的节拍数,目前我还没用到。

xIdleTaskHandle空闲任务句柄,执行空闲任务的TCB。没有任务时候就调用该句柄。

uxTopReadyPriority记录运行最高任务优先级。把要运行的最高优先级记录在该变量。防止每次遍历整个就绪任务数组导致开销大。任务调度后及时更新该变量的值。

uxTopUsedPriority记录创建和使用的最高优先级任务。比该位置高的优先级数组就不需要检查了,减少调度开销。

这些就是任务调度要用到的主要变量,创建任务和调度任务都会用到这些变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS任务调度主要变量 的相关文章

  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS内核配置说明---FreeRTOS Kernel V10.2.1

    FreeRTOS内核是高度可定制的 使用配置文件FreeRTOSConfig h进行定制 每个FreeRTOS应用都必须包含这个头文件 用户根据实际应用来裁剪定制FreeRTOS内核 这个配置文件是针对用户程序的 而非内核 因此配置文件一般
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • 一文教你学会keil软件仿真

    仿真在我们调试代码中是非常重要的 通过仿真 我们可以快速定位到错误代码 或者错误逻辑的地方 这里我就以上一篇博客为例 教大家如何软件仿真 软件仿真不需要单片机 直接通过keil软件进行代码调试 一 打开工具 二 选择软件仿真 三 开始仿真
  • Freertos中vTaskDelay()是怎么用的

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • freertos————互斥锁

    线程安全 多线程程序处于一个多变的环境 可访问的全局变量和堆数据随时可能被其他的线程改变 多个线程同时访问一个共享数据 可能造成严重的后果 出现问题的是之前移植了一个freemodbus的从站 多个任务访问全局变量保持寄存器区 导致最后读出
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 车辆检测--DAVE: A Unified Framework for Fast Vehicle Detection and Annotation

    DAVE A Unified Framework for Fast Vehicle Detection and Annotation ECCV2016 本文使用深度学习进行车辆检测和属性学习 提出的系统为 Detection and Ann
  • 对抗学习用于目标检测--A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection

    A Fast RCNN Hard Positive Generation via Adversary for Object Detection CVPR 2017 Caffe code https github com xiaolonw a
  • 人脸识别--SphereFace: Deep Hypersphere Embedding for Face Recognition

    SphereFace Deep Hypersphere Embedding for Face Recognition CVPR2017 https github com wy1iu sphereface pytorch https gith
  • 运动相机检测无人机-- Detecting Flying Objects using a Single Moving Camera

    Detecting Flying Objects using a Single Moving Camera PAMI 2017 http cvlab epfl ch research unmanned detection https dri
  • [转载]Python SMTP发送邮件-smtplib模块

    在进入正题之前 xff0c 我们需要对一些基本内容有所了解 xff1a 常用的电子邮件协议有SMTP POP3 IMAP4 xff0c 它们都隶属于TCP IP协议簇 xff0c 默认状态下 xff0c 分别通过TCP端口25 110和14
  • c语言和c++有什么区别

    差不多是win98跟winXP的关系 C 43 43 是在C的基础上增加了新的理论 xff0c 玩出了新的花样 所以叫C加加 C是一个结构化语言 xff0c 它的重点在于算法和数据结构 C程序的设计首要考虑的是如何通过一个过程 xff0c
  • 梳理LVM逻辑卷管理,

    在Linux操作系统会时不时碰到卷有关的操作 xff0c 以下也是罗列了相关操作内容 xff0c 仅供参考 创建PV VG LV的方法 将各物理磁盘或分区的系统类型设为Linux LVM xff0c 其system ID为8e xff0c
  • 使用sqlyog连接 Mysql 出现1251错误

    使用sqlyog连接 Mysql 出现1251错误 简述 xff1a 1251 client does not support authentication protocol requested by server consider upg
  • 准备给ubuntu18.04安装杀毒软件

    如题 xff0c 电脑最近总出现些奇奇怪怪的小问题 xff0c 还是得装个杀毒软件 xff0c 看是不是中病毒了 输入sudo apt get install clamtk 安装完成后 xff0c 输入clamtk 即可 xff0e 卸载方
  • 使用Nginx代理地址

    DotNetCore在Linux发布时候 xff0c 由于不止一个产品组发布网站 xff0c 不像以前大家都用IIS的80发布网站 那么就存在大家抢80端口的情况 xff0c 为了让大家不比加上端口为此用Nginx代理URL实现网站地址代理
  • CentOS安装Cache数据库

    适用CentOS7 6 CentOS8上安装Intersystem公司的Cache数据库 xff0c 资料基本是空白 xff0c 分享一下 首先安装解压软件unzip和libicu xff0c 最小化安装的缺 xff0c 全安装的不缺 yu
  • Cache数据库之ECP搭建

    Cache作为非关系数据库 xff0c 其强大毋庸置疑 首先其Globle结构 xff0c 直接暴露的表Globel数据 xff0c 以及提供的M语言操作Globle达到的最优查询速度 ECP xff08 企业缓存协议 xff09 更是提供
  • Sebia电泳绘图

    Sebia这仪器真是个奇葩的存在 自己仪器有图不存文件 xff0c LIS要的话还得自己按数据绘制 还有蛋白电泳 固定电泳 画不画参考线等不同要求 xff08 奇葩的很 xff09 按理这种事不属于lis范围 xff0c 无奈国内lis太卷
  • nginx代理与负载均衡

    随着谷歌浏览器不断的改变https调用websocket和非https资源的策略 xff0c 从谷歌大概70以后不允许https调用非https资源和ws的websocket 后面实现了wss解决谷歌这一策略的影响 随着谷歌到90后版本限制
  • FreeRTOS学习第一篇

    之前在STM32Nano开发板开发是基于裸机开发 xff0c 即自己在main方法写死循环 死循环轮流执行各个任务逻辑的方法 这样做直接简单 xff0c 但是不同任务有不同优先级 xff0c 对CPU响应要求不同 逻辑容易某个任务卡住了 x
  • FreeRTOS之heap4

    操作系统离不开内存管理 FreeRTOS提供了5种内存管理方法 实现在portable MemMang里heap1到heap5 每种管理方案策略不同 我采用的是比较有代表性的heap4管理方案 该模式定义了ucHeap全局数组充当堆内存池
  • FreeRTOSMini

    最近在研究实时操作系统FreeRTOS FreeRTOS作为开源的RTOS xff0c 源码规模不大 xff0c 可以供操作系统学习 xff0c 加上我的STM32 Nano开发板正好可以学习OS 借着五一放假宅家里学习 实现的FreeRT
  • 双master节点+keepalived方式部署K8s 1.18.20

    相关部署方式也挺多 xff0c 自己采用双master节点 43 单node节点方式 xff0c 并且采用keepalived部署1 18 20版本 xff0c 中间也出现过相关小问题 xff0c 但都一一处理 xff0c 记录以给需要的同
  • FreeRTOS之TCB

    FreeRTOSMini实现了最小任务调度 现在分开介绍进程调度重要部分 进程调度的基础首先是定义任务调度的数据结构 xff0c 来保存任务堆栈结构和任务状态所在状态列表 xff0c 然后就是任务的优先级唯一号等 最小Mini内核参照 Fr
  • FreeRTOS任务调度主要变量

    之前介绍的和FreeRTOS任务调度相关的数据结构即内存分配实现 xLIST heap 4 TCB结构体 任务调度就是基于这些结构体实现 这次介绍调度相关的主要变量 代码在FreeRTOSMini c文件签名部分 span class to