Добавлено (17.06.2017, 01:04)
---------------------------------------------
Платформа 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/fredlll....tion.h.
Добавлено (17.06.2017, 01:25)
---------------------------------------------
Ещё одна интересная статья
Двойная загрузка или dual boot для обычных настольных компьютеров представляется сегодня вполне нормальным явлением. Так, пользователь может запускать на своем компьютере две операционные системы, например, Linux для работы и Windows для игр и развлечений.

Если это справедливо для больших вычислительных систем, то почему бы такое не реализовать для малых вычислительных систем, например, для Arduino. Тогда бы пользователь Arduino мог бы менять прошивки «на лету» в зависимости от текущих задач без необходимости подключения платы к компьютеру через порт USB и перепрограммирования этой платы. И, к счастью, двойную загрузку можно сделать для Arduino, потребуется лишь дополнительная микросхема энергонезависимой памяти (EEPROM).
В данном случае была «проапгрейдена» миниатюрная плата Arduino Pro Mini. В качестве чипа EEPROM использовалась микросхема M24512 с интерфейсом I2C и объемом памяти 64 КБ. Ниже представлена схема подключения M24512 к Arduino посредством линий SCL и SDA интерфейса I2C.

Из-за отсутствия свободного места на плате микросхему памяти M24512 можно аккуратно напаять непосредственно на микроконтроллер.

В Arduino необходимо записать специальный загрузчик (bootloader), обеспечивающий возможность двойной загрузки. Скачать этот бутлоадер можно с репозитория Github. Работает механизм двойной загрузки следующим образом. Когда кнопка сброса (reset) платы Arduino нажата, происходит вход в режим загрузчика. В данном случае в режиме загрузчика происходит проверка того, закорочены ли выводы 10 и 11. Если это так, то светодиод на плате будет светиться одну секунду. Если убрать перемычку между линиями 10 и 11, прежде чем светодиод погаснет, система войдет в режим двойной загрузки и начнет обмен информацией между внутренней flash-памятью микроконтроллера и внешней EEPROM-памятью. То есть программа, которая выполнялась на микроконтроллере перестанет выполняться и будет записана во внешнюю энергонезависимую память, где будет в последствии храниться, а программа из этой внешней памяти будет записана в микроконтроллер и начнет выполняться вместо предыдущей. Чтобы вернуть все на место, нужно снова закоротить выводы 10 и 11, нажать кнопку сброса и успеть убрать перемычку до того, как погаснет светодиод.
Вот так просто можно реализовать режим двойной загрузки в Arduino. Он может понадобиться, например, если вы хотите запускать стабильный и «сырой» код на одном устройстве. В любом случае dual boot открывает новые возможности для разработчиков малых встраиваемых систем.