我试图在STM32上运行为Arduino设计的磁力计代码。在编译Arduino时,我没有错误,从传感器读取的值也被签名。在为STM编译时,我得到错误:"没有来自' int *'的参数1的已知转换。 to' uint16_t * {aka short unsigned int *}'"。
这很有道理,但从哪里开始?
目标是获得与常规Arduino板相同的结果。
答案 0 :(得分:0)
您可以使用C样式转换强制转换,如果编译器对此进行了呻吟,则转换为void *然后转换为所需的类型,这将关闭它。但这些抱怨很可能是合理的。 int和uint16_t可能没有相同的宽度,所以你期望通过以这种方式弄乱指针来实现什么?
答案 1 :(得分:0)
因为stm32上的int是32位,AVR上的int是16位长。当您将指向int的指针传递给指向uint16_t的指针的函数时,无法进行转换。为什么呢?
当您指示指针时,任何对dereferanced的指令只会写入2个字节而原始类型为4个字节。所以2个字节不受影响。
示例
void foo(uint16_t *ptr) {
*ptr = 0x1122
}
int val = 0x0feeddcc;
foo((uint16_t *)&val);
结果将是0x0fee1122而不是0x00001122; - 如果你用隐式演员强迫它。但它是一个UB
在代码中将int更改为short以使它们具有相同的大小。
另一个解决方案 - 保留int和unsigned not changed只重写方法;
#define PACKED __attribute__((__packed__))
void MechaQMC5883::read(int* x,int* y,int* z){
PACKED union {
short xs;
uint8_t xu[2];
}xunion;
Wire.beginTransmission(address);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(address, 6);
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*x = (int)xunion.xs;
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*y = (int)xunion.xs;
xunion.xu[0] = Wire.read();
xunion.xu[1] = Wire.read();
*z = (int)xunion.xs;
}
答案 2 :(得分:0)
问题不在于如何转换,而是为什么。图书馆需要uint16_t*
。所以你不应该创建int[N]
。而是像库所期望的那样创建一个uint16_t[N]
。