μC/OS-II---时间管理(os_time.c)

目录

  • 时间管理相关(os_time.c)
    • Task延迟
    • 按时、分、秒、毫秒延时
    • 恢复被延时的Task
    • 返回系统当前的Tick计数值
    • 设置系统的Tick计数值

在这里插入图片描述

时间管理相关(os_time.c)

Task延迟

void  OSTimeDly (INT32U ticks)
{
	INT8U      y;
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	
	if (OSIntNesting > 0u)                       /* See if trying to call from an ISR                  */
	{
		return;
	}
	
	if (OSLockNesting > 0u)                      /* See if called with scheduler locked                */
	{
		return;
	}
	
	if (ticks > 0u)                              /* 0 means no delay!                                  */
	{
		OS_ENTER_CRITICAL();
		y            =  OSTCBCur->OSTCBY;        /* Delay current task                                 */
		OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
		
		if (OSRdyTbl[y] == 0u)
		{
			OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
		}
		
		OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB                                  */
		OS_EXIT_CRITICAL();
		OS_Sched();                              /* Find next task to run!                             */
	}
}

按时、分、秒、毫秒延时

#if OS_TIME_DLY_HMSM_EN > 0u
INT8U  OSTimeDlyHMSM (INT8U   hours,
											INT8U   minutes,
											INT8U   seconds,
											INT16U  ms)
{
	INT32U ticks;
	
	if (OSIntNesting > 0u)                       /* See if trying to call from an ISR                  */
	{
		return (OS_ERR_TIME_DLY_ISR);
	}
	
	if (OSLockNesting > 0u)                      /* See if called with scheduler locked                */
	{
		return (OS_ERR_SCHED_LOCKED);
	}
	
#if OS_ARG_CHK_EN > 0u
	
	if (hours == 0u)
	{
		if (minutes == 0u)
		{
			if (seconds == 0u)
			{
				if (ms == 0u)
				{
					return (OS_ERR_TIME_ZERO_DLY);
				}
			}
		}
	}
	
	if (minutes > 59u)
	{
		return (OS_ERR_TIME_INVALID_MINUTES);    /* Validate arguments to be within range              */
	}
	
	if (seconds > 59u)
	{
		return (OS_ERR_TIME_INVALID_SECONDS);
	}
	
	if (ms > 999u)
	{
		return (OS_ERR_TIME_INVALID_MS);
	}
	
#endif
	/* Compute the total number of clock ticks required.. */
	/* .. (rounded to the nearest tick)                   */
	ticks = ((INT32U)hours * 3600uL + (INT32U)minutes * 60uL + (INT32U)seconds) * OS_TICKS_PER_SEC
					+ OS_TICKS_PER_SEC * ((INT32U)ms + 500uL / OS_TICKS_PER_SEC) / 1000uL;
	OSTimeDly (ticks);
	return (OS_ERR_NONE);
}
#endif

恢复被延时的Task

#if OS_TIME_DLY_RESUME_EN > 0u
INT8U  OSTimeDlyResume (INT8U prio)
{
	OS_TCB    *ptcb;
#if OS_CRITICAL_METHOD == 3u                                   /* Storage for CPU status register      */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	
	if (prio >= OS_LOWEST_PRIO)
	{
		return (OS_ERR_PRIO_INVALID);
	}
	
	OS_ENTER_CRITICAL();
	ptcb = OSTCBPrioTbl[prio];                                 /* Make sure that task exist            */
	
	if (ptcb == (OS_TCB *)0)
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TASK_NOT_EXIST);                        /* The task does not exist              */
	}
	
	if (ptcb == OS_TCB_RESERVED)
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TASK_NOT_EXIST);                        /* The task does not exist              */
	}
	
	if (ptcb->OSTCBDly == 0u)                                  /* See if task is delayed               */
	{
		OS_EXIT_CRITICAL();
		return (OS_ERR_TIME_NOT_DLY);                          /* Indicate that task was not delayed   */
	}
	
	ptcb->OSTCBDly = 0u;                                       /* Clear the time delay                 */
	
	if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY)
	{
		ptcb->OSTCBStat     &= ~OS_STAT_PEND_ANY;              /* Yes, Clear status flag               */
		ptcb->OSTCBStatPend  =  OS_STAT_PEND_TO;               /* Indicate PEND timeout                */
	}
	
	else
	{
		ptcb->OSTCBStatPend  =  OS_STAT_PEND_OK;
	}
	
	if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY)    /* Is task suspended?                   */
	{
		OSRdyGrp               |= ptcb->OSTCBBitY;             /* No,  Make ready                      */
		OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
		OS_EXIT_CRITICAL();
		OS_Sched();                                            /* See if this is new highest priority  */
	}
	
	else
	{
		OS_EXIT_CRITICAL();                                    /* Task may be suspended                */
	}
	
	return (OS_ERR_NONE);
}
#endif

返回系统当前的Tick计数值

#if OS_TIME_GET_SET_EN > 0u
INT32U  OSTimeGet (void)
{
	INT32U     ticks;
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	OS_ENTER_CRITICAL();
	ticks = OSTime;
	OS_EXIT_CRITICAL();
	return (ticks);
}
#endif

设置系统的Tick计数值

#if OS_TIME_GET_SET_EN > 0u
void  OSTimeSet (INT32U ticks)
{
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
	OS_ENTER_CRITICAL();
	OSTime = ticks;
	OS_EXIT_CRITICAL();
}
#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kibana:使用 “链接” 面板简化 Kibana 仪表板导航 - Links panel

作者:Teresa Alvarez Soler 我们很高兴地宣布 Kibana 仪表板的最新功能版本:链接面板(Links panel),这是在仪表板之间组织和导航的简单方法。 此功能在 Kibana 8.11 的技术预览版中提供。 有时你可能希望创建多个主题…

Rust实战教程:构建您的第一个应用

大家好!我是lincyang。 今天,我们将一起动手实践,通过构建一个简单的Rust应用来深入理解这门语言。 我们的项目是一个命令行文本文件分析器,它不仅能读取和显示文件内容,还会提供一些基础的文本分析,如计算…

IDEA-git commit log 线

一、本地代码颜色标识 红色:新建的文件,没有add到git本地仓库蓝色:修改的文件,没有提交到git远程仓库绿色:已添加到git本地仓库,没有提交到git远程仓库灰色:删除的文件,没有提交到g…

常见限流算法解读

目录 前言 固定窗口(计算器法) 滑动窗口 漏桶算法 令牌桶算法 总结 前言 在现在的互联网系统中有很多业务场景,比如商品秒杀、下单、数据查询详情,其最大特点就是高并发,但是我们的系统通常不能承受这么大的流…

【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account(5)- Data Lake layers 前言 上一文介绍了存储帐户的概述,还有container的一些配置,在…

Kibana:作为非设计师设计直观的 Kibana 仪表板

作者:Carly Richmond, Marco Vettorello, Giovanni Magni 开发人员、SRE 工程师和才华横溢的技术人员通常需要构建快速仪表板来展示有关其应用程序状态的重要信息,这些信息可供混合受众使用。 如果你不是前端开发人员或设计师,那么构建所有人…

vue echart 立体柱状图 带阴影

根据一个博主代码改编而来 <template><div class"indexBox"><div id"chart"></div></div> </template><script setup> import * as echarts from "echarts"; import { onMounted } from "vue&…

二叉树-堆(9.10)

接上节内容 目录 3.3 堆的实现 3.2.1 堆向下调整算法 3.2.2大堆的创建 3.4 堆的应用 3.4.1 堆排序 3.4.2 TOP-K问题 ​编辑 二叉树的性质 练习 4.二叉树链式结构的实现 4.1 前置说明 4.2二叉树的遍历 4.2.1 前序、中序以及后序遍历 4.3 节点个数以及高度等 4.3…

算不上最全,但都是必备——Mybatis这些不会不行啊

Mybatis篇 ORM&#xff08;Object Relational Mapping&#xff09;&#xff0c;对象关系映射&#xff0c;是一种为了解决关系型数据库数据与简单Java对象&#xff08;POJO&#xff09;的映射关系的技术。简单的说&#xff0c;ORM是通过使用描述对象和数据库之间映射的元数据&am…

天气越来越寒冷,一定要注意保暖

你们那里下雪了吗&#xff1f;听说西安已经下了今年的第一场雪&#xff0c;我们这里虽然隔了几百公里&#xff0c;但是只下雨没有下雪&#xff0c;不过气温是特别的冷&#xff0c;尤其是对我们这些上班族和上学的人而言&#xff0c;不管多冷&#xff0c;不管刮风下雨&#xff0…

根据店铺ID或店铺昵称或店铺链接获取阿里巴巴店铺所有商品数据接口|阿里巴巴店铺整店商品数据接口|阿里巴巴API接口

阿里巴巴店铺所有商品数据接口是阿里巴巴开放平台提供的API接口之一&#xff0c;它可以帮助开发者获取到店铺内所有商品的信息&#xff0c;包括商品的ID、标题、价格、图片、链接等。通过该接口&#xff0c;开发者可以快速地获取到大量的商品数据&#xff0c;并进行进一步的数据…

自定义注解实现服务的动态开关

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 &#x1f9d1;‍&#x1f4bb;&#x1f9d1;‍&#x1f4bb;&#x1f9d1;‍&#x1f4bb;Make things differe…

matlab语言的由来与发展历程

MATLAB语言的由来可以追溯到1970年代后期。当时&#xff0c;Cleve Moler教授在New Mexico大学计算机系担任系主任&#xff0c;他为了LINPACK和EISPACK两个FORTRAN程序集开发项目提供易学、易用、易改且易交互的矩阵软件而形成了最初的MATLAB。 1984年&#xff0c;MATLAB推出了…

JVM 内存区域

JVM内存结构模型 程序计数器&#xff1a; 1.线程私有的&#xff0c;是一块较小的内存空间&#xff0c;当前线程所执行的字节码的行号指示器 2.每个线程都有一个独立的程序计数器&#xff0c;各线程之间程序计数器互不影响&#xff0c;独立存储 3.此内存区域是唯一一个在java虚拟…

C++ vector中capacity()和size() 的区别

文章目录 1 capacity()和size() 介绍2 vector满了之后&#xff0c;capacity()会自动了扩充为原来的2倍 &#xff1f; 1 capacity()和size() 介绍 size是指容器当前拥有元素的个数&#xff0c; capacity是指容器在必须分配新的存储空间之前可以存放的元素总数。 如vector<i…

Linux常用命令——bzgrep命令

在线Linux命令查询工具 bzgrep 使用正则表达式搜索.bz2压缩包中文件 补充说明 bzgrep命令使用正则表达式搜索“.bz2”压缩包中文件&#xff0c;将匹配的行显示到标注输出。 语法 bzgrep(参数)参数 搜索模式&#xff1a;指定要搜索的模式&#xff1b;.bz2文件&#xff1a…

【教3妹学编程-算法题】K 个元素的最大和

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

【前端开发】JS Vue React中的通用递归函数

目录 前言 一、递归函数的由来 二、功能实现 1.后台数据 2.处理数据 3.整体代码 总结 &#x1f642;博主&#xff1a;冰海恋雨. &#x1f642;文章核心&#xff1a;【前端开发】JS Vue React中的通用递归函数 前言 大家好&#xff0c;今天和大家分享一下在前端开发中j…

基于springboot实现校园医疗保险管理系统【项目源码】

基于springboot实现校园医疗保险管理系统演示 系统开发平台 在线校园医疗保险系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其…

旺店通·企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口

旺店通企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口 源系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案&#xff0c;助力零售企业数字化…