关于mcu的RTC - 函数指针和回调

时间:2016-10-21 15:26:21

标签: c pointers callback function-pointers microcontroller

以下代码是如何在mcu上使用实时时钟的示例。

我的问题与回调和函数指针有关。

我在下面列出了rtc_config_t的结构声明。

我的问题是,cfg.callback = rtc_example_callback

  1. 为什么在rtc_example_callback之前未使用&符号。

  2. 为什么没有必要将参数传递给rtc_example_callback

  3. 最后一个结构memeber void *callback_data;设置为NULL,我不明白这是做什么的? 什么时候或者你想要什么?

  4. 许多坦克供你参考

    #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 个答案:

答案 0 :(得分:1)

  1. 该函数的名称是指向函数的指针
  2. 函数将使用来自rtc库的参数调用,您没有调用它(您不能在此处传递参数)。
  3. 我想分配给custom_callback的NULL不会从库调用自定义方法(默认函数或不会调用任何函数),如果你不想使用自定义回调,只需指定NULL。
  4. 通常库代码如下:

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