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.
工具与软件:
您好!
我将 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 的建议、让它成为一个看起来可以解决问题的全球解决方案。