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

这篇具有很好参考价值的文章主要介绍了鸿蒙Hi3861学习六-Huawei LiteOS-M(软件定时器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

        软件定时器,是基于系统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:运行模式

osTimerOnce 0,单次
osTimerPeriodic 1,周期

        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次时会删除自己。

        看运行结果:

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

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

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

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

         可以看到1秒的定时还是很准的。文章来源地址https://www.toymoban.com/news/detail-445682.html

到了这里,关于鸿蒙Hi3861学习六-Huawei LiteOS-M(软件定时器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hi3861鸿蒙物联网项目实战:智能安防报警

    华清远见FS-Hi3861开发套件,支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能,开发板板载资源丰富,包括传感器、执行器、NFC、显示屏等,同时还配套丰富的拓展模块。开发板配套丰富的学习资料,包括全套开发教程、视频课程、7大项目实战案例 可以帮助学员系统性学

    2024年02月09日
    浏览(35)
  • 鸿蒙OS Hi3861的芯片实际开发中遇到的问题

    优点: 比较适合开发者快速开发,上面的硬件操作的函数封装很简单,非常适合初学者使用封装好的函数调用硬件管脚,比如I2c gpio spi sdio 都被封装了,特别简单,中文注释,而且还提供了无线wifi 的封装函数,当然也有http 解析啊什么的,可以使用在简单的物联网控制的简单

    2024年02月09日
    浏览(41)
  • 鸿蒙OS2.0 设备开发之Hi3861-基础功能汇总

    这是一篇讲解在 鸿蒙2.0全量源码中开发Hi3861 的常用功能汇总,可帮助我们 快速配置GPIO 如,如何实现 PWM、I2C、ADC 等。 1.1 输出 分两步,使能、配置输出值; 需要注意的是,有些GPIO还需要设置复用功能,可能默认不是普通GPIO模式。 这时候就需要使用 hi_io_set_func 函数;以

    2024年02月07日
    浏览(38)
  • 使用FS_Hi3861鸿蒙开发板编译时常见的一些问题

    本文档支持的是下面的产品 华清远见 FS-Hi3861 https://gitee.com/HiSpark/hi3861_hdu_iot_application/blob/master/src/vendor/hqyj/fs_hi3861/doc/%E5%8D%8E%E6%B8%85%E8%BF%9C%E8%A7%81%20FS_Hi3861%E5%BC%80%E5%8F%91%E6%8C%87%E5%AF%BC.md 目录 在添加第三方库完成后,再次编译报错,提示“undefined reference to ******” 编译的时候,

    2024年02月08日
    浏览(43)
  • HI3861学习笔记(12)——GPIO输入接口使用

    HI3861V100 芯片有 15 个 GPIO,引脚分布如下: 以下 GPIO 接口位于 baseiot_hardwareinterfaceskitswifiiot_litewifiiot_gpio.h 。 业务BUILD.gn中包含路径 功能 初始化GPIO外设 函数定义 unsigned int GpioInit(void) 参数 无 返回 错误码 功能 设置GPIO输出方向 函数定义 unsigned int GpioSetDir(WifiIotGpioIdx id,

    2024年02月09日
    浏览(32)
  • Hi3861开发环境搭建 ||避坑指南|| [适用于几乎所有以Hi3861为主控的开发板]

    前言: 这几天为了搭建Hi3861的开发环境,看了不少官方文档和视频,但是依然折腾了很久才配置好编译、上传都能正常的环境,这其中踩了不少坑,希望通过这篇文章能让大家少踩点。 当然其实主要问题还是源码更新、视频教程更新还有文档更新速度没匹配上 参考海思社区

    2024年02月05日
    浏览(47)
  • Hi3861 OpenHarmony 运行Hello World

    海思 hi3861 有2个型号:  Hi3861LV100 低功耗版 低功耗MCU Wi-Fi芯片,适用于智能门锁、智能猫眼等低功耗物联网智能产品。 Hi3861V100 标准版 MCU Wi-Fi芯片,适用于大小家电、电工照明等常电类物联网智能产品。 系统默认的是标准版,低功耗版好像是需要改下设置。越简单越好的原

    2024年02月20日
    浏览(30)
  • Hi3861 硬件 i2c 驱动 oled

    最近想用 3861 做个有意思的东西,记录一下开发过程。今天使用 3861 的硬件 i2c 驱动 oled。 硬件平台:Bearpi-Nano 软件SDK:润和sdk 我之前写过一篇基于 stm32cubemx 快速使用 iic 接口 oled 的过程,里面有现成的 oled 接口,我们只要直接拿过来替换掉底层接口就行。  STM32CubeMX驱动4脚

    2023年04月23日
    浏览(38)
  • Hi3861开发第一节:环境搭建,并顺利完成编译

    步骤一:下载devicetool-windows-tool-3.1.0.400.zip版,下载网址:https://device.harmonyos.c om/cn/develop/ide#download 步骤二:解压DevEco Device Tool压缩包,双击安装包程序,点击\\\"下一步\\\"进行安装(如果之前有 安装过,会弹出先卸载之前版本在安装,请按照要求先卸载); 步骤三:设置DevEco

    2024年02月09日
    浏览(30)
  • 鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

    【找到了一种简单易懂的实验实现方式,适合基础较薄弱的同学,见第二部分】 最终效果如下: 依次创建了3个任务线程,以One、Two、Three指代,时间分别为15秒、30秒、10秒。 如果按生成顺序输出应该是:One-Two-Three,但我们修改了OsPriQueueEnqueue函数,由原先的“先进先出”,

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包