1

以下のコードは、MCU の RTC の初期化に関連しています。

NULLに渡してからそれに等しいrtc_init()グローバルコールバックを設定するための合理性を誰かが知っているでしょうか。global_rtc_cb

rtc_callback構造体で定義され、コールバックとして使用される 他の関数がある場合、なぜグローバルコールバックを使用するのでしょうか。

int main() {
rtc_init(NULL);   
} 

//-----------------------------------------------------------------
void ( * global_rtc_cb)(void *);  

int rtc_init(void (*cb)(void *)) {
rtc_config_t cfg;

  cfg.init_val = 0;
  cfg.alarm_en = true;
  cfg.alarm_val = ALARM;
  cfg.callback = rtc_callback;
  cfg.callback_data = NULL;

  global_rtc_cb = cb;

  irq_request(IRQ_RTC_0, rtc_isr_0);
  clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK);
  rtc_set_config(QM_RTC_0, &cfg);

  return 0;
}

//---------------------------------------------------------------------
/**
 * RTC configuration type.
 */
typedef struct {
    uint32_t init_val;  /**< Initial value in RTC clocks. */
    bool alarm_en;      /**< Alarm enable. */
    uint32_t alarm_val; /**< Alarm value in RTC clocks. */

    /**
     * User callback.
     *
     * @param[in] data User defined data.
     */
    void (*callback)(void *data);
    void *callback_data; /**< Callback user data. */
} rtc_config_t;
4

1 に答える 1

1

rtc_関数は RTC ドライバーの一部です。RTC ドライバーには、コールバックを促すイベントが発生したときに行うドライバー固有の処理があります。このドライバー固有のものは で発生しrtc_callbackます。ただし、イベントが発生したときにアプリケーションが実行する必要のあるアプリケーション固有の処理が他にもある場合があります。アプリケーション固有のものは、ドライバー内ではなく、アプリケーション層で実行する必要があります。そのため、アプリケーションがイベントに応答して何かを行う必要がある場合は、 へのコールバックを提供できますrtc_init。イベントが発生したときにドライバー固有のものとアプリケーション固有のものの両方が実行されるように確実にrtc_callback呼び出します。global_rtc_cbどうやら特定のアプリケーションはこのイベントに対して何もする必要がないため、NULL をに渡します。rtc_init. ただし、同じドライバーを使用する別のアプリケーションがコールバック関数を提供する場合があります。

于 2016-11-09T12:27:52.537 に答える