This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:在 TivaC 平台上取消引用 void * intfPtr

Guru**** 2502205 points
Other Parts Discussed in Thread: TM4C123GH6PM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1427240/tm4c123gh6pm-dereferencing-void-intfptr-on-tivac-platform

器件型号:TM4C123GH6PM

工具与软件:

您好!

我将 bmm350传感器代码移植到 Tiva-C 平台。

https://github.com/boschsensortec/BMM350_SensorAPI

作者利用函数指针和巧妙设计的结构在 C++中创建可在多种平台中工作的驱动程序。

但是、使用 tm4c123gh6pm 和 CCS 时、指针存在一些问题。 下面我们举例说明:

static int8_t bmm350I2cReadData(uint8_t Reg, uint8_t *Data, uint32_t len, void *intfPtr) {
    uint8_t deviceAddr = *(uint8_t*)intfPtr;
    I2C3Receive(deviceAddr, Reg, Data, len);
    return 0;
}

通过取消引用 void *intfPtr 获得的 deviceAddr 总是错误的、尽管"*(uint8_t*)intfPtr"似乎是正确的语法。

另一方面、这些参数(例如地址)加载如下:

    uint8_t devAddr;
    switch(interface) {
        case eBmm350InterfaceI2C:
            devAddr = BMM350_I2C_ADSEL_SET_LOW; // 0x14
            bmm350Sensor.intfPtr = &devAddr;
            break;
        case eBmm350InterfaceI3C:
            break;
    }

bmm350器件的结构如下:

// brief bmm350 device structure
struct bmm350_dev {

     // The interface pointer is used to enable the user
     // to link their interface descriptors for reference during the
     // implementation of the read and write interfaces to the hardware.

    void* intfPtr;                                      // interface pointer
    uint8_t chipId;                                     // chip Id of BMM350
    pBmm350ReadFptr_t read;                             // Bus read function pointer
    pBmm350WriteFptr_t write;                           // Bus write function pointer
    pBmm350DelayUsFptr_t delayUs;                       // delay(in us) function pointer
    BMM350_INTF_RET_TYPE intf_rslt;                     // to store interface pointer error
    uint8_t axisEn;                                     // variable to store status of axes enabled
    struct bmm350_mag_compensate mag_comp;              // structure for mag compensate
    uint16_t otp_data[BMM350_OTP_DATA_LENGTH];          // array to store OTP data
    uint8_t var_id;                                     // variant ID
    bmm350_mraw_override_t mraw_override;               // magnetic reset and wait override
    uint8_t powerMode;                                  // power mode
};

基本而言、函数指针部分可正常工作、但从指针传递值时无法正常工作。

非常感谢您提出任何想法/给予帮助。

此致、

c.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > bmm350Sensor.intfPtr =&devAddr;

    这是将栈变量的地址存储到全局结构中(看起来有点模糊)、这有点危险。

    函数的其余部分看起来是什么样子的? 尝试将"devAddr"设置为全局或静态值、并查看其行为是否不同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您要从哪种类型的器件移植代码。 以下行似乎表明您从中移植的器件是8位器件。 下面一行是对一个8位地址取消引用。  您应该尝试对齐到32位地址。  

    uint8_t deviceAddr =*(uint8_t*) intfPtr;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我将移植 https://github.com/boschsensortec/BMM350_SensorAPI/blob/main/bmm350.c

    您会看到它满是结构和函数指针。 虽然这可能是示例代码、但如果您是在 Linux 下使用此代码、但对于内存受限的器件(例如 Tiva-c)、我认为它的样式不正确。

    您会推荐什么? 我将尝试以 sensorlib 的样式重新编写它

    它还会执行某种指针方案。

    我已经解决了我的问题,我有一个作用域内的 devAddr ,并被删除后的内存,使它是一个全局解决了这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经解决了我的问题、我有一个范围内的 devAddr、然后在内存中被删除、使它成为一个全局解决问题的方法。

    感谢 Bruce 的建议、让它成为一个看起来可以解决问题的全球解决方案。