(学习日记)2024.03.13:UCOSIII第十五节:基于时基列表的时延操作(持续更新)

news2024/11/22 6:57:26

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.03.13

  • 二十九、UCOSIII:基于时基列表的时延操作
    • 1、配置时钟中断时间
    • 2、创建任务
    • 3、任务放置到就绪列表中,并优先级排队
    • 4、将任务插入时基列表
      • 1. 确认时延
      • 2.对任务进行排序
      • 3. 确认插入时基列表哪个成员
      • 4. 对就绪列表的操作

二十九、UCOSIII:基于时基列表的时延操作

1、配置时钟中断时间

/* 配置SysTick 10ms 中断一次 */
	OS_CPU_SysTickInit (10);

在中断触发时运行OSTimeTick()函数

/* SysTick 中断服务函数 */
void SysTick_Handler(void)
{
	OSTimeTick();
}

OSTimeTick()函数定义如下:

void  OSTimeTick (void)
{
    /* 更新时基列表 */
    OS_TickListUpdate();

    /* 任务调度 */
    OSSched();
}

很明显,系统需要10ms一个时钟周期,每一个时钟周期更新一次时基列表

2、创建任务

创建任务需要使用 OSTaskCreate()函数,这部分和之前相同,不再概述。

任务指针格式如下:

struct os_tcb {
    CPU_STK         *StkPtr;
    CPU_STK_SIZE    StkSize;

    /* 任务延时周期个数 */
    OS_TICK         TaskDelayTicks;

    /* 任务优先级 */
    OS_PRIO         Prio;

    /* 就绪列表双向链表的下一个指针 */
    OS_TCB          *NextPtr;
    /* 就绪列表双向链表的前一个指针 */
    OS_TCB          *PrevPtr;

    /* 时基列表相关字段 */
    OS_TCB          *TickNextPtr;
    OS_TCB          *TickPrevPtr;	
    OS_TICK_SPOKE   *TickSpokePtr;	

    OS_TICK         TickCtrMatch;	
    OS_TICK         TickRemain;		
};

3、任务放置到就绪列表中,并优先级排队

任务创建好之后,会放到就绪列表中,并在优先级列表对应值中设为1
上述在之前章节已整理,本次不再概述。

4、将任务插入时基列表

当任务需要延时时,使用OS_TickListInsert()函数将任务插入时基列表。

/* 将一个任务插入时基列表,根据延时时间的大小升序排列 */
void  OS_TickListInsert (OS_TCB *p_tcb,OS_TICK time)

在这里插入图片描述
时基列表OSCfg_TickWheel[]OS_CFG_TICK_WHEEL_SIZE个成员。

OS_CFG_TICK_WHEEL_SIZE的推 荐值为任务数/4,不推荐使用偶数。
如果算出来是偶数,则加1变成质数,实际上质数是一个很好的选择。

时基列表OSCfg_TickWheel[]每个成员有三个值。

typedefstruct  os_tick_spoke       OS_TICK_SPOKE;
//在μC/OS-III中,内核对象的数据类型都会用大写字母重新定义。

struct  os_tick_spoke {
    OS_TCB              *FirstPtr;
    //每个成员都包含一条单向链表, 被插入该条链表的TCB会按照延时时间做升序排列。
    //FirstPtr用于指向这条单向链表的第一个节点。
    
    OS_OBJ_QTY           NbrEntries;
    //NbrEntries表示该条单向链表当前有多少个节点。
    
    OS_OBJ_QTY           NbrEntriesMax;
    //NbrEntriesMax记录该条单向链表最多的时候有多少个节点, 在增加节点的时候会刷新,在删除节点的时候不刷新。
};

在这里插入图片描述

1. 确认时延

当任务需要插入到时基列表中时,首先需要确认需要时延几个周期,即TickRemain的值。
然后确认OSTickCtr的值,将TickRemainOSTickCtr相加得到TickCtrMatch

OSTickCtr是一个全局变量, 记录的是系统自启动以来或者自上次复位以来经过了多少个SysTick周期。
OSTickCtr的值每经过一个SysTick周期其值就加一

2.对任务进行排序

众所周知,任务随时都有可能加入到时基列表中,那么怎么能高效的将各个任务按时延长短进行排序,并快速取用呢?
答案就在TickCtrMatch这个变量上,TickCtrMatch变量是系统设计时的一个巧思妙想。
在这里插入图片描述
当一个任务需要插入时基列表中时,我们先获得TickCtrMatch值。
因为TickCtrMatch值是TickRemainOSTickCtr的和,即当前时间+时延时间,得到的值就是时延结束的绝对时间
这样就能将所有任务按照 实验结束的绝对时间 进行排序。

3. 确认插入时基列表哪个成员

TickCtrMatchOS_CFG_TICK_WHEEL_SIZE进行求余,即对成员总数进行求余,得到的数就是存放任务的下标。
这样做是为了对任务进行分类。

假如成员总数为10(但实际上应该是个质数),当前系统时间为502
50210求余得2,那么在任务时延结束绝对时间TickCtrMatch502,513,515,522的几个任务里只有502,522余数为2。我们不需要跟其他数比,只需要在余数为2的任务里找就行,这样就可以极大的减少寻找时间

同时将余数相同的任务按顺序排列,那么当系统时间为502,任务时延结束的绝对时间为522,那么之后的任务就不需要再找了,因为一定会比522大。
在这里插入图片描述

4. 对就绪列表的操作

当任务加入到时基列表中后,就需要从就绪列表中删除。
时基列表OSCfg_TickWheel[]该成员的NbrEntries加1。

当任务任务时延结束绝对时间TickCtrMatch等于系统时间OSTickCtr时就把任务加入到就绪列表,并从时基列表中删除。
时基列表OSCfg_TickWheel[]该成员的NbrEntries减1。

每个时间循环都要确定NbrEntriesMax大于等于NbrEntries

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

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

相关文章

虚拟宇宙如何重塑酒店和旅游业的未来

全球酒店业正在积极适应新兴的元宇宙,早期采用者率先推出了创新的数字解决方案。企业越来越多地采用颠覆性技术,从最初的非接触式服务和自动聊天机器人的客户服务转变为变革性的转变。随着数字环境的不断发展,世界各地的酒店业参与者正在投资…

1.python安装

1.检查是否已经安装python 打开cmd 输入 python --version查看是否有返回版本,没有返回则环境变量未设置好,或者未安装 2.下载安转python https://www.python.org/downloads/windows/ 勾选配置环境变量路径 安装成功

资深老鸟经验,性能测试-性能指标分析总结,一篇策底概全...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试指标 1、…

【微服务】分布式调度框架PowerJob使用详解

目录 一、前言 二、定时任务调度框架概述 2.1 为什么需要定时任务调度框架 2.2 定时任务调度使用场景 三、PowerJob 介绍 3.1 PowerJob 概述 3.2 PowerJob 功能特性 3.3 PowerJob 应用场景 3.4 PowerJob 与其他同类产品对比 四、PowerJob 部署 4.1 PowerJob 架构 4.…

微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应

进入下面小程序可以体验效果&#xff1a; 至于原理的话&#xff0c;解释起来毕竟麻烦&#xff0c;各位可以看源码自己分析。其实很简单&#xff0c;就算计算布局。很多网上公布的布局&#xff0c;都不能正常自适应。在下这个是完美可以的 1、WXML <view class"weui…

Flask学习(四):路由转换器

默认的路由转换器&#xff1a; string &#xff08;缺省值&#xff09; 接受任何不包含斜杠的文本int接受正整数float接受正浮点数 path类似 string&#xff0c;但可以包含斜杠uuid接受 UUID 字符串 代码示例&#xff1a; app.route(/user/<username>) def show_u…

【Jetson Nano】jetson Nano安装pytorch and torchvision

Pytorch是著名的人工智能框架&#xff0c;在部署人工智能项目的时候&#xff0c;就需要在嵌入式开发板上安装pytorch&#xff0c;下面就详解介绍关于安装pytorch的步骤 1.更换apt源 首先检查apt源是否已经是国内镜像源 输入&#xff1a; sudo apt-get update如果不是国内镜像…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

FMR-NET:一种用于弱光图像增强的快速多尺度残差网络

这是本人发表的第二篇文章&#xff0c;目前已经见刊。欢迎大家引用。 文章链接&#xff1a;FMR-Net: a fast multi-scale residual network for low-light image enhancement | Multimedia Systems (springer.com) 代码链接&#xff1a;Github CSDN 这篇文章的特色在于&…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名&#xff0c;DevEco Studio为开发者提供了自动签名方案&#xff0c;帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名&#xff0c;如果使用了需要ACL的权限&#xff0c;需采用手动方式进行签名。 自动签名 说明 使用自动签名前&#xff0c;请…

碳素光线疗法与中医

看得见的穴位碳素光线疗法 最近日本的医疗随着科学技术的发达&#xff0c;在基础研究、临床各领域取得了显著的发展。日本人的平均寿命比战前大幅延长&#xff0c;结核及其他疑难杂症、癌症等疾病也在逐渐被压制。其中&#xff0c;作为癌症的辅助疗法&#xff0c;日本癌症学会等…

【Docker】一文趣谈Docker

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

[MySQL]数据库基础

文章目录 1.连接服务器2.理解mysql3.初见数据库4.主流数据库5.服务器&#xff0c;数据库&#xff0c;表关系6.数据逻辑存储7.MySQL架构8.SQL分类9.存储引擎 1.连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h&#xff1a;指明登录部署mysql服务的主机。没有写 -h 127.0.…

Unity WebGL服务器标头的问题

目录 现象&#xff1a; 报错文本: 原因: 解决方案: 现象&#xff1a; 打包前&#xff0c;ProjectSetting 压缩选项设置为Brotli, 将打包的WebGL部署到阿里云OSS环境后&#xff0c;运行弹框提示错误. 报错文本: Unable to parse Build/WebGL.framework.js.br! This canha…

【LabVIEW FPGA入门】单周期定时循环

单周期定时循环详解 单周期定时环路是FPGA编程中最强大的结构之一。单周期定时循环中的代码更加优化&#xff0c;在FPGA上占用更少的空间&#xff0c;并且比标准While循环中的相同代码执行得更快。单周期定时环路将使能链从环路中移除&#xff0c;以节省FPGA上的空间。…

491.非递减子序列

这是一个Java程序&#xff0c;实现了一个名为Solution的类&#xff0c;该类用于查找给定整数数组中所有严格递增子序列。以下是代码的逐行注释&#xff1a; // 定义一个解决方案类 class Solution {// 初始化结果集&#xff0c;用于存储满足条件的所有严格递增子序列List<L…

第七节:Vben Admin权限-后端获取路由和菜单

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

nginx做静态代理方式

改配置文件 server {listen 8899;server_name localhost;location / {root html;index index.html index.htm;} } 生成页面代码 例子 GetMapping("createIndex")public Result createIndex() {//获取后台存储数据Result result productFeignClient.getB…

5G与SD-WAN的结合为企业网络注入新活力

5G作为SD-WAN的基础网络&#xff0c;具备超大带宽、超低延迟、海量连接能力&#xff0c;为企业各类业务场景提供了理想的支持&#xff0c;尤其对于对时延极为敏感的工业控制、互动应用、高带宽视频、大规模物联网应用等有着显著的推动作用。 通过与5G的融合&#xff0c;SD-WAN在…

Qt/C++监控推流设备推流/延迟极低/实时性极高/rtsp/rtmp推流/hls/flv/webrtc拉流/调整分辨率降低带宽

一、前言 算下来这个推流的项目作品写了有四年多了&#xff0c;最初第一个版本只有文件点播的功能&#xff0c;用的纯QTcpSocket通信实现&#xff0c;属于比较简单的功能。由于文件点播只支持文件形式的推流&#xff0c;不支持网络流或者本地设备采集&#xff0c;所以迫切需要…