码迷,mamicode.com
首页 > 系统相关 > 详细

Linux时间子系统之二:Alarm Timer

时间:2017-07-10 16:30:14      阅读:467      评论:0      收藏:0      [点我收藏+]

标签:UI   width   mda   需要   linux时间   static   一个   区分   gettime   

一、前言

严格来讲Alarm Timer也算POSIX Timer一部分,包含两种类型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM。分别是在CLOCK_REALTIME和CLOCK_BOOTTIME后面加上_ALARM。Alarm Timer之外的POSIX Timer在内核进入cpuidle或者suspend之后,都会因为省电关闭ClockEvent设备而停止计时。而Alarm Timer恰恰借助RTC设备的长供电且具备唤醒功能,在系统进入suspend过程中,将最近一次超时expires写入RTC设备,超时后会将系统从suspend状态唤醒,执行timer超市函数。

这样在程序执行过程中,就不需要一直持有wakelock。

二、背景介绍

Alarm Timer可以说工作在两种状态下,一种是和其他Timer一样的基于hrtimer;另一种是在系统进入suspend后基于RTC设备。

RTC设备在系统外独立供电,RTC具备Alarm功能。在Alarm触发后,通过中断唤醒suspend的系统。

在device_initcall-->alarmtimer_init时,注册一个alarmtimer的platform_device,驱动为alarmtimer_driver。将alarmtimer_suspend作为钩子函数插入系统suspend流程,这样就将suspend和Alarm Timer功能挂钩了。

三、重要数据结构

struct alarm_base作为AlarmTimer时钟类型结构体,包含ALARM_REALTIME和ALARM_BOOTTIME两种。

static struct alarm_base {
  spinlock_t lock;---------------------------------互斥访问锁
  struct timerqueue_head timerqueue;-------AlarmTimer自己维护了expires红黑树。
  struct hrtimer timer;--------------------------将其加入到hrtimer_bases对应的红黑树中。
  ktime_t (*gettime)(void);--------------------获取对应类型时钟的时间函数
  clockid_t base_clockid;------------------------时钟类型ID,CLOCK_REALTIME和CLOCK_BOOTTIME
} alarm_bases[ALARM_NUMTYPE];

CLOCK_REALTIME_ALARM和CLOCK_REALTIME、CLOCK_BOOTTIME_ALARM和CLOCK_BOOTTIME都是用同样的base_clockid,但是_ALARM维护的alarm_bases[ALARM_NUMTYPE].timerqueue将他们与其他hrtimer区分开了。

struct k_clock alarm_clock作为两种类型共用的时钟/Timer函数:

struct k_clock alarm_clock = {
  .clock_getres = alarm_clock_getres,
  .clock_get = alarm_clock_get,
  .timer_create = alarm_timer_create,
  .timer_set = alarm_timer_set,
  .timer_del = alarm_timer_del,
  .timer_get = alarm_timer_get,
  .nsleep = alarm_timer_nsleep,
};

 

static struct rtc_timer rtctimer;--------------------RTC Timer

static struct rtc_device *rtcdev;-------------------RTC设备对应的结构体

struct rtc_time是RTC设备表示的时间格式:

struct rtc_time {
  int tm_sec;
  int tm_min;
  int tm_hour;
  int tm_mday;
  int tm_mon;
  int tm_year;
  int tm_wday;
  int tm_yday;
  int tm_isdst;
};

struct ktime_t是内核时间格式。

这两种时间格式的转换,rtc_time到ktime_t通过rtc_tm_to_ktime;ktime_t到rtc_time通过rtc_ktime_to_tm。

四、AlarmTimer正常工作状态下运行

 

五、AlarmTimer在进入Suspend时、Suspend中、Resume时状态分析

 

Linux时间子系统之二:Alarm Timer

标签:UI   width   mda   需要   linux时间   static   一个   区分   gettime   

原文地址:http://www.cnblogs.com/arnoldlu/p/7145879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!