400行程序写一个实时操作系统(十七):调度算法的实现

前言

在上一篇博客笔者介绍了操作系统中的调度算法,调度算法的本质就是选择下一个任务。

如果读者认真看了上一篇文章的内容,那么接下来讲解的Sparrow的算法应该是非常清晰易懂的。

在实时操作系统Sparrow RTOS中,我们引入了优先级的概念,就是为了使任务的运行更加具有实时性,优先级由我们手动进行调整,往往我们希望优先级高的任务优先执行,那么,该怎么做呢?

调度算法的设计

我们使用ReadyBitTable这个uint32_T类型的变量来标识就绪的任务,只要任务是就绪态的,我们就执行 ReadyBitTable |= (1 << uxPriority)操作,这样ReadyBitTable 中为1的位就表示有就绪的任务。

那么如何得到对应的优先级数字呢?这里我们可以计算从高位到低位,离最近的1有多少个0,然后用31减去这个数目,就可以得到优先级的数字了。

在arm架构中,恰好有这么一条汇编指令clz,它可以计算从高位到低位,离最近的1之间的0的数目,正好符合我们的需求。

举例如下:

就绪表clz的结果最大优先级
ReadyBitTable00000000000000000000000000000100292
ReadyBitTable00000000000000000000000100000011238

不知道读者发现没有,其实这种方法跟上一节中所讲的RTThread的算法思想是一样的,只是我们使用clz指令代替了查表法。在FreeRTOS和RT-Thread等RTOS中,其实都有使用clz指令的方法,它们跟Sparrow的算法都大差不差。

修改程序

既然我们已经知道了思路,那么让我们开始写代码:

uint32_t ReadyBitTable = 0;//添加到合适的地方即可__attribute__( ( always_inline ) ) static inline uint8_t FindHighestPriority( void )
{uint8_t TopZeroNumber;uint8_t temp;__asm volatile("clz %0, %2\n""mov %1, #31\n""sub %0, %1, %0\n":"=r" (TopZeroNumber),"=r"(temp):"r" (ReadyBitTable));return TopZeroNumber;
}void vTaskSwitchContext( void )
{pxCurrentTCB = TcbTaskTable[ FindHighestPriority()];
}

修改xTaskCreat函数,添加一行代码:

void xTaskCreate( TaskFunction_t pxTaskCode,const uint16_t usStackDepth,void * const pvParameters,//You can use it for debugginguint32_t uxPriority,TaskHandle_t * const self )
{uint32_t *topStack =NULL;TCB_t *NewTcb = (TCB_t *)heap_malloc(sizeof(TCB_t *));*self = ( TCB_t *) NewTcb;TcbTaskTable[uxPriority] = NewTcb;//NewTcb->uxPriority = uxPriority;NewTcb->pxStack = ( uint32_t *) heap_malloc( ( ( ( size_t ) usStackDepth ) * sizeof( uint32_t * ) ) );topStack =  NewTcb->pxStack + (usStackDepth - (uint32_t)1) ;topStack = ( uint32_t *) (((uint32_t)topStack) & (~((uint32_t) aligment_byte)));NewTcb->pxTopOfStack = pxPortInitialiseStack(topStack,pxTaskCode,pvParameters,self);pxCurrentTCB = NewTcb;ReadyBitTable |= (1 << uxPriority); //添加这一行
}

修改空闲任务,任务内容为进入低功耗模式:

void EnterSleepMode(void)
{SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;__WFI();
}//Task handle can be hide, but in order to debug, it must be created manually by the user
TaskHandle_t leisureTcb = NULL;void leisureTask( )
{//leisureTask content can be manually modified as neededwhile (1) {EnterSleepMode();}
}

实验

验证思路

设置一个任务的优先级为最大,观察这个任务是不是一直在执行。

程序

修改任务:

//Task Area!The user must create task handle manually because of debugging and specification
TaskHandle_t tcbTask1 = NULL;
TaskHandle_t tcbTask2 = NULL;void led_bright( )
{while (1) {}
}void led_extinguish( )
{while (1) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);HAL_Delay(500);switchTask();}
}

当然,请确保led_extinguish优先级足够大:

void APP( )
{xTaskCreate(    led_bright,128,NULL,1,&tcbTask1);xTaskCreate(    led_extinguish,128,NULL,8,&tcbTask2);
}

实验现象:

stm32f103c8t6上的led灯一直在闪烁,说明任务led_extinguish一直在执行。

总结

介绍了Sparrow的调度算法,然后编写程序实现了优先级抢占算法的设计,最后修改原先的工程对调度算法进行验证。

本次实验的文件夹的地址:skaiui2/SKRTOS_sparrow at experiment

有需要的读者可以自取。

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

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

相关文章

基础知识-因果分析-daythree-独立性检验

我们经常需要观察一个事件的发生对另一个事件的发生是否有影响。有时候&#xff0c;我们可以观察到一个事件的发生对另一个事件发生的概率有影响。比如&#xff0c;你驾车超速这个事件的发生会增加你发生交通事故的概率。但是&#xff0c;有时候我们也可以观察到&#xff0c;一…

SpringMVC6-SpringMVC的视图

目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口&#xff0c;视图的作用&#xff1a;渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图InternalResourceView 和重定…

【再谈设计模式】单例模式~唯一性的守护者

一、引言 在软件工程中&#xff0c;软件开发&#xff0c;设计模式是提高代码复用性和可维护性的有效工具。单例模式&#xff08;Singleton Pattern&#xff09;作为一种创建型设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供对该实例的全局访问。这一模式在…

Spring Boot 实现文件上传下载功能

文章目录 一、原理分析1.1 请求类型1.2 服务器解析 二、功能实现2.1 创建项目并导入依赖2.2 文件上传功能实现2.2.1 文件上传 Service2.2.2 文件上传 Controller 2.3 文件下载功能实现2.3.1 文件下载 Service2.3.2 文件下载 Controller 2.4 文件上传前端代码(可选)2.4.1 上传文…

HarmonyOS Next API12最新版 端云一体化开发-云函数篇

一、新建一个端云一体化项目 见文章&#xff1a; HarmonyOS NEXT API12最新版 端云一体化开发-创建端云一体化项目流程_鸿蒙appapi-CSDN博客 二、官方文档 使用限制-云函数 - 华为HarmonyOS开发者 (huawei.com) Cloud Foundation Kit简介-Cloud Foundation Kit&#xff0…

深度学习:SGD的缺点

首先看下述函数&#xff1a; 最小值为x0&#xff0c;y0处 先了解下它的梯度特征。了理解其梯度特征&#xff0c;我们需要计算其梯度向量。 梯度向量 ∇f 是函数 f 在每个变量方向上的偏导数组成的向量。具体来说&#xff1a; ∇f(∂f/∂x,∂f∂/y) 首先&#xff0c;我们计算 f …

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

C++游戏开发详解

C 是一种广泛使用的编程语言&#xff0c;尤其在游戏开发领域有着不可替代的地位。它提供了对底层硬件的直接访问能力&#xff0c;允许开发者优化性能&#xff0c;这对于追求高帧率和低延迟的游戏来说至关重要。本文将详细介绍使用 C 进行游戏开发的基础知识和技术要点&#xff…

Qt | windows视频播放器小项目

点击上方"蓝字"关注我们 01、前言 >>> Windows平台如果播放不了视频,记得下载编解码工具:https://www.mediaplayercodecpack.com/#google_vignette media.player.codec.pack.v4.6.0.setup.exe 下载后双击安装。 02、videowidget.pro >>> (.pro…

Android Activity SingleTop启动模式使用场景

通知栏 当用户点击通知栏中的通知时,可以使用单顶启动模式来打开对应的活动,并确保只有一个实例存在。 简单集成极光推送 创建应用 获取appkey参数 切换到极光工作台 极光sdk集成 Project 根目录的主 gradle 配置 Module 的 gradle 配置 Jpush依赖配置 配置推送必须…

ssm基于vue框架和elementui组件的手机官网+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框…

【Android】perfetto使用学习

在开发者选项中的系统跟踪里抓取的perfetto文件是保存在/data/local/traces 里的 adb pull /data/local/traces ./ 主线程中的执行是受vsync信号控制的&#xff0c;即间隔调用的 如果写一个while线程&#xff0c;一直使用cpu&#xff0c;是怎样的呢&#xff0c;这里我们来试验一…

前端vue2迁移至uni-app

1.确定文件存放位置 components: 继续沿用 pages: views内容移动到pages static: assets内容移动到static uni_modules: uni-app的插件存放位置 迁移前 src├─assets│ └─less├─components│ ├─common│ │ ├─CommentPart│ │ └─MessDetail│ ├─home│…

技术周总结 10.21~10.27周日

文章目录 一、10.24 周四 程序员节2.1&#xff09;问题01&#xff1a; Memory Analysis Tool的使用方法 二、10.27 周日2.1&#xff09; J2EE架构J2EE 的核心组件与技术J2EE 的多层架构J2EE 的优缺点J2EE 的应用场景 2.2&#xff09;web应用开发中的 "web服务器" 和 …

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代&#xff0c;社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一&#xff0c;Facebook不断致力于人工智能&#xff08;AI&#xff09;的研究与应用&#xff0c;以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…

【架构设计】《Java 架构魔法:理念与实践铸就卓越系统,架构设计需要遵循的理念及最佳实践》

标题&#xff1a;《Java 架构魔法&#xff1a;理念与实践铸就卓越系统&#xff0c;架构设计需要遵循的理念及最佳实践》 摘要&#xff1a;本文深入探讨 Java 架构设计中至关重要的核心理念与最佳实践。涵盖从关注点分离到代码复审等多个关键要点&#xff0c;详细阐述如何运用这…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会&#xff0c;视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而&#xff0c;由于不同厂家和平台之间的兼容性问题&#xff0c;视频监控系统的联网和整合面临巨大挑战。为了解决这个问题&#xff0c;国家制定了《公共安全视频监控联网系…

实现YOLO V3数据加载器:从文件系统读取图像与标签

引言 在深度学习项目中&#xff0c;数据准备是非常重要的一环。特别是在物体检测任务中&#xff0c;数据的组织和预处理直接影响到模型的训练效果。YOLO V3&#xff08;You Only Look Once Version 3&#xff09;作为一种高效的实时物体检测框架&#xff0c;其数据加载器的设计…

【网络面试篇】三次握⼿、四次挥手综述

目录 一、三次握手 1. 过程描述 2. 为什么不是四次握手&#xff1f;为什么不能两次握手&#xff1f; 二、四次挥手 1. 过程描述 2. 为什么是四次挥手&#xff1f; 一、三次握手 1. 过程描述 ① 客户端 向 服务器 发送 SYN 报文、初始化序列号 ISN&#xff08;seqx&…

JavaSet集合

无序&#xff08;指的是添加顺序和获取出的数据顺序不一致&#xff0c;不重复&#xff0c;无索引 既然Set没有索引&#xff0c;因此功能同上一篇Connection的功能&#xff0c;几乎没有额外的功能 HashSet的原理 为什么是无序&#xff08;要构建红黑树&#xff09;&#xff0…