引用的短语不是警告,仅是有关事物工作方式的说明。
使用millis()
或micros()
在正确编写的中断例程中没有本质上的错误。
另一方面,在定义不正确的中断例程中做任何事情都是错误的。
一个中断例程花了几微秒的时间来完成其工作,很可能是不正确的。
总之:一个正确编写的中断程序不会造成或遇到问题millis()
或micros()
。
编辑: 关于“为什么micros()“开始行为异常””,如“ 检查Arduino micros函数 ”网页中所述, micros()
普通Uno上的代码在功能上等同于
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
这将返回一个四字节无符号长整数,其中包括timer0_overflow_count
来自Timer-0计数寄存器的三个最低字节和一个字节。
如arduino millis函数网页的检查timer0_overflow_count
所述,TIMER0_OVF_vect
中断处理程序每毫秒将约增加一次。
在中断处理程序开始之前,AVR硬件会禁用中断。如果(例如)一个中断处理程序在中断仍被禁用的情况下运行了五毫秒,则将至少错过四个定时器0溢出。[在Arduino系统中,用C代码编写的中断不是可重入的(能够正确处理同一处理程序中的多个重叠执行),但是可以编写可重入的汇编语言处理程序,以便在开始耗时的过程之前重新启用中断。]
换句话说,定时器溢出不会“堆积”;每当在处理来自上一个溢出的中断之前发生了溢出时,millis()
计数器就会丢失一毫秒,而差异timer0_overflow_count
又会导致micros()
毫秒的错误。
关于“小于500μs”作为中断处理的上限,“为了防止定时器中断阻塞太长时间”,您可以提高到1024μs以下(例如1020μs),并且millis()
仍然可以工作,大多数时间。但是,我将中断处理程序视为耗时超过5 s,将懒惰的花费超过10 s,将类似蜗牛的花费超过20 s。