我正在使用Atmel Studio为AVR微控制器构建十六进制文件。每次我尝试使用以下函数构建某个项目时都会生成一个从整数或不同大小转换为指针的警告。
功能是:
static inline uint8 init_reg(uint8 reg, uint8 val)
{
if (val > 255)
return E_FAIL;
*(volatile uint8 *) (reg) = val;
return S_PASS;
}
我想知道这种警告的原因。谢谢......
答案 0 :(得分:2)
这里的警告是因为你的体系结构中的指针是16位,IIRC,但是你所投射的整数不是16位,而是8位。并且将较短的整数强制转换为指针可能会无意中将较高位置零。
立即解决方案是首先将其转换为16位整数,然后转换为指针:
*(volatile uint8 *) (uint16) reg = val;
但是如果可能的话,我更愿意更改函数原型来说明整数是一个地址:
static inline uint8 init_reg(uint16 reg, uint8 val)
顺便说一句,您的支票if (val > 255)
没用,因为uint8
永远不会高于255
,所以它总是假的(这里没有警告?)。