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

Fast Pins - (быстрые пины). -- Оптимизация работы входов/выходов -- digitalRead, digitalWrite, analogRead, analogWrite

Добавлено: 16.07.2022{, 20:35}
Dryundel
Fast Pins
Блок актуален для AVR ATmega168 / 328 и ATtiny85 / 13 (UNO, NANO, MINI, PROMINI)
.
4.jpg
4.jpg (1.65 КБ) 4651 просмотр
.
Актуальная версия:
Fast_Pins_(Быстрые_пины)_V1.2_(Code_-_Professional).ubi
Полностью переработана оптимизация analogWrite.
Доработано описание настроек.

История версий Исправлен баг не полного отключения ШИМ при совместной оптимизации analogWrite и digitalWrite (Аналоговых и Цифровых выходов)
.

Возможности:
- Оптимизация Цифровых входов (digitalRead)
- Оптимизация Цифровых выходов (digitalWrite)
- Оптимизация Аналоговых входов (analogRead)
- Оптимизация Аналоговых(ШИМ) выходов (analogWrite)
- Выбор оптимизируемых позиций
Краткое описание блокаПоказать
Блок Fast Pins ускоряет работу входов / выходов в стандартно созданном
проекте в десятки раз. Он заменяет все digitalRead, digitalWrite, analogRead, analogWrite
на быстрые аналоги. Эти команды создаются не только штатными блоками вход / выход,
но и многими другими блоками работающими в пинами. К примеру при работе штатного
блока "Матричная клавиатура" 4х4 - 24 таких команд в каждом цикле.

Блок Fast Pins почти не требует настроек. Его надо разместить
в любом месте проекта. Всю работу он сделает автоматически.
Достаточно только выбрать цели оптимизации

Блок актуален только для AVR ATmega168 / 328 и ATtiny85 / 13

Если в проекте использован другой коньроллер замена проигнорируется.
В этом случае блок мешать не будет, но и помогать тоже.
Тестирование в #23 посте
.
История версий .
fastDigitalRead__Write_(Code_-_Professional).ubi
(156.35 КБ) 95 скачиваний
.
Этот блок ускоряет работу чтения и записи портов в стандартно созданном
проекте в десятки раз. Он заменяет все digitalRead и digitalWrite на быстрые
аналоги. Эти команды создаются не толко блоками вход / выход, но и многими
другими блоками работающими с пинами. К примеру при работе только одного штатного
блока "Матричная клавиатура" 4х4 - выполняется 24 таких команды в каждом цикле программы.

Блок fastDigitalRead / Write не требует настроек. Его надо разместить
в любом месте проекта. Всю работу он сделает автоматически.


Блок актуален только для AVR ATmega168 / 328 и ATtiny85 / 13 (UNO, NANO, MINI, MINIPRO)

Если в проекте использован другой контроллер замена проигнорируется.
В этом случае блок мешать не будет, но и помогать тоже.
.
Альтернативные блоки от aidar_i
Работа с портами ввода и вывода Ардуино через регистры.
.
Пропускаем несколько постов с личным мнением некоторых, сильно продвинутых, товарищей и сразу переходим к посту #12 , посту #19 и посту#20 с тестами!

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:42}
Sancho
Блоки от Айдара работают быстрее.
Вся эта скорость эфимерная.
для поиграться.
практически любой пб положит всю скорость работы пина по сравнению со скоростью цикла в несоизмеримое число крат.
скорость работы пина важна при прерываниях, любых.
иначе - просто понты. отыграть несколько мкс на цикле в пару сотен мкс - для этого буду использовать прямую работу с регистрами, код от айдара. чтобы по макс.
сугубо моё мнение. основанное на реалиях.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:47}
ecoins
Sancho писал(а):
16.07.2022{, 21:42}
иначе - просто понты. отыграть несколько мкс на цикле в пару сотен мкс - для этого буду использовать прямую работу с регистрами, код от айдара. чтобы по макс.
сугубо моё мнение. основанное на реалиях.
Ну не совсем так, на контроллерах AVR очень быстро набегают задержки, когда несколько блоков вывода.
----
Блоки ecoins изначально работают на прямую с регистрами и на всех поддерживаемых архитектурах (AVR,ESP,STM,Raspberry Pi Pico, Seeeduino, SAMD21).
И соотвественно почти не "тормозят".

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:52}
Dryundel
Sancho писал(а):
16.07.2022{, 21:42}
Блоки от Айдара работают быстрее.
Вся эта скорость эфимерная.
для поиграться.
Это откуда такие заявления? Может для начала потестировать тот и другой вариант, после чего писать такие заявления ?
Sancho писал(а):
16.07.2022{, 21:42}
практически любой пб положит всю скорость работы пина по сравнению со скоростью цикла в несоизмеримое число крат.
скорость работы пина важна при прерываниях
И чем же здесь помогут блоки от Айдара? Что за голословные заявления?
Sancho писал(а):
16.07.2022{, 21:42}
иначе - просто понты. отыграть несколько мкс на цикле в пару сотен мкс - для этого буду использовать прямую работу с регистрами, код от айдара. чтобы по макс.
Есть штатный блок "Матричная клавиатура", там в каждом цикле куча обращений к портам. Для AVR-ки это уже серьезно. И как в этом случае помогут блоки от Айдара?
Sancho, нафига мозг то людям парить?
Возьми, попробуй, сравни, предложи альтернативу. Или извинись.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:53}
Sancho
Dryundel писал(а):
16.07.2022{, 21:52}
Это откуда такие заявления? Может для начала потестировать тот и другой вариант, после чего писать такие заявления ?
Я посмотрел код.

Отправлено спустя 41 секунду:
Dryundel писал(а):
16.07.2022{, 21:52}
Или извинись.
не буду. я знаю.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:55}
Dryundel
ecoins писал(а):
16.07.2022{, 21:47}
Блоки ecoins изначально работают на прямую с регистрами и на всех поддерживаемых архитектурах (AVR,ESP,STM,Raspberry Pi Pico, Seeeduino, SAMD21).
И соотвественно почти не "тормозят".
ecoins, выложите пожалуйста ссылку на вашу альтернативную версию работы с портами. Я размещу ее в первом посте, так же как и ссылку на блоки от Айдара. У пользователей должен быть выбор.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:56}
Sancho
Dryundel писал(а):
16.07.2022{, 21:52}
Есть штатный блок "Матричная клавиатура", там в каждом цикле куча обращений к портам. Для AVR-ки это уже серьезно. И как в этом случае помогут блоки от Айдара?
есть пб. это случай один на тысячу. который Вам навеял Анатолий.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 21:57}
Dryundel
Sancho писал(а):
16.07.2022{, 21:54}
не буду. я знаю.
Ну знай. И ни в коем случае не рассказывай об этом другим. :D :D :D
Поражает меня ваша упертость, сэээр.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 22:00}
Sancho
Извинений не будет. Однозначно.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 22:12}
Dryundel
Sancho писал(а):
16.07.2022{, 22:00}
Извинений не будет. Однозначно.
Ладно, так прощаю. :D Только не уходи.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 23:45}
ecoins
Dryundel писал(а):
16.07.2022{, 21:55}
ecoins, выложите пожалуйста ссылку на вашу альтернативную версию работы с портами. Я размещу ее в первом посте, так же как и ссылку на блоки от Айдара. У пользователей должен быть выбор.
Выбор есть и он простой - пользоваться блоками ecoins. Они во многом и получились компактными и быстрыми, потому, что интегрированы в единую ЭкоСистему, которая в том числе и адаптирует функции к разным архитектурам контроллеров.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 23:48}
Dryundel
ИТАК ТЕСТ
.
Два проекта.

1. Генератор максимальной частоты на цифровом выходе с блоком от aidar_i.
1.jpg
1.jpg (5.53 КБ) 2237 просмотров
Быстрые пины Айдар.flp
(1.8 МБ) 58 скачиваний
.
2. Генератор максимальной частоты на штатном цифровом выходе с блоком fastDigital Read / Write
2.jpg
2.jpg (6.86 КБ) 2237 просмотров
TestfastDigitalReadWrite.flp
(218.26 КБ) 46 скачиваний
Заключения

Размер проекта
1. 1,8 MB
2. 218 kB

Размер скетча
1. 472 байт
2. 584 байт

Скорость (генерируемая частота) Самое главное!
1. 548385 Гц
2. 548385 Гц
Абсолютный паритет.

Без изменений, штатный блок выхода, генерирует 101943 Гц
И как бы то ни было странно размер скетча в данном случае оказался самым большим 746 байт (Удивило)
Видимо компилятор оптимизировал код при прямом обращении к портам.
3.jpg
3.jpg (4.74 КБ) 2237 просмотров
Штатный блок выхода.flp
(51.22 КБ) 42 скачивания
.
Sancho, но ты все равно можешь не извиняться. :D

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 16.07.2022{, 23:51}
Dryundel
ecoins писал(а):
16.07.2022{, 23:45}
Выбор есть и он простой - пользоваться блоками ecoins. Они во многом и получились компактными и быстрыми, потому, что интегрированы в единую ЭкоСистему, которая в том числе и адаптирует функции к разным архитектурам контроллеров.
А вот это уже неприкрытая, голословная реклама. И можно сказать хамство в данной теме.
Я попросил ссылку на альтернативное предложение, а не бла-бла-бла.

Отправлено спустя 2 минуты 30 секунд:
ecoins, , забацайте ка тестик. Может сможете удивить своей ЭкоСистемой. :D

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 17.07.2022{, 05:41}
Sancho
Dryundel писал(а):
16.07.2022{, 23:48}
Генератор максимальной частоты на цифровом выходе
Для такого проекта я поставлю 531ла3.
Если не сложно, добавь в проект чтение двух аналоговых входов, датчика с real выходом, пид регулятор и любой из входов или выходов, пб или встроенные, - сравни время цикла.
Когда осознаёшь, приходит понимание - быстрые вещи нужны в прерываниях, иначе уже согласен на просто функционирование программы.

Отправлено спустя 3 минуты 26 секунд:
Просто я тоже когда-то был вдохновлен тестами с пинами/регистрами.
Но со временем, осознав масштаб, пользую по мере необходимости, а именно в прерываниях.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 17.07.2022{, 07:42}
Dryundel
Sancho писал(а):
17.07.2022{, 05:44}
Если не сложно, добавь в проект...
Не надо выкручиваться.
Sancho писал(а):
17.07.2022{, 05:44}
Блоки от Айдара работают быстрее.
За это ответь. :D

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 17.07.2022{, 07:58}
ecoins
Dryundel писал(а):
16.07.2022{, 23:53}
А вот это уже неприкрытая, голословная реклама. И можно сказать хамство в данной теме.
Я попросил ссылку на альтернативное предложение, а не бла-бла-бла.
Если Вы не желаете избегать моего общения в Ваших темах, прошу уклоняться от подобных не лицеприятных формулировок.
Тем более, что они не соответствуют фактическим обстоятельствам.
Dryundel писал(а):
16.07.2022{, 23:53}
Отправлено спустя 2 минуты 30 секунд:
ecoins, , забацайте ка тестик. Может сможете удивить своей ЭкоСистемой.
Тесты я не бацаю, а делаю - обычно это сам по себе не простой труд.
Тесты в большом количестве размещены в ветках с блоками ecoins.
Sancho писал(а):
17.07.2022{, 05:44}
Если не сложно, добавь в проект чтение двух аналоговых входов, датчика с real выходом, пид регулятор и любой из входов или выходов, пб или встроенные, - сравни время цикла.
Когда осознаёшь, приходит понимание - быстрые вещи нужны в прерываниях, иначе уже согласен на просто функционирование программы.
Все так.
analogRead() в AVR занимает время >130мкс, digitalWrite() >4 мкс.
Много времени занимает обмен по шине i2c.
Рассматривать быстродействие отдельных блоков с отрывом от реальных, даже простых проектов, не имеет практического смысла.
Проблемы быстродействия работы с пинами проявляются в функциях с прерываниями и в библиотеках для работы с шиной 1-Wire.
Обычно это касается двух функций - дискретное чтение и дискретная запись.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 17.07.2022{, 08:33}
Dryundel
Sancho, ecoins, вы что, решили вдвоём задавить конкретно меня интеллектом?
Разошлись тут о бесполезности того, что я делаю.
А где вы б... были когда Айдар вот эту тему поднимал? viewtopic.php?f=112&t=7641
Что вы там писали? Напомнить?
Sancho писал(а):
21.10.2021{, 09:18}
Отлично!
Ждём выходы.
ecoins писал(а):
20.10.2021{, 19:46}
Проблема ускорения работы с портами актуальна.
А между тем, блоки Айдара работают только с вновь созданными входами выходами и никак не влияют на уже имеющиеся digitalRead / digitalWrite в других блоках. Кроме того, данный алгоритм заменит все digitalRead / digitalWrite в функциях, в том числе и по прерыванию, если таковые имеются в других пользовательских блоках, используемых в проекте.
Ну а Вы можете и дальше трепать языком....
.
Чо за фигня то? Я вам что, на больную мозоль наступил? Что вы Айдара то не гнобили, в таком случае? Или там все по феншую?
Спелись тут, умники...
ОфтопПоказать
Нет не нашла коса на камень,
Она попала в борозду.
Хотите что б я спорим с вами?
А не пошли бы вы в ....

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 17.07.2022{, 11:38}
Dryundel
ПРОДОЛЖАЕМ ТЕСТИРОВАТЬ

Соединяем пины 9 и 10.
Берем сигнал с Pin 9, инвертируем и отправляем на Pin 10 и так в каждом цикле.
Замеряем частоту на этой спайке.

Результат.

1. Просто штатные блоки цифровых входа и выхода.
4.jpg
4.jpg (5.69 КБ) 2103 просмотра
Штатные блоки вход_выхода.flp
(42.37 КБ) 45 скачиваний
.
Генерируемая частота - 53727 Гц



2. Штатные блоки цифровых входа и выхода + fastDigital Read / Write.
5.jpg
5.jpg (8.23 КБ) 2103 просмотра
TestfastDigitalReadWrite-2.flp
(209.7 КБ) 42 скачивания
.
Генерируемая частота - 837010 Гц

Разница более чем в 15 раз !

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 18.07.2022{, 11:39}
Dryundel
ПЕРЕХОДИМ К ПРАКТИЧЕСКИМ ИСПЫТАНИЯМ

Берем штатный блок "Матричная клавиатура" (4х4) и с помощью дешифратора отправляем в UART номер нажатой кнопки.
Измеряем усредненное количество циклов программы с помощью блока из комплекта "ОТЛАДКА" и тоже отправляем в UART.
1. Штатный блок "Матричная клавиатура"Показать
6.jpg
6.jpg (36.53 КБ) 2003 просмотра
.
Результат - 7260 циклов в секунду.
.
Теперь просто кидаем в проект блок fastDigitalReadWrite и повторяем измерение.
Штатный блок Матричная клавиатура + fastDigitalReadWriteПоказать
7.jpg
7.jpg (34.84 КБ) 2003 просмотра
.
Результат - 43900 циклов в секунду.
.
Вывод: В конкретном случае блок "Матричная клавиатура" тормозил программу более чем на 36600 циклов в секунду, а блок fastDigitalReadWrite исправил эту ситуацию. При этом не внес никаких изменений в алгоритм проекта.
.
Для тех кто пропустил, рекомендую тему - ВРЕМЯ ЦИКЛА или что убивает ваш проект.

fastDigital Read / Write - Ускоритель работы портов (быстрые пины)

Добавлено: 18.07.2022{, 13:42}
Sancho
СпойлерПоказать
Dryundel писал(а):
16.07.2022{, 21:52}
Sancho писал(а):
16.07.2022{, 21:42}
Блоки от Айдара работают быстрее.
Вся эта скорость эфимерная.
для поиграться.
Это откуда такие заявления? Может для начала потестировать тот и другой вариант, после чего писать такие заявления ?
Sancho писал(а):
16.07.2022{, 21:42}
практически любой пб положит всю скорость работы пина по сравнению со скоростью цикла в несоизмеримое число крат.
скорость работы пина важна при прерываниях
И чем же здесь помогут блоки от Айдара? Что за голословные заявления?
Sancho писал(а):
16.07.2022{, 21:42}
иначе - просто понты. отыграть несколько мкс на цикле в пару сотен мкс - для этого буду использовать прямую работу с регистрами, код от айдара. чтобы по макс.
Есть штатный блок "Матричная клавиатура", там в каждом цикле куча обращений к портам. Для AVR-ки это уже серьезно. И как в этом случае помогут блоки от Айдара?
Sancho, нафига мозг то людям парить?
Возьми, попробуй, сравни, предложи альтернативу. Или извинись.
Dryundel писал(а):
16.07.2022{, 22:12}
Sancho писал(а):
16.07.2022{, 22:00}
Извинений не будет. Однозначно.
Ладно, так прощаю. :D Только не уходи.
Всё таки Извиняюсь.
Компилятор преобразует функции на этапе сборки в прямую работу с регистрами. Скорость одинакова.
Правда, как он это делает я не могу предположить, т.к.
Dryundel писал(а):
16.07.2022{, 23:48}
Размер проекта
1. 1,8 MB
2. 218 kB

Размер скетча
1. 472 байт
2. 584 байт
не даёт прояснений.
Извиняюсь ещё раз. Был не прав.
Применений, остаюсь при своём, реально не много - выбор пина при использовании прерываний(типа фазорез), клавиатура и ещё несколько.
СпойлерПоказать
Sancho писал(а):
16.07.2022{, 21:42}
Вся эта скорость эфимерная.
для поиграться.
практически любой пб положит всю скорость работы пина по сравнению со скоростью цикла в несоизмеримое число крат.
скорость работы пина важна при прерываниях, любых.
иначе - просто понты. отыграть несколько мкс на цикле в пару сотен мкс - для этого буду использовать прямую работу с регистрами, код от айдара. чтобы по макс.
сугубо моё мнение. основанное на реалиях.
Sancho писал(а):
17.07.2022{, 05:44}
Для такого проекта я поставлю 531ла3.
Если не сложно, добавь в проект чтение двух аналоговых входов, датчика с real выходом, пид регулятор и любой из входов или выходов, пб или встроенные, - сравни время цикла.
Когда осознаёшь, приходит понимание - быстрые вещи нужны в прерываниях, иначе уже согласен на просто функционирование программы.