Платформа Arduino является очень удобной и легко осваиваемой новичками, что позволяет довольно быстро создавать несложные проекты в области электроники и автоматизации. Как правило, наиболее популярные платы Arduino основаны на 8-разрядных микроконтроллерах ATmega и не могут предложить большой производительности. Но для упрощения взаимодействия новичков с платами Arduino многие сложности в коде были скрыты от посторонних глаз с помощью различных библиотек.

Экосистема Arduino в действительности использует язык высокого уровня C++. Как правило, часть кода C++ содержится библиотеках и фреймворках, и большинство людей просто склонны кодировать свои основные программы, используя C-стиль, используя объекты библиотеки. Но из-за этого быстродействие микроконтроллера сильно снижается, поскольку максимальной производительности можно достичь лишь используя ассемблер, а не языки высокого уровня. Тем не менее, энтузиаст под ником Fredllll создал библиотеку шаблонов для ускорения работы линий ввода/вывода (GPIO) Arduino.
Если вы когда-либо делали что-либо серьезное с Arduino, вы, вероятно, знаете, что в то время как функция digitalWrite очень удобна в использовании, она делает много работы за кулисами, и это существенно нагружает ядро микроконтроллера при каждом вызове. Но версия Fredllll может переключать состояние вывода за два цикла. Вы можете использовать константу для включения вывода, например:
switchOn<1>();
Если вам не нравится использовать магические числа (и это разумно), вы можете определить константу:
const uint8_t ledPin=1;
switchOn<ledPin>();
Поскольку вы, вероятно, захотите организовать какие-нибудь временные задержки, то здесь имеется функция nop, которая позволяет отложить заданное количество циклов. Ниже приведен код, который генерирует квадратную волну (меандр) с частотой 1,3 МГц.
const uint8_t myPin = 5;
void loop(){
cli(); // отключить прерывания, так как они нарушают синхронизацию
do {
switchOnExclusive<myPin>(); // 1 цикл
nop<5>(); // 5 циклов
switchOffPortOfPin<myPin>(); // 1 цикл
nop<3>(); // 3 циклов
} while(1) //jump back to do is 2 cycles
}
Таким образом, новая библиотека дает большую гибкость при работе с линиями ввода/вывода и позволяет значительно ускорить работу Arduino с этими линиями, поскольку стандартная функция digitalWrite примерно в пятьдесят раз медленнее, чем прямой доступ к порту. Саму библиотек можно взять на https://github.com/fredlllll/FredUtil-Arduino/blob/master/fredOptimization.h.
© digitrode.ru