μ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_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return ((OS_TMR *)0);}#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == OS_TRUE){OS_SAFETY_CRITICAL_EXCEPTION();return ((OS_TMR *)0);}#endif
#if OS_ARG_CHK_EN > 0uswitch (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);}#endifif (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 > 0uif (pname == (INT8U *)0)                                /* Is 'pname' a NULL pointer?                             */{ptmr->OSTmrName    = (INT8U *) (void *)"?";}else{ptmr->OSTmrName    = pname;}#endifOSSchedUnlock();*perr = OS_ERR_NONE;return (ptmr);
}
#endif

重新启动一个计时器

#if OS_TMR_EN > 0u
BOOLEAN  OSTmrStart (OS_TMR   *ptmr,INT8U    *perr)
{
#ifdef OS_SAFETY_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return (OS_FALSE);}#endif
#if OS_ARG_CHK_EN > 0uif (ptmr == (OS_TMR *)0){*perr = OS_ERR_TMR_INVALID;return (OS_FALSE);}#endifif (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_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return (OS_FALSE);}#endif
#if OS_ARG_CHK_EN > 0uif (ptmr == (OS_TMR *)0){*perr = OS_ERR_TMR_INVALID;return (OS_FALSE);}#endifif (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_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return (OS_FALSE);}#endif
#if OS_ARG_CHK_EN > 0uif (ptmr == (OS_TMR *)0){*perr = OS_ERR_TMR_INVALID;return (OS_FALSE);}#endifif (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.rhkb.cn/news/192804.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot单体项目部署

配置类 检查跨域配置类 检查黑白名单是否有问题,是否需要更改 配置文件 检查端口 查看端口是否为需要搭建的端口 检查数据源 查看数据库是否为线上数据库 配置页面 注意:如果是单体项目的话,前端页面是和后端整合在一起的&#xff0…

第二篇 《随机点名答题系统》——题库管理详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.题库维护 4.1.1数据请求示意图 4.1.2添加题库(login.php)数据请求代码 4.1.3删除题库(login.php)数据请求代码 4.1.4 业务处理Service(tiKuService…

【React】Redux基本使用

什么情况使用 Redux ? Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话,当我们有以下的应用场景时,我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务,还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类,那么我们可以事先写好一个类&a…

【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识 什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作, 而从数据库处理查询操作。 为什么使用读写分离 从集中到分布,最基本的一个需求不是数据存储的瓶颈,而是在于计算的瓶颈&#xff…

汽配零件发FBA美国专线

随着电商的迅速发展,跨境电商平台如亚马逊的FBA(Fulfillment by Amazon)服务成为了许多商家选择的销售渠道。对于汽配零件行业来说,发FBA美国专线可以打开更广阔的市场,并且有望获得可观的发展前景。下面将从市场分析和前景两个方面来探讨汽配…

pyTorch Hub 系列#2:VGG 和 ResNet

一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…

[NSSRound#7 Team]ShadowFlag

文章目录 前置知识/proc目录python的反弹shellpin码计算 解题步骤 前置知识 /proc目录 Linux系统上的/proc目录是一种文件系统,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。/pro…

漏电继电器 LLJ-250HT AC220V 50-500ma 面板安装

系列型号: LLJ-10H(S)漏电继电器LLJ-15H(S)漏电继电器LLJ-16H(S)漏电继电器 LLJ-25H(S)漏电继电器LLJ-30H(S)漏电继电器LLJ-32H(S)漏电继电器 LLJ-60H(S)漏电继电器LLJ-63H(S)漏电继电器LLJ-80H(S)漏电继电器 LLJ-100H(S)漏电继电器LLJ-120H(S)漏电继电器LLJ-125H(…

深度学习 机器视觉 人脸识别系统 - opencv python 计算机竞赛

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目…

等保到底在“保”什么?

在信息时代,等保评级成为衡量企业信息安全水平的重要标准。那么,什么是等保评级呢?等保合规到底保的是什么呢?一起来看看吧。 编辑搜图 请点击输入图片描述(最多18字) 等保评级,会从七个维度进…

03-CSS基础选择器

3.1 CSS基础认知&#x1f34e; 3.1.1 &#x1f441;️‍&#x1f5e8;️CSS概念 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets)&#xff0c;为网页标签增加样式表现的 语法格式&#xff1a; 选择器{<!-- 属性设置 -->属性名:属性值; <!--每一个…

从0到0.01入门React | 004.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序

QString exePath QCoreApplication::applicationDirPath(); //获取要启动的另一个exe路径 exePath exePath “/OffLineProcess.exe”; //路径exe名称 QProcess* Process new QProcess; //创建新的进程 Process->start(exePath)…

Dart利用私有构造函数_()创建单例模式

文章目录 类的构造函数_()函数dart中构造函数定义 类的构造函数 类的构造函数有两种&#xff1a; 1&#xff09;默认构造函数&#xff1a; 当实例化对象的时候&#xff0c;会自动调用的函数&#xff0c;构造函数的名称和类的名称相同&#xff0c;在一个类中默认构造函数只能由…

Copliot:让你一秒变身网页达人的神奇助手

Copliot&#xff1a;一款能够帮助你快速理解网页内容的智能助手 你是否有过这样的经历&#xff0c;当你浏览网页时&#xff0c;遇到了一些你不太了解的内容&#xff0c;比如一些专业术语&#xff0c;一些复杂的概念&#xff0c;或者一些有趣的话题&#xff1f;你是否想要快速地…

代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言 本期我们来解决动规的经典题型------ 子数组问题 我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲 1.明确dp数组含义 2.明确dp数组如何推导-递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组排错 LeetCode T300 最长递增子序列 题目链接:300. 最长…

git分支管理以及不同git工作流对比

0、 单人开发场景 单人开发可能会出现的场景之一 如果多人协同开发我们则需要使用更加专业的工具Git&#xff08;分布式版本控制&#xff09; 1、多人协同工作使用git会出现什么问题? 代码冲突&#xff1a; 问题&#xff1a; 当多个开发者同时修改同一文件或同一行代码时…

SQL编写规范【干货】

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 获取所有软件开发资料&#xff1a;点我获取

TikTok女性创作者:媒体世界的新领袖

在数字时代&#xff0c;社交媒体已成为媒体和娱乐产业的关键组成部分&#xff0c;而TikTok作为最受欢迎的短视频分享平台之一&#xff0c;为女性创作者提供了一个独特的机会来在媒体世界中崭露头角。 这个平台不仅为女性创作者提供了一个创作和分享自己的声音、观点和创意的空…