2016-11-09 1 views
1

Код ниже связан с инициализацией RTC в MCU.Идентификация RTC в MCU - зачем использовать глобальный обратный вызов

Кто-нибудь знает рациональное прохождение 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; 
+0

Почему вы не ищете «global_rtc_cb» и «rtc_callback» и не отслеживаете, где именно вызывается каждый из них? (в случае 'rtc_callback' вам нужно будет войти в код функции' rtc_set_config' и посмотреть, где хранится значение 'cfg-> callback'). –

ответ

1

В rtc_ функции являются частью драйвера RTC. Драйвер RTC имеет что-то специфичное для драйвера, когда происходит событие, запрашивающее обратный вызов. Этот конкретный драйвер происходит в rtc_callback. Но также могут быть другие приложения, которые приложение должно делать, когда происходит событие. Конкретные приложения должны выполняться на уровне приложения, а не внутри драйвера. Поэтому, если приложение имеет что-то делать в ответ на событие, оно может обеспечить обратный вызов rtc_init. Разумеется, rtc_callback вызывает global_rtc_cb, так что при возникновении события выполняются как специфичные для драйвера материалы, так и специфичные для приложения. Очевидно, что ваше конкретное приложение не должно ничего делать для этого события, поэтому оно пропускает NULL до rtc_init. Но другое приложение, использующее один и тот же драйвер, может обеспечить функцию обратного вызова.

+0

Спасибо, что очень полезно описание. –