2016-11-09 5 views
1

以下のコードは、MCUでのRTCの初期化に関連しています。MCUでのRTCの初期化 - グローバルコールバックを使用する理由

NULLrtc_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; 
+0

'global_rtc_cb'と' rtc_callback'を検索して、それぞれが呼び出された場所を正確に追跡しないのはなぜですか? ( 'rtc_callback'の場合は、関数' rtc_set_config'のコードに行き、 'cfg-> callback'の値がどこに格納されているのかを見なければなりません)。 –

答えて

1

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

+0

ありがとう、それは非常に有用な説明です。 –

関連する問題