use*_*687 5 c gcc-warning avr-gcc
我在这一行得到零错误除法:
if (tim2_st_ovf < T2_PREK_250)
Run Code Online (Sandbox Code Playgroud)
这些值的定义如下:
volatile uint8_t tim2_st_ovf = 0;
#define T2_PREK_250 ((250 * (F_CPU / 1000)) / ((UINT8_MAX + 1) * 1024))
#define F_CPU 16000000UL
Run Code Online (Sandbox Code Playgroud)
和UINT8_MAX等于255.
我为什么要这个?我在计算器上计算了好几次,得到了~15.此外,如果我将1024更改为1023它不会显示任何错误.
((UINT8_MAX + 1) * 1024)可能变为0,因为UINT8_MAX + 1通常是256,并且256 * 1024是0模2 16.所以,如果sizeof(int) == 2在你的建筑上,那么你得到0.
在GCC的典型现代桌面架构中sizeof(int) == 4,你不会得到0的除法.
要修复它,请替换1024为1024UL.这将有效,因为unsigned long保证最高可达4294967295.(感谢Pascal Cuoq解释它.)