Alarm 工作原理(C++)

本文详细介绍了Android NativeAlarm的实现原理,包括如何使用timerfd和epoll实现定时唤醒功能,以及如何通过ioctl设置RTC系统时间以确保断电后时间的恢复。核心操作涉及android_server_AlarmManagerService_init函数、AlarmImpl类以及相关系统调用,如settimeofday和ioctl。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

概叙

Native Alarm 承担了两部分功能:

  • 实现定时唤醒功能。
  • 设置系统时间(包括 RTC 时间)。

定时唤醒是通过 timerfd 和 epoll 配合完成。设置 RTC 时间则是通过直接控制 rtc 驱动完成。

定时实现

首先调用 android_server_AlarmManagerService_init 函数实现 timerfd 和 epoll 初始化:

static jlong android_server_AlarmManagerService_init(JNIEnv*, jobject)
{
   
   
    ...
    epollfd = epoll_create(fds.size());
    ...
    for (size_t i = 0; i < fds.size(); i++) {
   
   
        fds[i] = timerfd_create(android_alarm_to_clockid[i], TFD_NONBLOCK);
        ...
    }

    AlarmImpl *ret = new AlarmImpl(fds, epollfd, wall_clock_rtc());

    for (size_t i = 0; i < fds.size(); i++) {
   
   
        epoll_event event;
        event.events = EPOLLIN | EPOLLWAKEUP;
        event.data.u32 = i;
        int err = epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i], &event);
        ...
    }

    ...

    return reinterpret_cast<jlong>(ret);
}

其中 android_alarm_to_clockid 定义如下:

static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = {
   
   
    CLOCK_REALTIME_ALARM,
    CLOCK_REALTIME,
    CLOCK_BOOTTIME_ALARM,
    CLOCK_BOOTTIME,
    CLOCK_MONOTONIC,
    CLOCK_REALTIME,
};

android_server_AlarmManagerService_init 函数主要以下工作:

  • 通过 timerfd_create 函数创建 android_alarm_to_clockid 中预定义的定时器,并将其加入到 epoll 中。
  • 构造 Native Alarm 对象 (AlarmImpl),由其代理 Native Alarm 的功能。

AlarmManagerService java 部分通过调用 set 函数来设置闹钟,相应的 Native 的 android_server_AlarmManagerService_set 函数会被调用,此函数会调用 AlarmImpl 的 set 函数:

int AlarmImpl::set(int type, struct timespec *ts)
{
   
   
    if (

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻滚吧香香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值