Страница 1 из 1

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 17.06.2017{, 01:25}
Александр_Светлый
Ускоряем работу линий GPIO Arduino

Добавлено (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 открывает новые возможности для разработчиков малых встраиваемых систем.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 17.06.2017{, 15:31}
pan
Александр_Светлый писал(а):поскольку стандартная функция digitalWrite примерно в пятьдесят раз медленнее, чем прямой доступ к порту.
это ж опупеть ... 
вот бы сделать чтоб flprog использовала эту библиотеку

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 17.06.2017{, 19:55}
support
pan писал(а):вот бы сделать чтоб flprog использовала эту библиотеку
Для начала ссылка на гитхаб не работает (страница не найдена), а вообще интересно.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 17.06.2017{, 20:06}
Dev1
support писал(а):Для начала ссылка на гитхаб не работает (страница не найдена), а вообще интересно.
TEMPLATES SPEED UP ARDUINO I/O

Библиотеки автора

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 17.06.2017{, 20:08}
support
Спасибо

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 18.06.2017{, 01:31}
Александр_Светлый
support писал(а):Для начала ссылка на гитхаб не работает (страница не найдена)
В самом-самом верху первого сообщения рабочая ссылка.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 18.06.2017{, 06:09}
Слимпер
Для того чтобы было в одном месте, добавлю еще одну библиотеку.
Ускоряем работу Arduino, та же, но на github.com   CyberLib 

На ее базе делал один блок, вполне рабочая библиотека.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 21.06.2017{, 02:19}
Александр_Светлый
Вот ТУТ альтернативный монитор порта с поддержкой разных кодировок, но у меня всё равно в порту "кракозяблы" почему то...

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 21.06.2017{, 20:52}
dekorator
По поводу ускорения. Есть тема на Русском!!!
   http://www.cyber-place.ru/showthread.php?t=550

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 22.06.2017{, 08:04}
Слимпер
dekorator писал(а):По поводу ускорения. Есть тема на Русском!!!    http://www.cyber-place.ru/showthread.php?t=550
Я эту же ссылку давал в 7 сообщении 

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 24.06.2017{, 14:33}
Dev1
То же про "ускорение", где то мелькало...
Fast library ILI9341


СпойлерПоказать
Benchmark                Time (microseconds) Performance increase
Screen fill              2561344 1.68x
Text                     319432 2.62x
Lines                    3118828 3.38x
Horiz/Vert Lines         222976 1.75x
Rectangles (outline)     148504 1.81x
Rectangles (filled)      5319692 1.68x
Circles (filled)         1168236 2.32x
Circles (outline)        1357636 3.42x
Triangles (outline)      990332 3.74x
Triangles (filled)       2083636 1.79x
Rounded rects (outline)  511700 2.78x
Rounded rects (filled)   5964712 1.71x

AVERAGE 2.40x faster

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 19.01.2018{, 17:53}
Sancho
Сегодня начал делать блочок.
Сначала думал делать на прямом доступе к регистрам(слышал о таком) - типа PORTB и т.д..
Решил в этом разобраться - что к чему.
Случайно нашёл примеры с использованием выше-упоминавшейся библиотеки CyberLib.
Для начала сам протестил.
Я в восторге!!!
Я в полном восторге от скорости!!!!!

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 19.01.2018{, 18:17}
pan
есть ли возможность хоть примерно измерить разницу по времени команд digitalRead/Write ?

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 19.01.2018{, 19:01}
Sancho
pan писал(а):
19.01.2018{, 18:17}
есть ли возможность хоть примерно измерить разницу по времени команд digitalRead/Write ?
Да, затестил.
Сделал генератор с ООС.
Стандарт.
digitalWrite(11, (!digtalRead (12));
соединил 11 и 12.
Около 75кГц.
С библиотекой.
If(D12_Read) D12_Low;
if(!D12_Read) D12_High;
В 11-12 раз БОЛЬШЕ!!! Это чтение + запись!
Точно скажу завтра, сейчас не возле железа.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 19.01.2018{, 19:21}
Max
А на МЕГЕ это можно сделать?

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 19.01.2018{, 19:26}
Sancho
Max писал(а):
19.01.2018{, 19:21}
А на МЕГЕ это можно сделать?
Да, можно. Там немного по другому биб-ка сделана, вроде.
Вся инфа, которую сегодня нарыл, на работе. (почти как у Автора ситуация :) )
Завтра попытаюсь сделать блокИ для flprog.
Есть нюансы с работой - использование похоже на выход с EN.

На заметку знатокам!!! Ускоряем работу линий GPIO Arduino.

Добавлено: 20.01.2018{, 01:45}
Abarmotovi4
Хорошая идея ускорения, но требует много времени для переработки и внесения в FLProg. Есть еще интересный вариант ускорения и снижения нагрузки (книга в папке Программируем Arduino. Профессиональная работа со скетчами стр.128-130)