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

news2025/1/24 8:51:24

目录

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

在这里插入图片描述

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

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

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

相关文章

vue 事件总线 非父子组件之间的简单信息传递

如果两个组件不是父子关系,那么传递信息就不能通过props了。 此时可以使用vue的事件总线来传递信息。 1.创建非父子组件都能访问的事件总线(也就是空的vue实例) 1.创建一个EventBus.js 2.引入vue并且创建一个vue实例 import Vue from vuec…

微信小程序 解决tab页切换过快 数据出错问题

具体问题:切换tab页切换过快时,上一个列表接口未响应完和当前列表数据冲突 出现数据错误 具体效果如下: 解决方式:原理 通过判断是否存在request 存在中断 并发送新请求 不存在新请求 let shouldAbort false; // 添加一个中断标志 let re…

STM32 LED编程 GPIO的初始化(标准库)

实验的电路图介绍 实验的电路图类似于开漏接法 要初始化GPIOC接口 标准库的模板 GPIO的标准库编程接口 GPIO引脚的初始化 GPIO作为片上外设 每一个片上外设使用前一定要使能时钟 为什么要使能时钟?时钟是啥 时钟的使能 stm32的每一个片上外设都是时序电路 时序…

计算机视觉基础(6)——光流估计

前言 本章我们来学习一下图像处理基础中的运动估计。主要内容包括运动场估计和光流估计两个部分。在运动场估计中,我们将学习到运动场、光流、光流和运动场的区别;在光流估计中,我们将学习到光流估计任务、孔径问题,以及光流估计两…

高质量实时渲染笔记

文章目录 Real-time shadows1 自遮挡问题2 解决阴影detach问题?3 Aliasing4 近似积分5 percentage closer soft shadows(PCSS)percenta closer filtering(PCF)PCSS的思想 6 Variance Soft Shadow Mapping (VSSM)步骤Moment Shadow Mapping 7 Distance field shadow …

MongoDB入门级别教程全(Windows版,保姆级教程)

下载mongodb 进入官网: Download MongoDB Community Server | MongoDB 选择msi,Windows版本 下载完后直接双击: 选择complete 这里建议改地方: 我这里直接改成d盘:work目录下面: 点击next: 因…

C 语言实现 UDP

广播 发送广播信息&#xff0c;局域网中的客户端都可以接受该信息 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd socket(PF_INET, …

MySQL 社区开源备份工具 Xtrabackup 详解

文章目录 前言1. Xtrabackup 介绍1.1 物理备份与逻辑备份区别1.2 Xtrabackup 系列版本 2. Xtrabackup 部署2.1 下载安装包2.2 二进制部署2.3 程序文件介绍2.4 备份需要的权限 3. Xtrabackup 使用场景3.1 本地全量备份3.2 本地压缩备份3.3 全量流式备份3.3.1 备份到远程主机3.3.…

技术架构 - 应用数据分离,应用服务集群架构

前言 上一篇文章介绍了单机架构&#xff0c;由于性能瓶颈&#xff0c;满足不了高访问量&#xff0c;所以演化出了数据分离架构。 这种架构也很简单只是将应用服务和数据库服务分离开来&#xff0c;避免单一架构的资源争夺的情况。 一、 应用数据分离架构 1. 简介 应用服务和…

JavaScript从入门到精通系列第三十七篇:详解JavaScript中文档的加载顺序

文章目录 一&#xff1a;文档加载说明 1&#xff1a;回顾一个代码 2&#xff1a;问题分析和说明 二&#xff1a;如何给JS换个位置&#xff1f; 1&#xff1a;过程分析 2&#xff1a;代码编写 3&#xff1a;运行结果 4&#xff1a;解释说明 大神链接&#xff1a;作者有幸…

Excel-lookup函数核对两个表格的数据匹配

需求描述&#xff1a;把右侧表格里的成绩按照姓名匹配到左表中 D11函数为LOOKUP(1,0/($H$11:$H$26A11),I$11:I$26) 然后下拉赋值公式&#xff0c;那么得到的值就都是对应的

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

2024 AIGC 规划:探索交互体验变革及 智能硬件基础设施篇

TL;DR Run LLM/Embedding on Android: https://github.com/unit-mesh/android-semantic-search-kitInference SDK&#xff1a;https://github.com/unit-mesh/inference 正文&#xff1a; 在过去的一年时间里&#xff0c;国内外大中型公司都在探索、引入了 GenAI / AIGC&#xf…

Linux使用Docker完整安装Superset,同时解决please use superset_config.py to override it报错

文章目录 Docker安装Superset流程1. 首先获取镜像2. 生成SSL3. 创建Superset容器4. 更新数据库5. 测试访问Superset Docker安装Superset流程 1. 首先获取镜像 docker pull amancevice/superset2. 生成SSL 接下来我们运行一些额外的程序&#xff1a; openssl rand -base64 4…

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域&#xff0c;了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名&#xff1a;.jpg 或 .jpeg 特点&#xff1a; 1、有损压缩&#x…

uni-app报错“本应用使用HBuilderX x.x.x 或对应的cli版本编译,而手机端SDK版本是x.x.x不匹配的版本可能造成应用异常”

uniapp开发的一个跨平台软件&#xff0c;在安卓模拟器上启动的时候报警告&#xff1a; 官方给的解释&#xff1a;uni-app运行环境版本和编译器版本不一致的问题 - DCloud问答 解决办法有两个 方法一&#xff1a;添加忽略警告的配置 项目根目录下找到 manifest.json&#xf…

SpringCloud Alibaba(中):服务熔断降级-Sentinel

Sentinel Sentinel是阿里巴巴开源的分布式系统流量防卫防护组件&#xff0c;主要对分布式系统中的流量进行控制、熔断降级等保护操作。Sentinel的目标是成为互联网级别分布式系统的流量防卫防护组件&#xff0c;它与系统的各个部分集成&#xff0c;保护着系统的入口和出口。 …

金属五要素微型气象仪科技小物大智慧

WX-WQX5S 天气是我们生活中不可忽视的一个因素。冷暖交替&#xff0c;阴晴不定&#xff0c;这款金属五要素微型气象仪&#xff0c;让你随时掌握天气变化&#xff0c;成为生活的智者。 一、外观设计 这款气象仪采用金属材质&#xff0c;不仅耐用&#xff0c;而且具有很高的美观…

百度飞浆环境安装

前言&#xff1a; 在安装飞浆环境之前得先把pytorch环境安装好&#xff0c;不过关于pytorch网上教程最多的都是通过Anaconda来安装&#xff0c;但是Anaconda环境安装容易遇到安装超时导致安装失败的问题&#xff0c;本文将叫你如何通过pip安装的方式快速安装&#xff0c;其实这…

Spring Security OAuth2.0 实现分布式系统的认证和授权

Spring Security OAuth2.0 实现分布式系统的认证和授权 1. 基本概念1.1 什么是认证&#xff1f;1.2 什么是会话&#xff1f;1.2.1 基于 session 的认证方式1.2.2 基于 token 的认证方式 1.3 什么是授权&#xff1f;1.3.1 授权的数据模型 1.4 RBAC 介绍 2. Spring Security2.1 S…