2016-10-21 9 views
1

以下のコードは、mcuでリアルタイムクロックを使用する方法の例です。mcu関数ポインタとコールバック上のRTC

私の質問は、コールバックと関数ポインタに関連しています。

下記のrtc_config_tの構造体宣言が含まれています。

私の質問は&記号がrtc_example_callback前に使用されていないのはなぜラインcfg.callback = rtc_example_callback

  1. に、です。

  2. なぜ引数をrtc_example_callbackに渡す必要はありませんか?

  3. 最後の構造体メンバvoid *callback_data;NULLに設定されていますが、これは何をするのでしょうか? いつ、何を返送しますか?ご入力の

多くの戦車

#include "rtc.h" 
#include "interrupt.h" 
#include "isr.h" 

#define ALARM (QM_RTC_ALARM_MINUTE/6) 
#define MAX_RTC_FIRINGS (5) 

void rtc_example_callback(void *); 

static volatile uint32_t rtc_fired = 0; 

/* RTC app example */ 
int main(void) 
{ 
    /* Variables */ 
    rtc_config_t cfg; //create a struct variable to configure the RTC 

    PRINTF("Starting: RTC\n"); 

    /* Initialise RTC configuration */ 
    cfg.init_val = 0; 
    cfg.alarm_en = true; 
    cfg.alarm_val = ALARM; 
    cfg.callback = rtc_example_callback; 
    cfg.callback_data = NULL; 

    irq_request(IRQ_RTC_0, rtc_isr_0); //submit the RTC to the interrupt service routine 

    clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK); //switch on RTC and Periphal clock 

    rtc_set_config(RTC_0, &cfg); //Set the RTC configuration 

    /* Wait for RTC to fire 5 times and then finish. */ 
    while (rtc_fired < MAX_RTC_FIRINGS) { 
    } 

    PRINTF("Finished: RTC\n"); 
    clk_periph_disable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK); //turn off the clocks 
    return 0; 
} 

void rtc_example_callback(void *data) 
{ 
    PUTS("Alarm!!\n"); 
    qm_rtc_set_alarm(RTC_0, (RTC[RTC_0].rtc_ccvr + ALARM)); 
    rtc_fired++; 
} 
----------------------------------------------------------------------- 

/** 
* 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; 

答えて

1
  1. 関数の名前は、関数へのポインタである
  2. 機能は(あなたがそれを起動していない、RTCライブラリからの引数で呼び出されますここで引数を渡すことはできません)。
  3. 私は、カスタムコールバックを使用したくない場合は、custom_callbackに割り当てられたNULLがライブラリからカスタムメソッドを呼び出さない(デフォルト関数または関数が呼び出されない)と思います。

通常、ライブラリのコードは次のようになります。あなたが最初の二つの権利を得た

if(custom_callback) 
{ 
    custom_callback(some_parameters); 
} 
else 
{ 
    default_callback(some_parameters); 
} 
+0

。しかし、NULLに設定されている 'custom_callback'ではなく' callback_data'です。これは単に、RTCライブラリからコールされたときにNULLポインタがコールバック関数に渡されることを意味します。 – kkrambo

関連する問題