#c #stm32
#c #stm32
Вопрос:
Я смотрю на этот пример: https: //github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lsm9ds1_STdC
Я пытаюсь понять, как в приведенном ниже коде platform_write_imu вызывается без каких-либо параметров?
static int32_t platform_write_imu(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
static int32_t platform_read_imu(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
static int32_t platform_write_mag(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
static int32_t platform_read_mag(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
/* Main Example --------------------------------------------------------------*/
void lsm9ds1_read_data_polling(void)
{
stmdev_ctx_t dev_ctx_imu;
/* Initialize inertial sensors (IMU) driver interface */
dev_ctx_imu.write_reg = platform_write_imu;
dev_ctx_imu.read_reg = platform_read_imu;
dev_ctx_imu.handle = (void*)amp;imu_bus;
Какова роль дескриптора void указателя функции, когда он нигде не определен? Этот код строит BTW
static int32_t platform_write_imu(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len)
{
sensbus_t *sensbus = (sensbus_t*)handle;
#if defined(NUCLEO_F411RE)
HAL_I2C_Mem_Write(sensbus->hbus, sensbus->i2c_address, reg,
I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
#endif
return 0;
}
Просто хотелось бы знать, что здесь происходит с точки зрения последовательности.
Комментарии:
1.
dev_ctx_imu.write_reg = platform_write_imu;
это утверждение, о котором вы спрашиваете? если да, то это не вызов, а просто сохранение / присвоение адреса функции там, тогда при необходимости она будет вызываться какdev_ctx_imu.write_reg(handle, reg, bufp,t len)
2. И где этот вызов?
dev_ctx_imu.write_reg = platform_write_imu;
присваивание, присвоение указателя функции переменной, это не вызов функции.3.
void *handle
не является указателем на функцию. Это указатель на пустые данные.4.
dev_ctx_imu.write_reg = platform_write_imu;
это не вызов, а назначение функции (указателя) в левую часть.
Ответ №1:
dev_ctx_imu.write_reg = platform_write_imu;
/* ... */
Он присваивает указателям на функции адрес функции. Это не вызов.
Какова роль дескриптора void указателя функции, когда он нигде не определен?
Это не указатель на функцию, а только указатель на пустые данные.
Просто хотелось бы знать, что здесь происходит с точки зрения последовательности.
Это просто обычный параметр. Не имеет никакой последовательности.
Кстати, чтобы программировать UCS, вам нужно намного лучше изучить C. Мой совет — научитесь использовать свой компьютер, когда вы поймете, что указатели, массивы и указатели на функции хорошо возвращаются к встроенному.