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

目录

    • 创建一个计时器
    • 重新启动一个计时器
    • 停止一个计时器
    • 删除一个计时器

在这里插入图片描述

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

创建一个计时器

#if OS_TMR_EN > 0u
OS_TMR  *OSTmrCreate (INT32U           dly,
											INT32U           period,
											INT8U            opt,
											OS_TMR_CALLBACK  callback,
											void            *callback_arg,
											INT8U           *pname,
											INT8U           *perr)
{
	OS_TMR   *ptmr;
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return ((OS_TMR *)0);
	}
	
#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508
	
	if (OSSafetyCriticalStartFlag == OS_TRUE)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return ((OS_TMR *)0);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	switch (opt)                                            /* Validate arguments                                     */
	{
		case OS_TMR_OPT_PERIODIC:
			if (period == 0u)
			{
				*perr = OS_ERR_TMR_INVALID_PERIOD;
				return ((OS_TMR *)0);
			}
			
			break;
			
		case OS_TMR_OPT_ONE_SHOT:
			if (dly == 0u)
			{
				*perr = OS_ERR_TMR_INVALID_DLY;
				return ((OS_TMR *)0);
			}
			
			break;
			
		default:
			*perr = OS_ERR_TMR_INVALID_OPT;
			return ((OS_TMR *)0);
	}
	
#endif
	
	if (OSIntNesting > 0u)                                  /* See if trying to call from an ISR                      */
	{
		*perr  = OS_ERR_TMR_ISR;
		return ((OS_TMR *)0);
	}
	
	OSSchedLock();
	ptmr = OSTmr_Alloc();                                   /* Obtain a timer from the free pool                      */
	
	if (ptmr == (OS_TMR *)0)
	{
		OSSchedUnlock();
		*perr = OS_ERR_TMR_NON_AVAIL;
		return ((OS_TMR *)0);
	}
	
	ptmr->OSTmrState       = OS_TMR_STATE_STOPPED;          /* Indicate that timer is not running yet                 */
	ptmr->OSTmrDly         = dly;
	ptmr->OSTmrPeriod      = period;
	ptmr->OSTmrOpt         = opt;
	ptmr->OSTmrCallback    = callback;
	ptmr->OSTmrCallbackArg = callback_arg;
#if OS_TMR_CFG_NAME_EN > 0u
	
	if (pname == (INT8U *)0)                                /* Is 'pname' a NULL pointer?                             */
	{
		ptmr->OSTmrName    = (INT8U *) (void *)"?";
	}
	
	else
	{
		ptmr->OSTmrName    = pname;
	}
	
#endif
	OSSchedUnlock();
	*perr = OS_ERR_NONE;
	return (ptmr);
}
#endif

重新启动一个计时器

#if OS_TMR_EN > 0u
BOOLEAN  OSTmrStart (OS_TMR   *ptmr,
										 INT8U    *perr)
{
#ifdef OS_SAFETY_CRITICAL

	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (OS_FALSE);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (OS_FALSE);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                     /* Validate timer structure                               */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (OS_FALSE);
	}
	
	if (OSIntNesting > 0u)                                  /* See if trying to call from an ISR                      */
	{
		*perr  = OS_ERR_TMR_ISR;
		return (OS_FALSE);
	}
	
	OSSchedLock();
	
	switch (ptmr->OSTmrState)
	{
		case OS_TMR_STATE_RUNNING:                          /* Restart the timer                                      */
			OSTmr_Unlink (ptmr);                           /* ... Stop the timer                                     */
			OSTmr_Link (ptmr, OS_TMR_LINK_DLY);            /* ... Link timer to timer wheel                          */
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (OS_TRUE);
			
		case OS_TMR_STATE_STOPPED:                          /* Start the timer                                        */
		case OS_TMR_STATE_COMPLETED:
			OSTmr_Link (ptmr, OS_TMR_LINK_DLY);            /* ... Link timer to timer wheel                          */
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (OS_TRUE);
			
		case OS_TMR_STATE_UNUSED:                           /* Timer not created                                      */
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INACTIVE;
			return (OS_FALSE);
			
		default:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INVALID_STATE;
			return (OS_FALSE);
	}
}
#endif

停止一个计时器

#if OS_TMR_EN > 0u
BOOLEAN  OSTmrStop (OS_TMR  *ptmr,
										INT8U    opt,
										void    *callback_arg,
										INT8U   *perr)
{
	OS_TMR_CALLBACK  pfnct;
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (OS_FALSE);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (OS_FALSE);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                           /* Validate timer structure                         */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (OS_FALSE);
	}
	
	if (OSIntNesting > 0u)                                        /* See if trying to call from an ISR                */
	{
		*perr  = OS_ERR_TMR_ISR;
		return (OS_FALSE);
	}
	
	OSSchedLock();
	
	switch (ptmr->OSTmrState)
	{
		case OS_TMR_STATE_RUNNING:
			OSTmr_Unlink (ptmr);                                 /* Remove from current wheel spoke                  */
			*perr = OS_ERR_NONE;
			
			switch (opt)
			{
				case OS_TMR_OPT_CALLBACK:
					pfnct = ptmr->OSTmrCallback;                /* Execute callback function if available ...       */
					
					if (pfnct != (OS_TMR_CALLBACK)0)
					{
						(*pfnct) ((void *)ptmr, ptmr->OSTmrCallbackArg); /* Use callback arg when timer was created */
					}
					
					else
					{
						*perr = OS_ERR_TMR_NO_CALLBACK;
					}
					
					break;
					
				case OS_TMR_OPT_CALLBACK_ARG:
					pfnct = ptmr->OSTmrCallback;                /* Execute callback function if available ...       */
					
					if (pfnct != (OS_TMR_CALLBACK)0)
					{
						(*pfnct) ((void *)ptmr, callback_arg);  /* ... using the 'callback_arg' provided in call    */
					}
					
					else
					{
						*perr = OS_ERR_TMR_NO_CALLBACK;
					}
					
					break;
					
				case OS_TMR_OPT_NONE:
					break;
					
				default:
					*perr = OS_ERR_TMR_INVALID_OPT;
					break;
			}
			
			OSSchedUnlock();
			return (OS_TRUE);
			
		case OS_TMR_STATE_COMPLETED:                              /* Timer has already completed the ONE-SHOT or ...  */
		case OS_TMR_STATE_STOPPED:                                /* ... timer has not started yet.                   */
			OSSchedUnlock();
			*perr = OS_ERR_TMR_STOPPED;
			return (OS_TRUE);
			
		case OS_TMR_STATE_UNUSED:                                 /* Timer was not created                            */
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INACTIVE;
			return (OS_FALSE);
			
		default:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INVALID_STATE;
			return (OS_FALSE);
	}
}
#endif

删除一个计时器

#if OS_TMR_EN > 0u
BOOLEAN  OSTmrDel (OS_TMR  *ptmr,
									 INT8U   *perr)
{
#ifdef OS_SAFETY_CRITICAL

	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return (OS_FALSE);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (ptmr == (OS_TMR *)0)
	{
		*perr = OS_ERR_TMR_INVALID;
		return (OS_FALSE);
	}
	
#endif
	
	if (ptmr->OSTmrType != OS_TMR_TYPE)                     /* Validate timer structure                               */
	{
		*perr = OS_ERR_TMR_INVALID_TYPE;
		return (OS_FALSE);
	}
	
	if (OSIntNesting > 0u)                                  /* See if trying to call from an ISR                      */
	{
		*perr  = OS_ERR_TMR_ISR;
		return (OS_FALSE);
	}
	
	OSSchedLock();
	
	switch (ptmr->OSTmrState)
	{
		case OS_TMR_STATE_RUNNING:
			OSTmr_Unlink (ptmr);                           /* Remove from current wheel spoke                        */
			OSTmr_Free (ptmr);                             /* Return timer to free list of timers                    */
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (OS_TRUE);
			
		case OS_TMR_STATE_STOPPED:                          /* Timer has not started or ...                           */
		case OS_TMR_STATE_COMPLETED:                        /* ... timer has completed the ONE-SHOT time              */
			OSTmr_Free (ptmr);                             /* Return timer to free list of timers                    */
			OSSchedUnlock();
			*perr = OS_ERR_NONE;
			return (OS_TRUE);
			
		case OS_TMR_STATE_UNUSED:                           /* Already deleted                                        */
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INACTIVE;
			return (OS_FALSE);
			
		default:
			OSSchedUnlock();
			*perr = OS_ERR_TMR_INVALID_STATE;
			return (OS_FALSE);
	}
}
#endif

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

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

相关文章

腾讯云五年服务器CVM和三年轻量应用服务器选哪个?

腾讯云3年轻量和5年云服务器CVM优惠活动入口,3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽,5年CVM云服务器可以选择2核4G和4核8G配置可选,阿腾云atengyun.com分享腾讯云3年轻量应用服务器和5年云服务器CVM优惠活动入口和配置报价&#xff…

【STM32单片机】比赛计时计分系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器,使用OLED显示模块、矩阵按键模块、蜂鸣器等。 主要功能: 系统运行后,OLED默认显示第1节次比赛时间、AB得分。默认是12分钟倒计时…

机器学习6:逻辑回归

假设我们有一个二元分类问题,有两个特征(x1, x2)和对应的类别标签(y)。给定 以下训练数据集: 我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函 数来将线性函数的输出转换为概率值&…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…

【2014年数据结构真题】

41. (13分)二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 给定一棵二叉树T,采用二叉链表存储,结点结构如下: 其中叶结点的weight域保存该结点的非负权值。 设root为指向T的根结点的指针, 请设计求T 的WPL…

抖音电商的野心,中小商家的风口

文丨新熔财经 作者丨寒蝉鸣 反向消费的大浪潮,不会辜负任何一个抓住风口的平台。过去是拼多多,如今是唯品会。 靠着响应新时代消费者对“质价比”的需求,消失在大众视线许久的唯品会,不仅守住了电商老前辈的行业地位&#xff0…

Express基本接口开发-入门学习

前提推荐 任何一个新的知识都是从文档看起,因此express官方文档示例有必要去学习一遍。 推荐看: 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了,然后现在就可以去练习了 注意:更多示例-代…

Quarkus 替代 SpringBoot

1 概述2 SpringBoot3 Quarkus4 比较5 调查结果6 从 Spring 转换到 Quarkus7 我是 Spring 开发者,为什么要选Quarkus?8 Spring 开发者可以活用哪些现有知识?9 对Spring开发者有额外的好处吗?10 Spring开发者如何开始学习Quarkus&am…

libgdx实现雪花、下雪效果(二十三)

libgdx实现雪花、下雪效果(二十三) 转自:https://lingkang.top/archives/libgdx-shi-xian-xue-hua package effect;import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.…

使用CXF调用WSDL(二)

简介 本篇文章主要解决了上篇文章中遗留的对象嵌套问题,要想全面解析无限极的对象嵌套需要使用递归去解决 上文链接: 使用CXF调用WSDL(一) 上文回顾 上文使用了单方法“ call() ”解决了List和基本类型(含String&…

基于逐次变分模态分解(SVMD)联合小波阈值去噪

代码原理 逐次变分模态分解 (Iterative Variational Mode Decomposition, IVMD) 是一种信号分解方法,它可以将一个时域信号分解为若干个本征模态函数(Intrinsic Mode Functions, IMF)。它通过迭代寻找信号的本征模态函数和残差部分&#xff…

Kalman滤波

文章目录 一、公式推导二、扩展卡尔曼滤波 卡尔曼滤波是一种最优化递归数据处理算法。(Optimal Recursive Data Processing Algorithm) Kalman滤波是时域滤波,采用状态空间描述系统,运用递推形式是计算简单,数据存储量…

TSINGSEE视频汇聚管理与AI算法视频质量检测方案

一、建设背景 随着互联网视频技术的发展,视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是,在监管场景中,仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题,对企业的日常管理和运转存在较大的安全隐患…

A. Weird Sum

题目链接 : Problem - 1648A - Codeforces 题面 : 题意 : 输入 n m (1≤n*m≤1e5) 和 n 行 m 列的矩阵 a,元素范围 [1,1e5]。 对于矩阵中的所有相同元素对,即满足 a[x1][y1] a[x2][y2] 的元素对 (a[x1][y1], a[x2][y2]),把 abs(x1-x2)…

P3371 【模板】单源最短路径(弱化版)

【模板】单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣(LeetCode) 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

ABZ正交编码 - 异步电机常用的位置信息确定方式

什么是正交编码? ab正交编码器(又名双通道增量式编码器),用于将线性移位转换为脉冲信号。通过监控脉冲的数目和两个信号的相对相位,用户可以跟踪旋转位置、旋转方向和速度。另外,第三个通道称为索引信号&am…

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

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(例…

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

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

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

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