微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)

本文主要是介绍微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客

系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客

系列三:微型操作系统内核源码详解系列三(0):空间存储及内存管理篇(前置篇)-CSDN博客

                微型操作系统内核源码详解系列三(1):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(2):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(3):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(4):arm架构篇-CSDN博客

                微型操作系统内核源码详解系列三(5):进程与线程-CSDN博客

系列四:

 ​​​​​微型操作系统内核源码详解系列四(1):操作系统调度算法(linux0.11版本内核)-CSDN博客

微型操作系统内核源码详解系列四(2):操作系统调度算法(rt-thread内核)-CSDN博客

微型操作系统内核源码详解系列四(3):操作系统调度算法(FreeRTOS内核篇上)-CSDN博客

微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)-CSDN博客

从前面几篇博客我们学习到了几种不同操作系统的调度算法,其实这些调度算法的核心思想都是可以互相联系的。

下面笔者讲解FreeRTOS根据arm架构指令优化的方法:

其实它跟RTT的图标法思想是类似的,但是对过程进行了简化。

这是另一种选择算法:

让我们先看一下这个指令__clz,这个指令会计算从最高位到第一个1之间的0的个数。参考文章:arm clz指令c语言,协处理器及其他指令之:零计数指令CLZ-CSDN博客

#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )  uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) )

让我们回忆一下,在RTT内核篇,为了得到第一个1的位置,我们使用了图表法,计算8个位所有出现情况,根据每个不同的数字,我们利用函数算出来了它对应的第一个1在哪里,这样,我们只要把这个数字作为下标,就能以o(1)的时间复杂度找出来这个数字对应的最高优先级是什么。

这种算法的缺点是,空间资源消耗过大。

现在我们有了这个指令clz,所以我们可以很方便的计算位图中1之前的0的个数,而不用去图表中查找。

先看这个函数:

#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )  

 ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

它被宏定义为taskRECORD_READY_PRIORITY函数,这其实就是根据就绪任务的优先级,把变量uxTopReadyPriority相关的位置1,与上一篇的通用算法对任务的处理类似,每一个任务被添加到就绪列表时,它对应的位置1,进行延时等其他放弃cpu使用权的活动时,它被移除就绪列表,对应的位置0;这两种算法,一个是更新最高优先级的数字,另一个则是更新对应的位,其实这两个之间有一点细微的差别,就是在移除就绪列表的任务时通用算法不用更新,而指令算法要更新,至于原因,笔者已经在上一篇写了。

对应的函数:

当然,实际上是要确认这个优先级对应的链表是否含有多个任务的,为了方便讲解,笔者默认每个优先级只有一个任务。

现在让我们来到taskSELECT_HIGHEST_PRIORITY_TASK函数:

上面已经讲解过了portGET_HIGHEST_PRIORITY函数,我们通过这个指令获得了最高优先级任务的数字,configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 );同理,是断言,用来调试,判断这个链表的长度是否大于0,也就是是否有任务,如果没有,那么这个判断的真值就是0,就会触发这个断言。

listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) );

同理,当获取最高优先级,判断优先级上面有任务时,就会把pxCurrentTCB的值更新,它代表下一个要被切换的任务,将会在pendsv中断中完成上下文切换。

综上,FreeRTOS的调度算法算是讲完了,笔者花费众多篇幅将调度器的框架抽象出来,如果读者能够理解FreeRTOS内核的本质其实就是一个调度器的话,那么其实已经差不多理解实时操作系统的核心了。顺着这个主干,那些枝叶都是能够衍生出来的,这也就是为什么笔者要从入口一路切入到调度算法的原因,其他的部分笔者会在之后的篇章陆陆续续更新,不过笔者太懒了,也可能某天就断更了  ʅ(´◔౪◔)ʃ

这篇关于微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059855

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos