我正在使用 Atmel Studio 为 AVR 微 Controller 构建十六进制文件。每次我在使用以下函数时尝试构建某个项目时,都会生成从整数或不同大小转换为指针的警告。
函数是:
static inline uint8 init_reg(uint8 reg, uint8 val)
{
if (val > 255)
return E_FAIL;
*(volatile uint8 *) (reg) = val;
return S_PASS;
}
我想知道出现这种警告的原因。谢谢...
最佳答案
此处出现警告是因为您的体系结构中的指针是 16 位,IIRC,但您要转换的整数大小不是 16 位,而是 8 位。将较短的整数转换为指针可能会无意中将较高的位清零。
直接的解决方案是先将其转换为 16 位整数,然后再转换为指针:
*(volatile uint8 *) (uint16) reg = val;
但如果可能的话,我更愿意更改函数原型(prototype),以说明整数是一个地址:
static inline uint8 init_reg(uint16 reg, uint8 val)
顺便说一句,您的检查 if (val > 255)
没有用,因为 uint8
永远不会高于 255
,所以它是总是假的(这里没有警告?)。
关于从不同大小的整数转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211194/