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

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

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

История версий
Fast_Pins_(Быстрые_пины)_V1.1_(Code_-_Professional).ubi
Исправлен баг не полного отключения ШИМ при совместной оптимизации analogWrite и digitalWrite (Аналоговых и Цифровых выходов)
.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 16 июл 2022, 22:00
Sancho
Извинений не будет. Однозначно.

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

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

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

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

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

Добавлено: 16 июл 2022, 23:48
Dryundel
ИТАК ТЕСТ
.
Два проекта.

1. Генератор максимальной частоты на цифровом выходе с блоком от [ref=#ff8000]aidar_i[/ref].
1.jpg
Быстрые пины Айдар.flp
.
2. Генератор максимальной частоты на штатном цифровом выходе с блоком fastDigital Read / Write
2.jpg
TestfastDigitalReadWrite.flp
Заключения

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

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

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

Без изменений, штатный блок выхода, генерирует 101943 Гц
И как бы то ни было странно размер скетча в данном случае оказался самым большим 746 байт (Удивило)
Видимо компилятор оптимизировал код при прямом обращении к портам.
3.jpg
Штатный блок выхода.flp
.
[ref=#ff8000]Sancho[/ref], но ты все равно можешь не извиняться. :D

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 17 июл 2022, 11:34
Dryundel
[ref=#ff8000]Sancho[/ref], [ref]ecoins[/ref], вы что, решили вдвоём задавить конкретно меня интеллектом?
Разошлись тут о бесполезности того, что я делаю.
А где вы б... были когда Айдар вот эту тему поднимал? viewtopic.php?f=112&t=7641
Что вы там писали? Напомнить?
Sancho писал(а): 21 окт 2021, 09:18 Отлично!
Ждём выходы.
ecoins писал(а): 20 окт 2021, 19:46 Проблема ускорения работы с портами актуальна.
А между тем, блоки Айдара работают только с вновь созданными входами выходами и никак не влияют на уже имеющиеся digitalRead / digitalWrite в других блоках. Кроме того, данный алгоритм заменит все digitalRead / digitalWrite в функциях, в том числе и по прерыванию, если таковые имеются в других пользовательских блоках, используемых в проекте.
Ну а Вы можете и дальше трепать языком....
.
Чо за фигня то? Я вам что, на больную мозоль наступил? Что вы Айдара то не гнобили, в таком случае? Или там все по феншую?
Спелись тут, умники...
[spoiler=Офтоп]
Нет не нашла коса на камень,
Она попала в борозду.
Хотите что б я спорим с вами?
А не пошли бы вы в ....[/spoiler]

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

Добавлено: 17 июл 2022, 11:38
Dryundel
ПРОДОЛЖАЕМ ТЕСТИРОВАТЬ

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

Результат.

1. Просто штатные блоки цифровых входа и выхода.
4.jpg
Штатные блоки вход_выхода.flp
.
Генерируемая частота - 53727 Гц



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

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

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

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

Берем штатный блок "Матричная клавиатура" (4х4) и с помощью дешифратора отправляем в UART номер нажатой кнопки.
Измеряем усредненное количество циклов программы с помощью блока из комплекта "ОТЛАДКА" и тоже отправляем в UART.

[spoiler=1. Штатный блок "Матричная клавиатура"]
6.jpg
[/spoiler]
Штатный блок Матричная клавиатура.flp
.
Результат - 7260 циклов в секунду.
.
Теперь просто кидаем в проект блок fastDigitalReadWrite и повторяем измерение.
[spoiler=Штатный блок Матричная клавиатура + fastDigitalReadWrite]
7.jpg
[/spoiler]
Штатный блок Матричная клавиатура + TestfastDigitalReadWrite.flp
.
Результат - 43900 циклов в секунду.
.
Вывод: В конкретном случае блок "Матричная клавиатура" тормозил программу более чем на 36600 циклов в секунду, а блок fastDigitalReadWrite исправил эту ситуацию. При этом не внес никаких изменений в алгоритм проекта.
.
Для тех кто пропустил, рекомендую тему - ВРЕМЯ ЦИКЛА или что убивает ваш проект.

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

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

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