μC/OS-II---计时器管理2(os_tmr.c)

目录

    • 获取计时器的名字
    • 获取计时器到期前剩余的时间
    • 查看计时器的状态

在这里插入图片描述

  • 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(例如调用OSTimeDly()、OSTimeDlyHMSM()…或任何导致计时器任务阻塞或被删除的操作),这一点非常重要。

获取计时器的名字

#if OS_TMR_EN > 0u && OS_TMR_CFG_NAME_EN > 0u
INT8U  OSTmrNameGet (OS_TMR   *ptmr,
										 INT8U   **pdest,
										 INT8U    *perr)
{
	INT8U  len;
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (0u);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (pdest == (INT8U **)0)
	{
		*perr = OS_ERR_TMR_INVALID_DEST;
		return (0u);
	}
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (0u);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                /* Validate timer structure                                    */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (0u);
	}
	
	if (OSIntNesting > 0u)                             /* See if trying to call from an ISR                           */
	{
		*perr = OS_ERR_NAME_GET_ISR;
		return (0u);
	}
	
	OSSchedLock();
	
	switch (ptmr->OSTmrState)
	{
		case OS_TMR_STATE_RUNNING:
		case OS_TMR_STATE_STOPPED:
		case OS_TMR_STATE_COMPLETED:
			*pdest = ptmr->OSTmrName;
			len    = OS_StrLen (*pdest);
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (len);
			
		case OS_TMR_STATE_UNUSED:                      /* Timer is not allocated                                      */
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INACTIVE;
			return (0u);
			
		default:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INVALID_STATE;
			return (0u);
	}
}
#endif

获取计时器到期前剩余的时间

#if OS_TMR_EN > 0u
INT32U  OSTmrRemainGet (OS_TMR  *ptmr,
												INT8U   *perr)
{
	INT32U  remain;
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (0u);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (0u);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                /* Validate timer structure                                    */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (0u);
	}
	
	if (OSIntNesting > 0u)                             /* See if trying to call from an ISR                           */
	{
		*perr = OS_ERR_TMR_ISR;
		return (0u);
	}
	
	OSSchedLock();
	
	switch (ptmr->OSTmrState)
	{
		case OS_TMR_STATE_RUNNING:
			remain = ptmr->OSTmrMatch - OSTmrTime;    /* Determine how much time is left to timeout                  */
			OSSchedUnlock();
			*perr  = OS_ERR_NONE;
			return (remain);
			
		case OS_TMR_STATE_STOPPED:                     /* It's assumed that the timer has not started yet             */
			switch (ptmr->OSTmrOpt)
			{
				case OS_TMR_OPT_PERIODIC:
					if (ptmr->OSTmrDly == 0u)
					{
						remain = ptmr->OSTmrPeriod;
					}
					
					else
					{
						remain = ptmr->OSTmrDly;
					}
					
					OSSchedUnlock();
					*perr  = OS_ERR_NONE;
					break;
					
				case OS_TMR_OPT_ONE_SHOT:
				default:
					remain = ptmr->OSTmrDly;
					OSSchedUnlock();
					*perr  = OS_ERR_NONE;
					break;
			}
			
			return (remain);
			
		case OS_TMR_STATE_COMPLETED:                   /* Only ONE-SHOT that timed out can be in this state           */
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (0u);
			
		case OS_TMR_STATE_UNUSED:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INACTIVE;
			return (0u);
			
		default:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INVALID_STATE;
			return (0u);
	}
}
#endif

查看计时器的状态

#if OS_TMR_EN > 0u
INT8U  OSTmrStateGet (OS_TMR  *ptmr,
											INT8U   *perr)
{
	INT8U  state;
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (0u);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (0u);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                /* Validate timer structure                                    */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (0u);
	}
	
	if (OSIntNesting > 0u)                             /* See if trying to call from an ISR                           */
	{
		*perr = OS_ERR_TMR_ISR;
		return (0u);
	}
	
	OSSchedLock();
	state = ptmr->OSTmrState;
	
	switch (state)
	{
		case OS_TMR_STATE_UNUSED:
		case OS_TMR_STATE_STOPPED:
		case OS_TMR_STATE_COMPLETED:
		case OS_TMR_STATE_RUNNING:
			*perr = OS_ERR_NONE;
			break;
			
		default:
			*perr = OS_ERR_TMR_INVALID_STATE;
			break;
	}
	
	OSSchedUnlock();
	return (state);
}
#endif

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

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

相关文章

软件测试基础1:认识软件及测试

功能测试能力:具备对所有软件的功能进行质量验证。 1什么是软件 分类 应用软件系统软件 软件:控制计算机硬件工作的工具。 2软件基本组成 3软件产生过程 4什么是软件测试 软件测试:使用技术手段验证软件是否满足使用需求。 5软件测试目的 减少软件…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程: 图形界面创建:使用figure函数创建名为“声音采样率转换”的图形界面,并设置了其位置和大小。 按钮和文本框:使用uicontrol函数创建了选择音频文件的按钮、显示当前…

工业数据的“最后一公里”怎么走?

随着工业互联网的迅猛发展,工业数据已经成为推动制造业转型升级的重要动力。然而,面对海量的工业数据,如何高效、准确地走过数据的“最后一公里”,成为制约企业发展的关键问题。本文将探讨工业数据“最后一公里”所面临的挑战&…

魔兽服务器学习-笔记(服务器部署、地图管理、DB、日志模块、任务模块、战斗模块)

文章目录 一、环境准备1)依赖安装2)源码下载和编译 二、生成数据信息1)地图数据信息(客户端信息)2)数据库信息 三、启动服务器四、日志模块五、数据库模块六、场景模块1)地图管理2)A…

如何在微信内置浏览器内抓包

文章目录 使用环境&工具使用步骤1、手机USB连接上电脑,打开USB调试2、解压adb工具的压缩包,使用该工具连接上手机3、开启微信抓包4、电脑上打开chrome内核的浏览器或edge浏览器 使用环境&工具 windows电脑 安卓手机 adb工具 USB数据线 使用步骤…

【已解决】git push send-pack: unexpected disconnect while reading sideband packet

解决办法:修改缓存大小 打开项目所在路径下的git目录 找到config文件,用记事本打开编辑。 添加如下内容并保存即可 [http] postBuffer 1048576000

每日一练:Python中实现将阳历转换为农历

农历是中国传统的农业历法,与阳历(公历)有所不同。在Python中,我们可以使用第三方库 lunardate 来实现阳历到农历的转换。以下是一个简单的示例,演示如何在Python中执行这个转换过程。 1.安装 lunardate 库 首先&…

VR全景:打造虚拟政务服务,打通服务群众“最后一公里”

大家对政务大厅的工作效率可能已经司空见惯,办事窗口少,而需要办理的群众和业务却很多,很多去政务大厅办理业务的,排队几个小时也是常有的。并且在传统政务服务中,办事流程一般都较为复杂、耗时长,往往需要…

基于SSM的宠物领养系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

高频CSS面试题

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 BFC 块级格式上下文(block format context)是页面一块独立的渲染区域,具有一套独立的渲染规则 内部的…

吊打Fast Request还免费? 这款插件真心好用!

今天给大家推荐一款IDEA插件:Apipost Helper,比Fast Request更好用并且完全免费!三大亮点功能:写完代码IDEA内一键生成API文档;写完代码IDEA内一键调试,;生成API目录树,双击即可快速…

[RK3568][Android12.0]--- 系统自带预置第三方APK方法

Platform: RK3568 OS: Android 12.0 Kernel: 4.19 Rockchip默认提供了机制来预置第三方APK, 方法很简单: 1. 在device/rockchip/rk3568创建preinstall目录(如果要可卸载,那就创建preinstall_del目录) 2. 将你要预安装的APK放进此目录即可 preinstall 不…

wind版本elasticdump执行报错 unexpected token ‘ in json at

输入的格式不对: 之前,json格式不对: elasticdump --inputhttp://***:9200/d_*_news, --output/home/zyyt/es_data_bak/0714.json --searchBody{"query":{"bool":{"must":[{"term":{"languag…

【算法练习Day48】回文子串最长回文子序列

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 回文子串最长回文子序列总结…

SparkSQL自定义UDF函数

需求:员工id正常为8位,对于不满8位的员工id左侧用0补齐 import org.apache.spark.sql.{DataFrame, SparkSession}object DataSetCreate {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("test").master(&…

excel用RAND函数、或者RAND.NV函数生成随机数、这两个函数的区别

用RAND函数生成大于0小于1的随机数 插入-》函数: 选择RAND函数: 点击“继续”: 点击“确定”,就生成随机数了: 用RAND.NV函数生成一个大于0小于1的随机数 步骤跟RAND函数相同,只不过选择的是RAN…

Eclipse使用配置tomcat服务:Server配置

目标: 在Eclipse中,默认会把Web项目放到Eclipse的工作空间下 的.metadata\.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下 ,如果现在Eclipse中有名为imsmanagere的项目,将它按以前的方式部署到服务器上&am…

2023.11.14使用bootstrap制作一个简洁的前端注册登录页

2023.11.14使用bootstrap制作一个简洁的前端注册登录页 比较简洁的登录页,主要是为自己开发的一些平台页面做测试用,前端具备功能如下: (1)输入用户名、密码,需补充后端验证代码。 (2&#xff…

下载文件时的文件名中文乱码问题,文件名丢失

涉及到的java代码如下,下载的时候文件名为中文 package com.example.springboot.service.impl;import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringU…

【nlp】2.4 GRU模型

GRU模型 1 GRU介绍2 GRU的内部结构图2.1 GRU结构分析2.2 Bi-GRU介绍2.3 使用Pytorch构建GRU模型2.4 GRU优缺点3 RNN及其变体1 GRU介绍 GRU(Gated Recurrent Unit)也称门控循环单元结构, 它也是传统RNN的变体, 同LSTM一样能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆…