【发布时间】:2020-11-11 08:36:28
【问题描述】:
我在看这个例子: 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*)&imu_bus;
函数指针void handle在任何地方都没有定义的时候有什么作用?此代码构建顺便说一句
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;
}
只是想知道这里发生了什么。
【问题讨论】:
-
dev_ctx_imu.write_reg = platform_write_imu;这是您要问的声明吗?如果是,那么它不是调用,它只是在那里存储/分配函数的地址,然后在需要时它将被称为dev_ctx_imu.write_reg(handle, reg, bufp,t len) -
电话在哪里?
dev_ctx_imu.write_reg = platform_write_imu;是赋值,把函数指针赋值给一个变量,不是函数调用。 -
void *handle不是函数指针。它是一个指向无效数据的指针。 -
dev_ctx_imu.write_reg = platform_write_imu;不是调用,而是将函数(指针)分配到左侧。