谷动谷力

 找回密码
 立即注册
查看: 1068|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-12-14 16:58:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
OpenHarmony系统中 POSIX 定时器的使用方法

本文将为您介绍关于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日(00:00:00 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定时器,满足不同场景下对定时器的需求。
+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-4-28 04:13 , Processed in 0.115233 second(s), 39 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表