如何解决将值转换为AVR C
我在Atmel Studio 7中模拟了atmega2560的代码。 我有一个delay_ms函数。我这样称呼:
delay_ms(150);
我有这个功能
void delay_ms(uint32_t mstime){
uint32_t tnow=millis();
tnow+=mstime;
while (tnow>=millis());
}
函数mstime的值是9,830,400,在二进制1001 0110 0000 0000 0000 0000中,150在二进制1001 0110中。为什么将16bit向左移动?
解决方法
根据OP的注释,int
是两个字节,并且未包含可能声明为delay_ms
的标头。然后会发生什么:
- 调用
delay_ms
时,编译器将根据历史C行为插入默认声明int delay_ms();
。 - 由于此
delay_ms
声明没有参数原型,因此150
中的delay_ms(150)
作为int
传递,这是两个字节。 - 在
delay_ms
的定义中,参数定义为uint32_t
,即四个字节。因此,该函数将查找四个字节的参数。 - 多余的两个字节恰好包含零,由于机器的字节顺序,它们被用作
uint32_t
的低两个字节,而所传递的两个字节(0x0096)被用作高两个字节字节。 - 这形成了OP观察到的0x00960000(9,830,400)值。
解决方案是在调用例程的源文件中包含delay_ms
声明。另外,在编译器中启用警告并予以注意。编译器可能会警告不要使用delay_ms
,而无需声明。
我不知道为什么,但是也许#include
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。