我在这一行得到除以零错误:
if (tim2_st_ovf < T2_PREK_250)
这些值定义如下:
volatile uint8_t tim2_st_ovf = 0;
#define T2_PREK_250 ((250 * (F_CPU / 1000)) / ((UINT8_MAX + 1) * 1024))
#define F_CPU 16000000UL
UINT8_MAX
等于255。
为什么我会这样?我在计算器上计算了好几次,得到了~15。此外,如果我将1024更改为1023,则不会显示任何错误。
答案 0 :(得分:7)
((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解释它。)