#c #pointers #callback #function-pointers #microcontroller
#c #указатели #обратный вызов #указатели на функции #микроконтроллер
Вопрос:
Приведенный ниже код является примером того, как использовать часы реального времени в mcu.
Мой вопрос касается обратных вызовов и указателей на функции.
Я включил объявление структуры для rtc_config_t
ниже.
Мой вопрос в том, на линии cfg.callback = rtc_example_callback
-
Почему
amp;
знак не используется перед rtc_example_callback. -
Почему нет необходимости передавать аргументы в
rtc_example_callback
? -
Для последнего элемента структуры
void *callback_data;
установлено значениеNULL
, я не понимаю, что это делает? Когда или что бы вы хотели вернуть?
Много резервуаров для ваших входных данных
#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: RTCn");
/* 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, amp;cfg); //Set the RTC configuration
/* Wait for RTC to fire 5 times and then finish. */
while (rtc_fired < MAX_RTC_FIRINGS) {
}
PRINTF("Finished: RTCn");
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:
- имя функции является указателем на функцию
- функция будет вызвана с аргументами из библиотеки rtc, вы ее не вызываете (вы не можете передавать аргументы здесь).
- Я предполагаю, что значение NULL, присвоенное custom_callback, не вызовет пользовательский метод из библиотеки (функция по умолчанию или функция вообще не будет вызвана), просто присвоите значение NULL, если вы не хотите использовать пользовательский обратный вызов.
обычно библиотечный код выглядит следующим образом:
if(custom_callback)
{
custom_callback(some_parameters);
}
else
{
default_callback(some_parameters);
}
Комментарии:
1. Вы правильно поняли первые два. Но это
callback_data
неcustom_callback
то, для чего устанавливается значение NULL. Это просто означает, что нулевой указатель будет передан функции обратного вызова при ее вызове из библиотеки RTC.