MCU中的RTC初始化 - 为什么要使用全局回调

时间:2016-11-09 09:13:40

标签: c microcontroller real-time-clock

以下代码与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;

1 个答案:

答案 0 :(得分:1)

rtc_函数是RTC驱动程序的一部分。当提示回调的事件发生时,RTC驱动程序具有特定于驱动程序的功能。这个特定于驱动程序的内容发生在rtc_callback中。但是,当事件发生时,应用程序必须执行其他特定于应用程序的操作。应用程序特定的东西应该在应用程序层完成,而不是在驱动程序中完成。因此,如果应用程序有事情要做以响应事件,它可以提供对rtc_init的回调。当然rtc_callback调用global_rtc_cb,以便在事件发生时执行特定于驱动程序的内容和特定于应用程序的内容。显然,您的特定应用程序不需要为此事件执行任何操作,因此它将NULL传递给rtc_init。但是使用相同驱动程序的其他应用程序可能会提供回调函数。