ArduinoShrink缩减了代码库规模,提高了Arduino AVR固件的运行速度

原文链接:ArduinoShrink library slashes code size, boosts speed of Arduino AVR firmware 由Jean-Luc Aufranc撰写。

原本Arduino AVR Core应该算得上是很高效的固件了,因为,它产生的代码可以在AVR ATmega168和ATmega328 MCU上运行。虽然,其内部闪存只有16到32KB、时钟速度仅有8到16MHz。

但是Nerd Ralph觉得它还有改进的空间,比如:Arduino Uno编译Blink示例时,运行需要924字节的闪存。所以,Nerd Ralph就开发了与Arduino AVR Core具有相同功能的ArduinoShrink库。使用该库时,它能够以更小更快的固件文件进行运行。

Nerd Ralph重新开发的Blink样本截图,共计196字节
Nerd Ralph重新开发的Blink样本截图,共计196字节

就像我们从上面的屏幕截图中所看到的,Blink样本现在只占用了196个字节,与原来相比减少了将近80%,这的确是一个令人印象深刻的结果。

那么这一壮举究竟应该如何实现呢?Ralph曾在他的一篇博文中对此进行了详细解释说明。简单来说,主要是采取了以下两个步骤:

  1. 编写模块化的、独立的代码,而不是像Arduino AVR内核那样只提供单个静态库。
  2. 将AVR汇编程序中的部分代码重写,特别是编译器经常优化不好的代码,比如中断服务程序。

除了使代码占据的内存更小之外,ArduinoShrink还可以使代码运行更快。例如,在运行进程中,中断指令(timer0 interrupt)通常需要5us来运行进程中的阻塞中断(blocking interrupt)。但是,它在ArduinoShrink的ISR中第一条指令是“sei”,这允许其他中断指令运行,将延迟影响减少到比硬件的最小值还要多几个周期。同时也可以降低功耗,延长电池使用寿命。

不过,当前的这个版本还有一个缺点,那就是编译器在编译时必须要解析数字IO函数的引脚编号,而avr–gcc并不总能将管脚识别为编译时的常量。最近,Ralph正在计划编写一个更小、更快、更便携的DigitalWrite函数版本。

如果你想试验一下ArduinoShrink的效果,可以转到Github资源库,在Arduino IDE中安装ArduinoShrink,就可以体验了。其实,这并不是Nerd Ralph的第一个Arduino程序样本优化项目,他之前已经为ATtiny13和ATtiny85系列的AVR微控制器编写过picoCore了。

本文源自 Hackaday

分享这篇文章
订阅评论
提醒
0 评论
内联反馈
查看所有评论