LinuxデバイスでRTCアラームを設定しようとしています。RTCドキュメントの例を使用しました:
int retval
struct rtc_time rtc_tm;
/* .... */
/* Read the RTC time/date */
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
if (retval == -1) {
exit(errno);
}
/* Set the alarm to 5 sec in the future, and check for rollover */
rtc_tm.tm_sec += 5;
if (rtc_tm.tm_sec >= 60) {
rtc_tm.tm_sec %= 60;
rtc_tm.tm_min++;
}
if (rtc_tm.tm_min == 60) {
rtc_tm.tm_min = 0;
rtc_tm.tm_hour++;
}
if (rtc_tm.tm_hour == 24)
rtc_tm.tm_hour = 0;
retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
if (retval == -1) {
exit(errno);
}
このコードスニペットは(エポックスタートからの)絶対時間を使用しており、私には機能しませんでした。これはハードウェアのバグによるものだと思いましたが、一見ランダムな時間の後にアラームが鳴りました。私が見つけた他の唯一のドキュメントは、rtc.ccのコメントでした:
case RTC_ALM_SET: /* Store a time into the alarm */
{
/*
* This expects a struct rtc_time. Writing 0xff means
* "don't care" or "match all". Only the tm_hour,
* tm_min and tm_sec are used.
*/
時間、分、秒のみが使用されているという事実は、時間がioctlが呼び出された瞬間に関連していることを示唆しています。
ioctl(fd、RTC_ALM_SET、&rtc_tm)に渡される時間は相対的ですか、それとも絶対的ですか?