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

RTC initialisation in an MCU - why use a global callback

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

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