
我们制作了一个关于如何加速 Arduino 代码的视频,具体来说就是如何避免使用DigitalWrite
。众所周知, DigitalWrite
慢得要命。事实上,快速搜索一下就能找到一篇 2010 年的 Hackaday 文章,文中指出DigitalWrite 比直接使用原生引脚寄存器切换引脚慢 50 倍。但这仍然是那些一代又一代被反复提及的事实之一。这怎么会是新的呢?
首先,有时候你根本不需要速度。当你只是按照人类的时间表闪烁LED时,Arduino的通用功能就足够了。我写过很多符合这种描述的实用固件。当时间要求不严格时,慢得像泥土一样快就足够了。
但最终,你会想要构建一个项目,旧的低速引脚切换方法根本无法满足需求。也许它是一个大型 LED 矩阵,也许是一个电机控制应用,循环时间非常重要。又或许它正在驱动音频或视频之类的应用,只需要更高的每秒位数。一个解决方法是巧妙地编写代码,或许可以回归到汇编语言原语,但我认为,正确的方法几乎总是使用芯片制造商提供的硬件外设。
例如,在上面链接的视频结尾,黑客想要驱动一个大型移位寄存器串,使其点亮一个 LED 矩阵。这正是SPI 的用途所在,而实现这一点使得项目能够节省时间,并且只需几行代码即可完成。这就是方法。
这让我想到了Arduino抽象化所带来的一把双刃剑。通过抽象芯片的硬件外设,它使代码更易于移植,当然也更容易被那些暂时不想学习SPI、I2C、I2S和DMA的初学者理解。但是,通过将芯片的内部工作原理隐藏在“用户友好”的库中,它让新用户看不到这些硬件外设的实用应用,而这些外设正是我们所需要的,正是聪明的芯片设计工程师倾注了他们的心血和智慧才打造出来的。
不过,这并非真正想抨击 Arduino。每个人都必须从某个地方开始,而这些抽象概念非常适合入门。而且,既然一切都是开源的,也就没有什么能阻止你深入研究数据手册了。你只需要知道你需要这样做。这就是为什么我们大约每五年就会制作类似的视频,向下一代黑客展示,在抽象概念背后有很多东西可以学习。