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

news2024/11/19 16:36:18

目录

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

在这里插入图片描述

  • 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(例如调用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

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

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

相关文章

SUMO道路封闭车辆绕行仿真实验【TraCI】

本文将介绍如何在 SUMO 交通模拟中动态选择车辆绕行指定道路。 绕道是城市驾驶中的常见现象,造成原因有很多,包括建筑和交通事故等。 无论出于何种原因,并非所有车辆都会选择避开这些道路; 有些人可能会毫不犹豫地直接开车过去&a…

Payshield 10K是什么意思?有什么作用?

PayShield 10K是一种支付安全产品,由数字货币和法币混合而成的数字货币产品。它的意思是保护商家在交易过程中可能遭受的损失。这种产品的主要作用是保护数字货币支付系统的安全,并确保商家在交易过程中获得他们应得的收益。 PayShield 10K具有以下特点和…

基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码

基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鸟群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鸟群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

Domino为外出Internet邮件设置DKIM签名

大家好,才是真的好。 如果你看了上篇《Domino中和邮件安全有关的SPF、DKIM介绍》内容,想必就对DKIM概念不陌生,当然,上篇我们讲的是邮件入站的SFP、DKIM签名检查,这篇讲述的是外出邮件的DKIM签名。 是的,…

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

Spring MVC篇 Spring MVC执行流程 四大组件 前端控制器DispatcherServlet处理器映射器HandlerMapping处理器适配器HandlerAdaptor视图解析器ViewResolver 视图阶段(JSP) 请求先到前端控制器DispatcherServlet DispatcherServlet将根据该请求的路径去…

理解 R-CNN:目标检测的一场革命

一、介绍 对象检测是一项基本的计算机视觉任务,涉及定位和识别图像或视频中的对象。多年来,人们开发了多种方法来应对这一挑战,但基于区域的卷积神经网络(R-CNN)的发展标志着目标检测领域的重大突破。R-CNN 及其后续变…

深入探讨Linux中的文本文件查看命令

目录 前言1 cat命令2 less命令3 more命令4 head命令5 tail命令6 总结 前言 在Linux系统中,文本文件是日常工作中不可或缺的一部分,无论是配置文件、日志文件还是代码文件,都需要用到文本文件查看命令。在本文中,我们将深入研究一…

【深度学习】吴恩达课程笔记(四)——优化算法

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…

如何从 iCloud 恢复永久删除的照片?答案在这里!

在数字时代,丢失珍贵的照片可能会令人痛苦。然而,了解如何从 iCloud 恢复永久删除的照片可以带来一线希望。无论是意外删除还是技术故障,本指南都提供了 2023 年的最新方法来找回您的珍贵记忆。发现分步解决方案并轻松重新访问您的照片库。不…

智能供应链中的预测算法:理论与实践

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 引言 智能供应链已经成…

制作属于你的视觉小说,ComfyUI工作流#N3期AIGC训练营

什么是视觉小说? Visual Novel 最初这种形式被称为“有声小说” 视觉小说是一种源自日本的电子游戏类型,它以图像和文本为主要表现形式,通常包含大量的对话和故事情节。 (大量对话) 在视觉小说中,玩家可以通…

AJAX入门Day01笔记

Day01_Ajax入门 知识点自测 如下对象取值的方式哪个正确? let obj {name: 黑马 }A: obj.a B: obj()a 答案 A选项正确 哪个赋值会让浏览器解析成标签显示? let ul document.querySelector(#ul) let str <span>我是span标签</span>A: ul.innerText str B: ul…

HTML+CSS+JavaScript实战(一个简易的视频播放器)

效果如下&#xff1a; 思路很常规&#xff0c;无需注释即可看懂&#xff08;其实是懒得敲 bushi&#xff09; 没有注释也能跑&#xff0c;so直接上源码~ 感谢 夏柔站长 提供的免费API index.html <!DOCTYPE html> <html lang"en"> <head><meta …

UE4动作游戏实例RPG Action解析三:实现效果,三连击Combo,射线检测,显示血条,火球术

一、三连Combo 实现武器三连击,要求: 1.下一段Combo可以随机选择, 2.在一定的时机才能再次检测输入 3. 等当前片段播放完才播放下一片段 1.1、蒙太奇设置 通过右键-新建蒙太奇片段,在蒙太奇里创建三个片段,并且移除相关连接,这样默认只会播放第一个片段 不同片段播…

一分钟搞懂什么是this指针(未涉及静态成员和函数)

前言 我们在学习类的过程中&#xff0c;一定听说过this指针&#xff0c;但是并不知道它跟谁相似&#xff0c;又有什么用途&#xff0c;所以接下来&#xff0c;让我们一起去学习this指针吧&#xff01; 一、this指针的引入 我们先来看下面两段代码&#xff0c;它们输出的是什么&…

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

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

C# Onnx 轻量实时的M-LSD直线检测

目录 介绍 效果 效果1 效果2 效果3 效果4 模型信息 项目 代码 下载 其他 介绍 github地址&#xff1a;https://github.com/navervision/mlsd M-LSD: Towards Light-weight and Real-time Line Segment Detection Official Tensorflow implementation of "M-…

什么是Vue.js中的单向数据流(one-way data flow)?为什么它重要?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【QT系列教程】之二创建项目和helloworld案例

文章目录 一、QT创建项目1.1、创建项目1.2、选择创建项目属性1.3、选择路径和项目名称1.4、选择构建项目类型1.5、布局方式1.6、翻译文件&#xff0c;根据自己需求选择1.7、选择套件1.8、项目管理&#xff0c;自行配置1.9、配置完成&#xff0c;系统自动更新配置 二、QT界面介绍…

图论16-拓扑排序

文章目录 1 拓扑排序2 拓扑排序的普通实现2.1 算法实现 - 度数为0入队列2.2 拓扑排序中的环检测 3 深度优先遍历的后续遍历3.1 使用环检测类先判断是否有环3.2 调用无向图的深度优先后续遍历方法&#xff0c;进行DFS 1 拓扑排序 对一个有向无环图G进行拓扑排序&#xff0c;是将…