0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony系统中 POSIX 定时器的使用方法

电子发烧友开源社区 来源:未知 2022-12-14 09:15 次阅读

本文将为您介绍关于POSIX定时器的相关知识点。因为要使用绝对时间,存在系统时间被调节的可能性,指定时间段内下发通知等需求,排除了jiffies相关的定时器、依赖于系统运行时间的定时器、alarm这些简单定时器或延时类定时器,最终用了POSIX提供的这组定时API。POSIX定时器是比较简单的,关键在于学习API的使用。

它依赖于墙上时间,能够适应本地时间更新、支持纳秒级精度,还能通过sigevent事件灵活控制通知进程,当然也有实现难度和通用性的考虑,其完美的包含了上述的所有需求点。

1.定时器依赖

Linux中,调用该组API需添加librt函数库,但我们毕竟使用的是OpenHarmony,优越性总是有的。librt这种基础的函数库,连BUILD.gn都不需要配置,直接引用头文件time.h与signal.h调用就可以,其在prebuilts时,就已经处理完成。

2.定时器创建

#include
#include
union sigval {
int sival_int;
void *sival_ptr;
};
struct sigevent {
int sigev_notify;
int sigev_signo;
union sigev_value;
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};
int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);

(左右移动查看全部内容)

函数timer_create()创建一个定时器,仅创建,并未启动定时任务。

参数

clockid用于标明一组时钟,现存时钟如下:

  • CLOCK_REALTIME:系统级时钟,用于度量真实时间

  • CLOCK_MONOTONIC:系统启动后不会发生改变,时钟对时间的测量始于系统启动。

CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID以及Linux2.6.28新增CLOCK_MONOTONIC_RAW以及Linux2.6.35新增CLOCK_REALTIME_COARSE和CLOCK_MONTIC_COARSE时钟也都可应用于clockid。

evp指定定时器超时产生事件类型,sigevent用于发出异步通知。

  • sigev_notify:指定异步事件发生时使用的通知机制

  • SIGEV_NONE :无事发生

  • SIGEV_SIGNAL:产生指定信号,信号量处理通知函数。sigev_value将会通过siginfo_t参数传递到处理函数

  • SIGEV_THREAD :创建线程sigev_notify_function。sigev_value将作为参数传入函数。sigev_notify_attributes指定线程的属性,如果其值为NULL,则属性同PTHREAD_CREATE_DETACHED,线程创建后就分离。

timerid返回计时器id,唯一标识当前计时器。

返回值:

函数调用成功,返回0,并设置timerid为新创建的定时器id。如果发生错误,则返回-1,并设置errno。

3.定时器操作

#include
#include
union sigval {
int sival_int;
void *sival_ptr;
};
struct sigevent {
int sigev_notify;
int sigev_signo;
union sigev_value;
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};
int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);

(左右移动查看全部内容)

以上三个函数用于控制和查看timerid指定的定时器

  • 函数timer_getoverrun()返回定时器的溢出计数。

  • 函数timer_getoverrun()得到下一次超时的剩余时间和每一次的超时间隔,itimerspec结构用于保存相关信息

  • 函数timer_settime()启动定时器,并按照itimerspec结构指定的时间运行定时器。it_value指定第一次超时时间,it_interval以从第一次超时时间起进行间隔超时调用。

Tips:

  • it_value为0,定时器关闭并停止

  • 如果it_interval为0,则定时器只运行一次

  • it_value设置的时间属于过去时间时,会当即触发通知事件。

【天坑】:当参数flags设置为TIMER_ABSTIME,且clockid选择CLOCK_REALTIME,则it_value的第一次超时时间被看做绝对时间。(绝对时间开始于格林威治时间1970年1月1日(0000 GMT))。该信息结合Tips第三条来看,当设置的时间小于GMT到当前的秒数时,你总会发现,自己设置的定时器立即被启动了。这个it_value值比较大,且随时间流逝而变化,这时与屏幕面面相觑的自己,一定是崩溃的。

4.定时器删除

#include
int timer_delete(timer_t timerid);

(左右移动查看全部内容)

函数timer_delete()用于删除指定的计时器。

Tips:

同进程时sigev_notify_function函数不仅可以删除自己的定时器,也可以删除友军定时器。

总结:

本文章主要介绍了OpenHarmony系统中,基于某些特殊应用场景,要求精准度更高的定时器时,引入POSIX组件、POSIX组件提供创建、操作以及删除一个定时器的API,通过对这三种API的使用解析,让用户方便在OpenHarmony系统中开发使用POSIX定时器,满足不同场景下对定时器的需求。

更多热点文章阅读
  • DevEco Studio 3.1差异化构建打包,提升多版本应用开发效率
  • 首个OpenHarmony 5G手机适配进展
  • 鸿湖万联启鸿开发板体验:动画效果的制作
  • 快速学会RK系列 Wi-Fi 业务代码编译配置
  • 中软国际工业中控屏通过OpenHarmony兼容性测评

提示:本文由电子发烧友社区发布,转载请注明以上来源。如需社区合作及入群交流,请添加微信EEFans0806,或者发邮箱liuyong@huaqiu.com。


原文标题:OpenHarmony系统中 POSIX 定时器的使用方法

文章出处:【微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电子发烧友
    +关注

    关注

    33

    文章

    546

    浏览量

    32359
  • 开源社区
    +关注

    关注

    0

    文章

    92

    浏览量

    342

原文标题:OpenHarmony系统中 POSIX 定时器的使用方法

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件
    的头像 发表于 04-29 11:00 85次阅读

    定时器会阻塞线程吗 定时器指令有哪几种

    定时器会阻塞线程吗 定时器指令有哪几种  定时器一般不会阻塞线程,但具体是否会阻塞取决于所使用的定时器实现方式和使用方式。 定时器指令可以分
    的头像 发表于 12-19 14:03 525次阅读

    STM32定时器时间计算方法

    STM32微控制器的定时器模块在嵌入式系统中非常常见,它被用于产生精确的时间延迟,或者用于实时时钟(RTC)等功能。为了充分利用STM32的定时器功能,理解其时间计算方式是非常重要的。下面,我们
    的头像 发表于 12-19 11:31 4042次阅读

    CKS32F4xx系列MCU SysTick定时器的原理及使用方法

    本课将为大家讲解CKS32F4xx系列产品的SysTick定时器原理及使用方法。SysTick定时器也叫SysTick滴答定时器,属于Cortex-M4内核外设。SysTick
    的头像 发表于 12-18 09:21 535次阅读
    CKS32F4xx系列MCU SysTick<b class='flag-5'>定时器</b>的原理及<b class='flag-5'>使用方法</b>

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数
    的头像 发表于 11-09 17:38 551次阅读
    CKS32F4xx系列产品Timer的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定时器</b>脉冲计数

    定时器设计实现

    (mTimerTickThread、mTimerCallbackThread)分别用于时间处理和函数回调。 可以使用TimerManager的create方法创建多个定时器,每次创建的定时器ID会累加
    的头像 发表于 11-08 16:50 278次阅读

    示AT32F系列TMR 32位定时器使用方法

    AT32F系列32位定时器演示AT32F系列TMR 32位定时器使用方法
    发表于 10-27 08:29

    定时器定时启动信号特点

    定时器定时启动信号特点  定时器是一种常用的计时器,可以在指定的时间后发出信号。它们在各种电器、仪器和控制系统中被广泛应用。 定时器
    的头像 发表于 10-24 11:49 395次阅读

    定时器中断程序怎么写

    定时器中断程序怎么写  在嵌入式系统中,定时器被广泛应用于各种任务。它们在实时系统中可用于轮询,计时等任务。定时器可以被配置为周期性
    的头像 发表于 09-01 10:17 1193次阅读

    使用定时器PWM输出功能的方法

    PWM(脉冲宽度调制)可用于电机的调速、LED的亮度调节、无源蜂鸣器输出音调等,是嵌入式系统开发中经常采用的方法。本期内容以一个用无源蜂鸣器播放音乐的例子,带领大家了解使用定时器PWM输出功能的
    发表于 08-16 06:13

    STM32定时器(二)定时器中断

    常规定时器:基本定时器TIM6&TIM7)、通用定时器(TIM2~TIM5,TIM9~TIM14)、高级定时器(TIM1&TIM8)
    的头像 发表于 07-21 14:54 1876次阅读
    STM32<b class='flag-5'>定时器</b>(二)<b class='flag-5'>定时器</b>中断

    STM32F407 基本定时器使用

    介绍STM32F407基本定时器的配置方法,分别介绍轮询方式、中断方式使用定时器完成定时
    的头像 发表于 07-06 14:32 2128次阅读
    STM32F407 基本<b class='flag-5'>定时器</b>使用

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    上一章我们介绍了CKS32F4的通用定时器定时操作的使用方法,这一章我们将向大家介绍通用定时器作为定时器脉冲计数的使用。在本章中,我们将用T
    的头像 发表于 06-05 09:39 538次阅读
    CKS32F4xx系列产品Timer的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定时器</b>脉冲计数

    STM32CubeMx定时器基本使用方法

    具体配置如下图:激活需要使用到的外设定时器,当系统时钟频率为64MHz时,我们希望1MS发生中断一次;就可以把时钟的预分频系数设置为64-1;计数周期设置为1000-1;计数方式为 Up 向上计数,此时得到的中断频率为:64,000,000 /64 /1000 = 1MS
    发表于 06-01 14:17 922次阅读
    STM32CubeMx<b class='flag-5'>定时器</b>基本<b class='flag-5'>使用方法</b>

    什么是软件定时器?软件定时器的实现原理

    软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的
    的头像 发表于 05-23 17:05 1871次阅读