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**** 2027820 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 时、指针存在一些问题。 下面我们举例说明:

Fullscreen
1
2
3
4
5
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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

Fullscreen
1
2
3
4
5
6
7
8
9
uint8_t devAddr;
switch(interface) {
case eBmm350InterfaceI2C:
devAddr = BMM350_I2C_ADSEL_SET_LOW; // 0x14
bmm350Sensor.intfPtr = &devAddr;
break;
case eBmm350InterfaceI3C:
break;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

bmm350器件的结构如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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
};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

此致、

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 的建议、让它成为一个看起来可以解决问题的全球解决方案。