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 回答