1

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)に渡される時間は相対的ですか、それとも絶対的ですか?

4

1 に答える 1

1

RTC アラームは絶対時間で動作します。つまり、アラームを 5 分で鳴らしたい場合は、現在の時刻を読み取り、現在の時刻に 5 分を加算し、その結果を使用してアラーム時刻を設定する必要があります。

以下は、TI RTC チップのドキュメントから抜粋したテキストです: (http://www.ti.com/lit/ds/symlink/bq3285ld.pdf)

各更新サイクル中に、RTC は日、時、分、および秒のバイトを、対応する 4 つのアラーム バイトと比較します。すべてのバイトの一致が見つかった場合、レジスタ C のアラーム割り込みイベント フラグ ビット AF が 1 に設定されます。アラーム イベントが有効な場合、割り込み要求が生成されます。

これは、RTC全体でかなり標準的であると思います...

于 2012-09-11T20:08:15.063 に答える