2018-06-11 (2)聊聊arduino的delay()

arduino默认提供了两个delay函数,一个是毫秒ms级别的delay,另一个是微妙us级别的delay。
翻了翻arduino的源文件,我查到了delay实现的两个关键源函数。
一个是void _delay_loop_1(uint8_t __count),

Delay loop using an 8-bit counter \c __count, so up to 256
iterations are possible.  (The value 256 would have to be passed
as 0.)  The loop executes three CPU cycles per iteration, not
including the overhead the compiler needs to setup the counter
register.
Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
can be achieved.

这是文件里对这个函数的解释,很明显,在uno的16MHz的晶振的加持下,该函数的最小延时为48us。
同理,另一个函数是void _delay_loop_2(uint16_t __count),注释我就不贴了,这是个用16位的counter实现的ms级别的delay函数,16MHz下最小延时是16ms。
同时需要注意的是,delay函数的延时是busy-waiting的延时,会一直占用着cpu的资源。
官方对这两个函数的定位是:

They are typically used to facilitate short delays in the program execution.

同时他们也给出了使用建议:

In general, for long delays, the use of hardware timers is
much preferrable, as they free the CPU, and allow for
concurrent processing of other events while the timer is
running.

当然,这是他们在编写delay这个函数时用的最小延时单元函数,但我们在日常的使用中,是根本不会用到这两个函数的,我们会使用他们的高一级封装形态,但归根到底,delay()函数其实就是对所输入的延时时长进行必要的转换从而计算出所要调用的上述两个函数的次数来进行对应的延时的操作。

但我们也要从中看到他们的局限性,那就是精度上的不足,在使用arduino进行项目设计的时候,最好就不要用long time的delay了,如果真的要做,个人建议重构delay函数或者基于项目的要求进行自己的函数适配性调整,但arduino经过几年的发展,无论是函数的可靠性还是实用性都已经非常高,所以自己重构除非有强悍的编程基础,否则是不建议做的。

最后,贴上delay的官方的一段源代码,仅供参考:(的代码排版不太会弄,图片送上)

2018-06-11 (2)聊聊arduino的delay()_第1张图片

你可能感兴趣的:(2018-06-11 (2)聊聊arduino的delay())