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

Ответить
Александр_Светлый
Лейтенант
Сообщения: 354
Зарегистрирован: 12.10.2016{, 19:03}
Репутация: 2
Откуда: Краснодар

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

#1

Сообщение Александр_Светлый » 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 открывает новые возможности для разработчиков малых встраиваемых систем.
Я не флудер , просто мне есть что сказать =)

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

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

#2

Сообщение pan » 17.06.2017{, 15:31}

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

Аватара пользователя
support
Супермодератор
Сообщения: 1839
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 688
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#3

Сообщение support » 17.06.2017{, 19:55}

pan писал(а):вот бы сделать чтоб flprog использовала эту библиотеку
Для начала ссылка на гитхаб не работает (страница не найдена), а вообще интересно.
Автор программы FLProg.

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

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

#4

Сообщение Dev1 » 17.06.2017{, 20:06}

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

Библиотеки автора
Win7-64 FLProg v7.2.2 Portable :fie:

Аватара пользователя
support
Супермодератор
Сообщения: 1839
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 688
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#5

Сообщение support » 17.06.2017{, 20:08}

Спасибо
Автор программы FLProg.

Александр_Светлый
Лейтенант
Сообщения: 354
Зарегистрирован: 12.10.2016{, 19:03}
Репутация: 2
Откуда: Краснодар

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

#6

Сообщение Александр_Светлый » 18.06.2017{, 01:31}

support писал(а):Для начала ссылка на гитхаб не работает (страница не найдена)
В самом-самом верху первого сообщения рабочая ссылка.
Последний раз редактировалось Александр_Светлый 18.06.2017{, 02:07}, всего редактировалось 1 раз.
Я не флудер , просто мне есть что сказать =)

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

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

#7

Сообщение Слимпер » 18.06.2017{, 06:09}

Для того чтобы было в одном месте, добавлю еще одну библиотеку.
Ускоряем работу Arduino, та же, но на github.com   CyberLib 

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

Александр_Светлый
Лейтенант
Сообщения: 354
Зарегистрирован: 12.10.2016{, 19:03}
Репутация: 2
Откуда: Краснодар

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

#8

Сообщение Александр_Светлый » 21.06.2017{, 02:19}

Вот ТУТ альтернативный монитор порта с поддержкой разных кодировок, но у меня всё равно в порту "кракозяблы" почему то...
Я не флудер , просто мне есть что сказать =)

Аватара пользователя
dekorator
Лейтенант
Сообщения: 426
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

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

#9

Сообщение dekorator » 21.06.2017{, 20:52}

По поводу ускорения. Есть тема на Русском!!!
   http://www.cyber-place.ru/showthread.php?t=550

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

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

#10

Сообщение Слимпер » 22.06.2017{, 08:04}

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

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

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

#11

Сообщение Dev1 » 24.06.2017{, 14:33}

То же про "ускорение", где то мелькало...
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
Win7-64 FLProg v7.2.2 Portable :fie:

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#12

Сообщение Sancho » 19.01.2018{, 17:53}

Сегодня начал делать блочок.
Сначала думал делать на прямом доступе к регистрам(слышал о таком) - типа PORTB и т.д..
Решил в этом разобраться - что к чему.
Случайно нашёл примеры с использованием выше-упоминавшейся библиотеки CyberLib.
Для начала сам протестил.
Я в восторге!!!
Я в полном восторге от скорости!!!!!
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

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

#13

Сообщение pan » 19.01.2018{, 18:17}

есть ли возможность хоть примерно измерить разницу по времени команд digitalRead/Write ?

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#14

Сообщение Sancho » 19.01.2018{, 19:01}

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 раз БОЛЬШЕ!!! Это чтение + запись!
Точно скажу завтра, сейчас не возле железа.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

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

#15

Сообщение Max » 19.01.2018{, 19:21}

А на МЕГЕ это можно сделать?

Аватара пользователя
Sancho
Полковник
Сообщения: 3999
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 571
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#16

Сообщение Sancho » 19.01.2018{, 19:26}

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

Аватара пользователя
Abarmotovi4
Рядовой
Сообщения: 24
Зарегистрирован: 19.12.2017{, 21:16}
Репутация: 1
Откуда: Могилев
Имя: Георгий

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

#17

Сообщение Abarmotovi4 » 20.01.2018{, 01:45}

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

Ответить

Вернуться в «Arduino. Другие МК»