μ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.hqwc.cn/news/176434.html

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

相关文章

Ansible playbook详解

playbook是ansible用于配置,部署,和被管理被控节点的剧本 playbook常用的YMAL格式:(文件名称以 .yml结尾) 1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。    2、在同一…

原型制作神器ProtoPie的使用Unity与网页跨端交互

什么是ProtoPie? ProtoPie是一款面向设计师的软件原型设计工具,例如制作App界面交互展示,制作好的原型可以一键发布到Web服务器,就可以浏览器访问。由于其内置了大量常用交互类型,以及"程序化"模块&#xf…

hash算法

一、Hash散列算法介绍 1.引言 每个人在这个社会上生存,都会有一个属于自己的标记,用于区分不同的个体。通常使用名字就可以了。但是一个名字也并不能完全表示一个人,因为重名的人很多。所以我们可以使用一个身份证号或者指纹来表示独一无二…

力扣每日一道系列 --- LeetCode 160. 相交链表

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 160. 相交链表 思路: 首先计算两个链表的长度,然后判断两个链…

Open X-Embodiment 超大规模开源真实机器人数据集分享

近期,Google旗下的前沿人工智能企业DeepMind汇集了来自 22 种不同机器人类型的数据,创建了 Open X-Embodiment 数据集并开源了出来。该数据集让他们研发的RT-2 机器人在制造和编程方式上有了重大飞跃。 有分析称,在上述数据集上训练的 RT-2-…

gpt-4-turbo、gpt-4v、dall-e-3 api实测!

上周GPT大更新,不仅开放了GPT-4-Turbo、GPT-4-Vision等模型api,还发布了GPTs,使得用户能够根据需要定义自己的GPT应用,OpenAI在这波AI革命上又一次震撼世人。 笔者也在上周拿到了几个新模型的api资格,一直盼着可以测试…

专业的SRM系统全流程管理服务

一、什么是SRM系统 SRM系统,即供应商关系管理,是供应链管理中的重要组成部分,帮助企业与供应商建立、维护和改善业务关系,以实现双方共赢。本文将从供应商寻源到合同签订、订单履行、到付款及供应商评价等环节,阐述SR…

【MybatisPlus】条件构造器、自定义SQL、Service接口

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MybatisPlus 一、条件构造器1.1 基于QueryW…

Python如何使用Matplotlib模块的pie()函数绘制饼形图?

Python如何使用Matplotlib模块的pie函数绘制饼形图? 1 模块安装2 实现思路3 pie()函数说明4 实现过程4.1 导入包4.2 定义一个类4.3 读取数据并处理4.4 定义饼图绘制方法 5 完整源码 1 模块安装 先安装matplotlib: pip install matplotlib安装numpy模块…

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

MySQL篇 update 没加索引会锁全表? 说个前提,接下来说的案例都是基于 InnoDB 存储引擎,且事务的隔离级别是可重复读。 假设有两个事务的执行顺序如下: 可以看到,事务 A 的 update 语句中 where 是等值查询&#xff…

简洁高效的微信小程序分页器封装实践

前言 在现今的移动应用开发中,微信小程序已经成为了一个备受欢迎的平台。然而,随着应用的复杂性增加,数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念:封装分页器,它是提升小程序性能和用户体验…

NOIR脑机接口机器人——让脑机接口通过少样本学习实现做家务的能力

一、概述 大脑与机器人接口(BRI)是人类艺术、科学和工程的集大成之作,其影响已经贯穿于无数科幻作品和创意艺术之中,如《黑客帝国》和《西部世界》等。然而,要真正实现BRI并创造出能够与人类完美协同运作的机器人系统…