【问题标题】:Calling a function without parameters, but its defined to have parameters?调用一个没有参数的函数,但它定义为有参数?
【发布时间】: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; 不是调用,而是将函数(指针)分配到左侧。

标签: c stm32


【解决方案1】:
dev_ctx_imu.write_reg = platform_write_imu;
/* ... */

它为函数指针分配函数的地址。这不是电话。

函数指针void句柄不是时有什么作用 在任何地方定义?

它不是函数指针,只是一个指向 void 数据的指针。

只是想知道这里发生的顺序。

这只是一个普通的参数。没有任何序列。

顺便说一句,要对 uC 进行编程,您需要更好地学习 C。我的建议 - 学习使用你的 PC,当你理解指针、数组和函数指针时,再回到嵌入式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多