鸿蒙Hi3861学习六-Huawei LiteOS-M(软件定时器)

news2024/9/23 11:46:33

一、简介

        软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick时钟计数值后,会触发用户定义的回调函数。定时精度与系统Tick时钟周期有关。

        硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此,为了满足用户需求,提供更多的定时器,LiteOS提供软件定时器功能。

        软件定时器扩展了定时器的数量,允许创建更多的定时业务。

        软件定时器功能上支持:

  • 静态裁剪:能通过宏关闭软件定时器功能。
  • 软件定时器创建
  • 软件定时器启动
  • 软件定时器停止
  • 软件定时器删除
  • 软件定时器剩余Tick数获取

        更多概念可以参考:FreeRTOS学习六(软件定时器)_freertos 执行定时器回调函数的内存消耗将是在定时器任务堆栈上动态分配_t_guest的博客-CSDN博客

        Timer Management

二、运作机制

        软件定时器使用了系统的一个队列一个任务资源,软件定时器的触发遵循队列规则,先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。

        软件定时器以Tick为基本计时单位,当用户创建并启动一个软件定时器时,LiteOS会根据当前系统Tick时间寄用户设置的定时间隔确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。

        当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,看是否有定时器超时,若有则将超时的定时器记录下来。

        Tick中断处理函数结束后,软件定时器任务(优先级最高)被唤醒,在该任务中调佣之前记录下来的定时器的超时回调函数

三、API介绍

      osTimerNew

        函数功能

        创建一个软件定时器

        函数原型

osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr)

        参数

        func:超时回调函数

        type:运行模式

osTimerOnce0,单次
osTimerPeriodic1,周期

        argument:传给定时器的参数。没有填NULL

        attr:定时器相关属性。自定义地址的时候会用到。大部分情况用不到,填NULL。

        返回值

        NULL:失败

        其他值:osTimerId_t类型的定时器ID。该ID给其他函数使用

        实例

osTimerPeriodic
char timer1_param[] = "timer1 param";
g_timer1_id = osTimerNew(Timer1_Callback, osTimerPeriodic, timer1_param, NULL);

      osTimerStart

        函数功能

        软件定时器启动

        函数原型

osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks)

        参数

        timer_id:软件定时器ID,创建时osTimerNew获得

        ticks:软件定时器的定时周期。对于Hi3861,定时器单位为10ms

        返回值

        osOK:成功

        其他值:失败

typedef enum {
  /** Operation completed successfully */
  osOK                      =  0,
  /** Unspecified error */
  osError                   = -1,
  /** Timeout */
  osErrorTimeout            = -2,
  /** Resource error */
  osErrorResource           = -3,
  /** Incorrect parameter */
  osErrorParameter          = -4,
  /** Insufficient memory */
  osErrorNoMemory           = -5,
  /** Service interruption */
  osErrorISR                = -6,
  /** Reserved. It is used to prevent the compiler from optimizing enumerations. */
  osStatusReserved          = 0x7FFFFFFF
} osStatus_t;

        实例

osTimerId_t g_timer1_id;
timerDelay = 100U;
status = osTimerStart(g_timer1_id, timerDelay);

      osTimerStop

        函数功能

        软件定时器停止

        函数原型

osStatus_t osTimerStop(osTimerId_t timer_id)

        参数

        timer_id 定时器ID

        返回值

        osOK:成功

        其他值:失败

        实例

osTimerId_t g_timer1_id;
osTimerStop(g_timer1_id);

      osTimerDelete

        函数功能

        软件定时器删除

        函数原型

osStatus_t osTimerDelete(osTimerId_t timer_id)

        参数

        timer_id 定时器ID

        返回值

        osOK:成功

        其他值:失败

        实例

osTimerId_t g_timer1_id;
osTimerDelete(g_timer1_id);

四、代码实例

        此代码创建两个软件定时器,定时器1为循环定时器,定时器2为单次定时器

#define LOG_I(fmt, args...)   printf("<%8ld> - [TIMER]:"fmt"\r\n",osKernelGetTickCount(),##args);
#define LOG_E(fmt, args...)   printf("<%8ld>-[TIMER_ERR]>>>>>>>>>>>>:"fmt"\r\n",osKernelGetTickCount(), ##args);

osTimerId_t g_timer1_id;
osTimerId_t g_timer2_id;

/***** 定时器1 回调函数 *****/
void Timer1_Callback(void *arg)
{
    static uint8_t cnt = 0;
    LOG_I("timer1 callback,cnt:%d,param:%s",cnt,arg);
    if(cnt++ > 10)
    {
        osTimerDelete(g_timer1_id);
        LOG_I("timer1 delete");
    }
    else if(cnt == 3)
    {
        osTimerStop(g_timer1_id);
        LOG_I("timer1 stop and restart timer2");
        osTimerStart(g_timer2_id, 500);
    }
}

/***** 定时器2 回调函数 *****/
void Timer2_Callback(void *arg)
{
    LOG_I("timer2 callback,param:%d",*(uint32_t *)arg);

    osTimerStart(g_timer1_id, 100);
    LOG_I("start timer1");
}

char timer1_param[] = "timer1 param";
uint32_t timer2_param = 1024;

void Hello_World(void)
{
    LOG_I("Test software Timer");

    uint32_t timerDelay;
    osStatus_t status;

/*timer 1*/
    g_timer1_id = osTimerNew(Timer1_Callback, osTimerPeriodic, timer1_param, NULL);
    if (g_timer1_id != NULL)
    {
        // Hi3861 1U=10ms,100U=1S
        timerDelay = 100U;

        status = osTimerStart(g_timer1_id, timerDelay);
        if (status != osOK)
        {
            LOG_E("timer1 start error");        
        }
        else
        {
            LOG_I("timer1 start success,cycle:%dms",timerDelay * 10);
        }
    }
    else
    {
        LOG_E("timer1 create fail!!!");
    }

/*timer 2*/
    g_timer2_id = osTimerNew(Timer2_Callback, osTimerOnce, (void *)&timer2_param, NULL);
    if (g_timer2_id != NULL)
    {
        // Hi3861 1U=10ms,100U=1S
        timerDelay = 500U;

        status = osTimerStart(g_timer2_id, timerDelay);
        if (status != osOK)
        {
            LOG_E("timer2 start error");
        }
        else
        {
            LOG_I("timer2 start success,cycle:%dms",timerDelay * 10);
        }
    }
    else
    {
        LOG_E("timer2 create fail!!!");
    }
}

        定时器1为循环定时器,循环周期为1秒,定时器2为单次定时器,超时时间为5秒。两个定时器同时启动。在定时器1第三秒的时候,会停止自己,并且重新启动定时器2。定时器2超时后会重新启动定时器1。定时器1在第10次时会删除自己。

        看运行结果:

         可以看到,虽然定时器2在运行,但是如果此时再次调用osTimerStart来启动定时器2,会刷新定时器的超时时间

        这里我们用软件打印当前的时间戳,来看一下1秒的定时周期是否准确。

         可以看到1秒的定时还是很准的。

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

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

相关文章

如何监控软件定义的数据中心(SDDC)

网络管理不仅要防止网络停机&#xff0c;还要优化网络性能&#xff0c;最终增强最终用户体验。当今的网络变得如此先进&#xff0c;以至于传统模型已经过时&#xff0c;无法满足现代动态需求。用日益敏捷、安全、可扩展和可靠的现代可部署解决方案取代传统的遗留系统至关重要。…

企业遭受勒索攻击后,要支付赎金吗?

企业遭受勒索攻击后&#xff0c;要支付赎金吗&#xff1f; 针对这个问题的答案&#xff0c;一些企业选择了“不要”。例如&#xff1a;意大利法拉利公司拒绝向黑客支付赎金&#xff1b;蔚来汽车老板拒绝支付1500万的赎金&#xff1b;澳洲最大医保公司在被盗取970万客户信息后&a…

关于《永恒之塔私服》收费模式的大胆猜想

我们都知道从第一个网络游戏走进中国时就已经使用了点卡模式的收费方式,但是随着游戏行业的快速发展,这种点卡模式的游戏也渐渐快要退出游戏收费的平台,也随着越来越多的游戏加入到中国的游戏市场也导致了游戏的竞争也越来越大,游戏公司也挖空心事来吸引玩家,为了吸引玩家2004年…

景23转债,海能转债上市价格预测

景23转债 基本信息 转债名称&#xff1a;景23转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;11.54亿元。 正股名称&#xff1a;景旺电子&#xff0c;今日收盘价&#xff1a;22.52元&#xff0c;转股价格&#xff1a;25.71元。 当前转股价值 转债面值 / …

汉诺塔+小青蛙跳台阶---《递归》

目录 前言&#xff1a; 1.汉诺塔&#xff1a; 1.1分析盘子数从1-3的情况 1.2盘子移动的规律总结 2.青蛙跳台阶&#xff1a; 2.1跳一个台阶或跳两个台阶 2.2扩展 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打…

asp.net+C#教育机构高校教务管理系统

1.1用户类别 本系统分为3个角色&#xff1a;管理员、教师、学生&#xff1b; 1、管理员权限最大&#xff0c;排课、调课、汇总各类考试成绩、管理各类用户基本信息&#xff0c;以及各类查询统计、发布公告、收发邮件等功能&#xff1b; 2、教师查看自己的信息、修改登陆密码…

[C++]C++入门(一)

目录 前言&#xff1a; 一、C关键字&#xff1a; 二、命名空间&#xff1a; 三、C输入和输出&#xff1a; 四、缺省参数&#xff1a; 五、函数重载&#xff1a; 六、引用&#xff1a; 常引用&#xff1a; ​编辑引用和指针的区别&#xff1a; 引用和指针的不同点&…

九联UNT401H-Hi3798MV300/MV310-当贝纯净桌面-强刷卡刷固件包

九联UNT401H-Hi3798MV300&#xff0f;MV310-当贝纯净桌面-强刷卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置…

达摩院开源多模态对话大模型mPLUG-Owl

miniGPT-4的热度至今未减&#xff0c;距离LLaVA的推出也不到半个月&#xff0c;而新的看图聊天模型已经问世了。今天要介绍的模型是一款类似于miniGPT-4和LLaVA的多模态对话生成模型&#xff0c;它的名字叫mPLUG-Owl。 论文链接&#xff1a;https://arxiv.org/abs/2304.14178…

《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

文章目录 一、验证说明二、Etherscan Key三、验证插件四、源码认证4.1 Remix验证&#xff08;推荐&#xff09;4.1.1 无构造参数合约验证4.1.2 有构造参数合约验证 4.2 单文件验证&#xff08;不推荐&#xff09;4.3 Hardhat部署&#xff08;按照需要&#xff09; 五、验证结果…

( 位运算 ) 461. 汉明距离 ——【Leetcode每日一题】

❓461. 汉明距离 难度&#xff1a;简单 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1…

Python 字典修改对应的键值

将 key ‘1’ 的值 ‘1’, ‘3’, ‘5’ 字符&#xff0c;修改为 ‘2’, ‘4’, ‘5’ 。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单………

Cy5.5 NHS ester 氨基反应性荧光染料Cyanine5.5 -NHS

Cy5.5 NHS ester是一种常用的荧光探针&#xff0c;可用于细胞或组织的荧光标记&#xff0c;也可用于蛋白质或核酸的标记。Cy5.5 NHS ester的荧光峰位于近红外区域&#xff0c;波长为675nm&#xff0c;具有较强的荧光强度和较长的荧光寿命&#xff0c;适合于生物分子在体内或组织…

用友nc软件被locked1勒索病毒攻击,解密恢复oracle数据库与用友nchome的配置文件

当用友NC软件被locked1勒索病毒攻击后&#xff0c;对应企业的oracle数据库和nchome配置文件往往也会受到影响。数据库和配置文件是企业运营的基础&#xff0c;一旦受到感染会导致企业无法正常运转。因此&#xff0c;遇到这种情况需要采取正确的方法来解密恢复对应的Oracle数据库…

手机日程提醒在哪里设置?

在每天要处理的各类事项比较多&#xff0c;且繁杂的情况下&#xff0c;想要有条不紊地安排好每个时间段应该完成的事项&#xff0c;提前设置好日程提醒是非常有必要的。 那么手机日程提醒在哪里设置呢&#xff1f;无论你使用的是小米、荣耀、OPPO等安卓手机&#xff0c;还是华为…

学顶教育:2023年中级经济师什么时候报名?

一、2023年中级经济师申请时间 2023年中级经济师报名时间预计7、8月左右开始&#xff0c;考试时间为11月11-12日。 届时考生可关注中国人事考试网发布的公告。 二、中级经济师网上报名需提供以下材料&#xff1a; 1、 准备一张白色背景的近期免冠照片&#xff0c;尺寸为25mm…

如何构建一个高效的企业舆情监测系统?

随着互联网的快速发展&#xff0c;企业需要对自身在网络上的形象和声誉进行全方位的监控和管理&#xff0c;以保证企业的长期稳定发展。构建一个高效的企业舆情监测系统已经成为了当下企业发展的必要手段。本文将通过国内具体案例分析&#xff0c;阐述如何构建一个高效的企业舆…

和月薪5W的聊过后,才发现自己一直在打杂···

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 我了解了下他的面试过程&#xff0c;就一点&#xff0c;不管是阿里还是腾讯的面试&#xff0c;这个级别的程序员&#xff0c;都会考察项目管理能力&#xff0c;并且权重…

SLAM论文速递:SLAM—(2021) 基于目标检测的动态环境下的视觉SLAM—5.05(1)

论文信息 题目&#xff1a; Visual SLAM in dynamic environments based on object detection 基于目标检测的动态环境下的视觉SLAM论文地址&#xff1a; https://www.sciencedirect.com/science/article/pii/S2214914720304402发表期刊&#xff1a; Defence Technology,&…

2019年上半年软件设计师下午试题

试题四(共 15 分) 阅读下列说明和 C 代码&#xff0c;回答问题 1 至 3&#xff0c;将解答写在答题纸的对应栏内 【说明】 n 皇后问题描述为&#xff1a;在一个 n*n 的棋盘上摆放 n 个皇后&#xff0c;要求任意两个皇后不能冲突, 即任意两个皇后不在同一行、同一列或者同一斜…