Попытка ускорить код Arduino
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Попытка ускорить код Arduino
Всем добрый день.
Признаться, язык С совсем не мой конёк и по этому на первый взгляд глупо мне было влезать в этот блуд. Но...
Задался целью перевести на язык Arduino свою систему. Все прошло удачно, но как говориться "по минималке" тех возможностей, которые давала скорость программы на ассемблере. Причина - уперся в скорость работы встроенных способов чтения данных из памяти, особенно из области Flash.
Порылся в интернете и нашел интересную публикацию по гибридизации Си и Ассемблера. Сделал скетч и ... не компилируется.
Вот ни как не пойму почему. Повторяю, для меня эти программные изыски как Китайский язык - может и красиво, но нифига не понятно.
Может на Arduino IDE не все работает, что работает на AVR студии? А может какую-то глупость написал?
Признаться, язык С совсем не мой конёк и по этому на первый взгляд глупо мне было влезать в этот блуд. Но...
Задался целью перевести на язык Arduino свою систему. Все прошло удачно, но как говориться "по минималке" тех возможностей, которые давала скорость программы на ассемблере. Причина - уперся в скорость работы встроенных способов чтения данных из памяти, особенно из области Flash.
Порылся в интернете и нашел интересную публикацию по гибридизации Си и Ассемблера. Сделал скетч и ... не компилируется.
Вот ни как не пойму почему. Повторяю, для меня эти программные изыски как Китайский язык - может и красиво, но нифига не понятно.
Может на Arduino IDE не все работает, что работает на AVR студии? А может какую-то глупость написал?
- Вложения
-
- qwerty.zip
- (1.59 КБ) 114 скачиваний
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Попытка ускорить код Arduino
"Ардуина" и "ускорить код" - диаметрально противоположные вещи.
Если уж и ускорять, то писать на С/асме, да даже С++, но без классов и без оверхеда абдуриновского. А еще в абдуриновых "скетчах" многие операции делают блокирующими. Даже в обработке сигнала "сброс" по 1-wire эти олухи вполне могут выставить тупую блокирующую паузу в несколько миллисекунд!!!
В общем, учите С, а потом пишите на нем приличный код. И будет счастье. На асме, конечно, тоже можно приличный код написать, но дюже портянка длиннючая и нечитабельная получится.
Добавлено after 3 minutes 11 seconds:
P.S. А какие ошибки выдает? У меня нет avr-gcc за ненадобностью, так что проверить не могу. В принципе, с первого взгляда все должно собираться, нужно лишь Makefile правильный написать.
Если уж и ускорять, то писать на С/асме, да даже С++, но без классов и без оверхеда абдуриновского. А еще в абдуриновых "скетчах" многие операции делают блокирующими. Даже в обработке сигнала "сброс" по 1-wire эти олухи вполне могут выставить тупую блокирующую паузу в несколько миллисекунд!!!
В общем, учите С, а потом пишите на нем приличный код. И будет счастье. На асме, конечно, тоже можно приличный код написать, но дюже портянка длиннючая и нечитабельная получится.
Добавлено after 3 minutes 11 seconds:
P.S. А какие ошибки выдает? У меня нет avr-gcc за ненадобностью, так что проверить не могу. В принципе, с первого взгляда все должно собираться, нужно лишь Makefile правильный написать.
Re: Попытка ускорить код Arduino
Языка Ардуино нет в природе. Ардуино среда использует язык С/С++, но в Ардуине принят общий стиль написания и использование универсальных написанных функций, которые не лучшим образом сказываются на быстродействии. Поэтому ускорять нужно не ассемблером, а отказом от универсальных медленных функций
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Попытка ускорить код Arduino
Да лучше вообще от абдурины отказаться и по-старинке нормально код писать. Там вообще уйма всяких вещей ради универсальности ногодрыгом сделана. Даже UART, 1-wire, SPI, I2C!.. А уж все эти printf и флоаты — я б за это вообще убил! Не удивлюсь, если там даже аллокатор памяти есть…
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: Попытка ускорить код Arduino
[uquote="MLX90640",url="/forum/viewtopic.php?p=4336920#p4336920"]Языка Ардуино нет в природе. Ардуино среда использует язык С/С++, но в Ардуине принят общий стиль написания и использование универсальных написанных функций, которые не лучшим образом сказываются на быстродействии. Поэтому ускорять нужно не ассемблером, а отказом от универсальных медленных функций[/uquote]
Так это и есть попытка переписать функцию. Вообще поражаюсь. Спросил мнения почему не работает, а мне советы по использованию языков суют и к терминам придираются. Ну знаете, не тревожьте клаву.
Так это и есть попытка переписать функцию. Вообще поражаюсь. Спросил мнения почему не работает, а мне советы по использованию языков суют и к терминам придираются. Ну знаете, не тревожьте клаву.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
- Реклама
Re: Попытка ускорить код Arduino
Спрашиваете, почему не работает? Возможно потому что ассемблер очень аппаратно-зависимый язык и требует точного соответствия микроконтроллера. Если знакомы с ассемблером, должны же понимать. Во вторых, напо почитать, как выполняются ассемблерные вставки в Ардуине.
И я ответил, что основная проблема Ардуины не в отсутствии ассемблерных вставок, а в не оптимально универсальном готовом коде. Когда начнёте переписывать на свой лад, от Ардуины останется только язык С/С++ в степени синтаксиса названий, да и то не факт, что не замените обычным Си.
Ещё одна большая проблема ардуинщиков в том, что они не читают мануалов, а ищут готовые решения, прилепляют их изолентой и соплями, а когда это не заработает, спрашивают на форумах другой кусок кода.
Как только ардуенщик начинает читать маны и писать собственный рабочий код, он автоматически прекращает быть ардуинщиком.
И я ответил, что основная проблема Ардуины не в отсутствии ассемблерных вставок, а в не оптимально универсальном готовом коде. Когда начнёте переписывать на свой лад, от Ардуины останется только язык С/С++ в степени синтаксиса названий, да и то не факт, что не замените обычным Си.
Ещё одна большая проблема ардуинщиков в том, что они не читают мануалов, а ищут готовые решения, прилепляют их изолентой и соплями, а когда это не заработает, спрашивают на форумах другой кусок кода.
Как только ардуенщик начинает читать маны и писать собственный рабочий код, он автоматически прекращает быть ардуинщиком.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Попытка ускорить код Arduino
С.Н., приведите, какие ошибки выдает gcc в терминале. А то как можно понять, "почему не собирается"?
Ну и неплохо бы содержимое Makefile своего показать, может, у вас асмовский исходник неправильно собирается (хотя, конечно, просто avr-gcc sourse.S -o должно сработать)? Ну и туда еще потом абдуринолибы прилинковать правильно нужно…
Если собираете не по-человечески, а через абдурино-IDE, то проследите, правильно ли у вас там все выставлено (я эту дрянь даже длинной палкой касаться не буду, так что, ничем помочь не могу).
Ну и неплохо бы содержимое Makefile своего показать, может, у вас асмовский исходник неправильно собирается (хотя, конечно, просто avr-gcc sourse.S -o должно сработать)? Ну и туда еще потом абдуринолибы прилинковать правильно нужно…
Если собираете не по-человечески, а через абдурино-IDE, то проследите, правильно ли у вас там все выставлено (я эту дрянь даже длинной палкой касаться не буду, так что, ничем помочь не могу).
Последний раз редактировалось Eddy_Em Чт дек 15, 2022 10:55:59, всего редактировалось 3 раза.
Re: Попытка ускорить код Arduino
[uquote="MLX90640",url="/forum/viewtopic.php?p=4336954#p4336954"]прилепляют их изолентой и соплями[/uquote] скотчем )
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Попытка ускорить код Arduino
C.H., в файле asmroutine.h
строка 16:
вместо :
word rdindex(byte _ukj);
напишите:
word rdindex(byte _ukj) {};
(будет пустой функцией).
строка 16:
вместо :
word rdindex(byte _ukj);
напишите:
word rdindex(byte _ukj) {};
(будет пустой функцией).
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: Попытка ускорить код Arduino
[uquote="veso74",url="/forum/viewtopic.php?p=4337014#p4337014"]C.H., в файле asmroutine.h
строка 16:
вместо :
word rdindex(byte _ukj);
напишите:
word rdindex(byte _ukj) {};
(будет пустой функцией).[/uquote]
Спасибо, попробую. Ребята, я не Ардуинщик. Опыт работы на Си подобном языке - месяц. Ещё помучаюсь и пошлю этот ногодрыг куда подальше. Мой язык общения с контроллером - ассемблер. Просто хотел убедиться что могу и можно на этом ногодрыге сделать рабочую систему - оказывается можно! А плюшки всякие можно и потерять.
строка 16:
вместо :
word rdindex(byte _ukj);
напишите:
word rdindex(byte _ukj) {};
(будет пустой функцией).[/uquote]
Спасибо, попробую. Ребята, я не Ардуинщик. Опыт работы на Си подобном языке - месяц. Ещё помучаюсь и пошлю этот ногодрыг куда подальше. Мой язык общения с контроллером - ассемблер. Просто хотел убедиться что могу и можно на этом ногодрыге сделать рабочую систему - оказывается можно! А плюшки всякие можно и потерять.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Re: Попытка ускорить код Arduino
Зачем посылать - надо научиться "готовить".
Да и "гибридизация" ассемблера под Си не есть хорошо для начинающего.
Как вариант - ассемблерные вставки или файлы под GCC, что не совсем то же самое что файлы на avrasm2.
У адуринок, исходя из моего опыта, "ускорение" требуется разве что в случае работы с uLAN и "мудрыми светиками" вида WS2812...
Остальные вопросы вполне решаемы средствами "референса" или незначительными дополнениями из арсенала GCC.

Да и "гибридизация" ассемблера под Си не есть хорошо для начинающего.
Как вариант - ассемблерные вставки или файлы под GCC, что не совсем то же самое что файлы на avrasm2.
У адуринок, исходя из моего опыта, "ускорение" требуется разве что в случае работы с uLAN и "мудрыми светиками" вида WS2812...
Остальные вопросы вполне решаемы средствами "референса" или незначительными дополнениями из арсенала GCC.
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: Попытка ускорить код Arduino
[uquote="BOB51",url="/forum/viewtopic.php?p=4337090#p4337090"]...
Да и "гибридизация" ассемблера под Си не есть хорошо для начинающего.
Как вариант - ассемблерные вставки или файлы под GCC, что не совсем то же самое что файлы на avrasm2.
У адуринок, исходя из моего опыта, "ускорение" требуется разве что в случае работы с uLAN и "мудрыми светиками" вида WS2812...
Остальные вопросы вполне решаемы средствами "референса" или незначительными дополнениями из арсенала GCC.
[/uquote]
Нет, не "начинающий". Скорее "попробовавший и пославший". Я потерял интерес к этой теме.
Рабочий скетч для ATmega 88/168/328 создан. Жалко, что слишком сильная аппаратная привязка к контроллеру получилась. Если решусь сервисы накручивать, то буду вынужден тратить лишние 1-2 мкс при обращении в Flash. А что такое микросекунда на фоне миллисекунды - Пыль!
А вообще, мне и так достаточно уже синтаксис С мозги подпортил. Как теперь заставить себя писать "a:=2" вместо "a = 2" и { XXXXXX } мозгами игнорировать?
Да и "гибридизация" ассемблера под Си не есть хорошо для начинающего.
Как вариант - ассемблерные вставки или файлы под GCC, что не совсем то же самое что файлы на avrasm2.
У адуринок, исходя из моего опыта, "ускорение" требуется разве что в случае работы с uLAN и "мудрыми светиками" вида WS2812...
Остальные вопросы вполне решаемы средствами "референса" или незначительными дополнениями из арсенала GCC.
Нет, не "начинающий". Скорее "попробовавший и пославший". Я потерял интерес к этой теме.
Рабочий скетч для ATmega 88/168/328 создан. Жалко, что слишком сильная аппаратная привязка к контроллеру получилась. Если решусь сервисы накручивать, то буду вынужден тратить лишние 1-2 мкс при обращении в Flash. А что такое микросекунда на фоне миллисекунды - Пыль!
А вообще, мне и так достаточно уже синтаксис С мозги подпортил. Как теперь заставить себя писать "a:=2" вместо "a = 2" и { XXXXXX } мозгами игнорировать?
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Re: Попытка ускорить код Arduino
Ну, кому как, кому что больше нравится. Эт вы еще синтаксис С++ в ардуине не полностью осознали
Namespace::NameClass::NameFoo(); самое простое из них
Хотя помоему в ардуине сложнее этого и не используется в принципе то. По крайней мере, я не видел, чтобы кто-то писал foo = [](){ } Прикольный синтаксис, да? А это не шутка ведь 
-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: Попытка ускорить код Arduino
[uquote="MLX90640",url="/forum/viewtopic.php?p=4337169#p4337169"]Ну, кому как, кому что больше нравится. Эт вы еще синтаксис С++ в ардуине не полностью осознали
Namespace::NameClass::NameFoo(); самое простое из них
Хотя помоему в ардуине сложнее этого и не используется в принципе то. По крайней мере, я не видел, чтобы кто-то писал foo = [](){ } Прикольный синтаксис, да? А это не шутка ведь
[/uquote]
Да, я иногда в ауте от этих приколов. В моей юности так и говорили - "зтот язык - шутка математиков". Это про С говорили. Про ++ тогда ещё не знали. Кто тогда мог подумать, что так далеко зайдёт.
Да, я иногда в ауте от этих приколов. В моей юности так и говорили - "зтот язык - шутка математиков". Это про С говорили. Про ++ тогда ещё не знали. Кто тогда мог подумать, что так далеко зайдёт.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Re: Попытка ускорить код Arduino
Да я сам фшоке
Взять вот например новомодный нынче язык Питон - всё понятно и ясно. А глянешь на проверенный временем С++ и офигеваешь от тупизьма языка
Вот не знаю, если честно, почему и по какой причине С++ взяли за основу для Ардуины. Видимо, её авторам понравился синтаксис имён функций. Потому как навряд ли ардуинщики решают что-либо на уровне объектов в правильном понимании этого явления. По крайней мере, я не встречал, чтобы писатель на ардуине понимал суть именно объектов, а не воспринимал это как синтаксическую форму записи object.Method()
Re: Попытка ускорить код Arduino
Классы, обьекты в адуринке в основном для создания библиотек используются...
А вот как на более "высокий" уровень выйти - пока примеров не попадалось.
Высасывать ситуации "с потолка" чтобы проверить искусственно придуманные примеры пока поднадоело.
"контейнер" на ардуринкин Си/С++ гнать не надо.
Задачи с подсчетом микросекунд штука весьма редкая для МК, работающего на частоте 16 МГц (0,0000000625 S на одноцикловую команду).
Это еще в случае, когда имеем дело со "стандартным минимумом" в 1 МГц имеет существенное значение.
Да разве что при необходимости интервалы в наносекундах стабильно выравнивать (и то не факт - ибо у кварцев также заметные отклонения имеются).
Неуж-то на практике 62,5 наносекунд на одноцикловую команду мало?
Это ж ведь минимум целых 16 одноцикловых команд для Ваших "....лишние 1-2 мкс..."...
Или нужный алгоритм подобрать сложно?
Сложность восприятия Си для привыкшего к ассемблеру - необходимость продумывания порой непривычных алгоритмов.
Зато потом и в работе с ассемблером многое проще/удобнее делать становится.

Я вот только не понял насчет вышевыложенного кода...
Это тест вывода данных на встроенный терминал?
Так там совсем иначе надо делать...
...

А вот как на более "высокий" уровень выйти - пока примеров не попадалось.
Высасывать ситуации "с потолка" чтобы проверить искусственно придуманные примеры пока поднадоело.
"контейнер" на ардуринкин Си/С++ гнать не надо.
Задачи с подсчетом микросекунд штука весьма редкая для МК, работающего на частоте 16 МГц (0,0000000625 S на одноцикловую команду).
Это еще в случае, когда имеем дело со "стандартным минимумом" в 1 МГц имеет существенное значение.
Да разве что при необходимости интервалы в наносекундах стабильно выравнивать (и то не факт - ибо у кварцев также заметные отклонения имеются).
Неуж-то на практике 62,5 наносекунд на одноцикловую команду мало?
Это ж ведь минимум целых 16 одноцикловых команд для Ваших "....лишние 1-2 мкс..."...
Или нужный алгоритм подобрать сложно?
Сложность восприятия Си для привыкшего к ассемблеру - необходимость продумывания порой непривычных алгоритмов.
Зато потом и в работе с ассемблером многое проще/удобнее делать становится.
Я вот только не понял насчет вышевыложенного кода...
Это тест вывода данных на встроенный терминал?
Так там совсем иначе надо делать...
Спойлер
Код: Выделить всё
#include <avr/pgmspace.h> // подключить библиотеку работ с таблицами в ПЗУ
//const PROGMEM word index[] = {3001, 4802, 6003, 8004, 12005, 24006, 48007,65535};
//volatile const word index1[] = {3001, 4800, 6000, 8000, 12000, 24000, 48000,65535};
const word index[]PROGMEM = {3001, 4802, 6003, 8004, 12005, 24006, 48007,65535};
volatile word sdd;
void setup() {
Serial.begin(9600);
}
void loop() {
for (byte n=0; n<=7; n++)
{
sdd = pgm_read_word_near(index + n);
Serial.print(F("index"));Serial.print(n,DEC);Serial.print(F(" = "));
Serial.println(sdd,DEC);
}
delay(2000);
Serial.println(F(" "));
}-
С.Н.
- Потрогал лапой паяльник
- Сообщения: 307
- Зарегистрирован: Пн окт 26, 2020 08:37:51
- Откуда: г.Волгоград
Re: Попытка ускорить код Arduino
[uquote="BOB51",url="/forum/viewtopic.php?p=4337323#p4337323"]Классы, обьекты в адуринке в
Задачи с подсчетом микросекунд штука весьма редкая для МК, работающего на частоте 16 МГц (0,0000000625 S на одноцикловую команду).
Это еще в случае, когда имеем дело со "стандартным минимумом" в 1 МГц имеет существенное значение.
Да разве что при необходимости интервалы в наносекундах стабильно выравнивать (и то не факт - ибо у кварцев также заметные отклонения имеются).
Неуж-то на практике 62,5 наносекунд на одноцикловую команду мало?
Это ж ведь минимум целых 16 одноцикловых команд для Ваших "....лишние 1-2 мкс..."...
Или нужный алгоритм подобрать сложно?[/uquote]
Скажу больше. На самом деле считаются даже не такты кварцевого генератора, импульсы гораздо меньших частот 400 кГц-2МГц. Не в этом проблема. Проблема в том, что параллельно с работающей программой, обслуживающей измерительный таймер, есть сигналы входных датчиков, которые следует обрабатывать тем же контролером, и еще вращается металлический маховик, который не хочет ждать пока программа что-то там выдернет из памяти, посчитает, и запишет обратно. И вот пока скетч этим занимается, маховик пролетает уже положение, когда микроконтроллер должен был дать команду на искрообразование. В сухом остатке получается, что разница между временем чтения данных из области Flash и с ОЗУ между программой на ассемблере и скетчем Arduino IDE (обычными массивами и константами) составляет порядка 1 мкс. Таких операций надо сделать десятки во время расчета параметров, да и сам расчет, даже целочисленный требует временных затрат. В итоге на больших оборотах (период = 2-3 мс) маховик успеет уже сместится значительно.
Вообще, написание такого скетча интересная разминка для мозгов. Все должно происходить в нужное время и не мешать другим процессам. Вплоть до того, что специально управлять временем функционирования отдельных узлов программы синхронно с тактами управляемой её железки. Добавьте сюда еще обеспечение работы АЦП (для подключения дополнительных систем регулировок) и работающий одновременно с этим интерфейс UART (телеметрия и управления параметрами), и Вы поймете, что скетчу на Arduino IDE может и не хватить мощности. А вот на ассемблере еще время и остается… Вот и хотел сначала переписать пару функций (по ближе к ассемблеру), дабы вернуть эту микросекунду.
[uquote="BOB51",url="/forum/viewtopic.php?p=4337323#p4337323"]Сложность восприятия Си для привыкшего к ассемблеру - необходимость продумывания порой непривычных алгоритмов. Зато потом и в работе с ассемблером многое проще/удобнее делать становится.[/uquote]
С этим трудно не согласиться.
По коду - так вот эту функцию pgm_read_word_near и хотел переписать.
Задачи с подсчетом микросекунд штука весьма редкая для МК, работающего на частоте 16 МГц (0,0000000625 S на одноцикловую команду).
Это еще в случае, когда имеем дело со "стандартным минимумом" в 1 МГц имеет существенное значение.
Да разве что при необходимости интервалы в наносекундах стабильно выравнивать (и то не факт - ибо у кварцев также заметные отклонения имеются).
Неуж-то на практике 62,5 наносекунд на одноцикловую команду мало?
Это ж ведь минимум целых 16 одноцикловых команд для Ваших "....лишние 1-2 мкс..."...
Или нужный алгоритм подобрать сложно?[/uquote]
Скажу больше. На самом деле считаются даже не такты кварцевого генератора, импульсы гораздо меньших частот 400 кГц-2МГц. Не в этом проблема. Проблема в том, что параллельно с работающей программой, обслуживающей измерительный таймер, есть сигналы входных датчиков, которые следует обрабатывать тем же контролером, и еще вращается металлический маховик, который не хочет ждать пока программа что-то там выдернет из памяти, посчитает, и запишет обратно. И вот пока скетч этим занимается, маховик пролетает уже положение, когда микроконтроллер должен был дать команду на искрообразование. В сухом остатке получается, что разница между временем чтения данных из области Flash и с ОЗУ между программой на ассемблере и скетчем Arduino IDE (обычными массивами и константами) составляет порядка 1 мкс. Таких операций надо сделать десятки во время расчета параметров, да и сам расчет, даже целочисленный требует временных затрат. В итоге на больших оборотах (период = 2-3 мс) маховик успеет уже сместится значительно.
Вообще, написание такого скетча интересная разминка для мозгов. Все должно происходить в нужное время и не мешать другим процессам. Вплоть до того, что специально управлять временем функционирования отдельных узлов программы синхронно с тактами управляемой её железки. Добавьте сюда еще обеспечение работы АЦП (для подключения дополнительных систем регулировок) и работающий одновременно с этим интерфейс UART (телеметрия и управления параметрами), и Вы поймете, что скетчу на Arduino IDE может и не хватить мощности. А вот на ассемблере еще время и остается… Вот и хотел сначала переписать пару функций (по ближе к ассемблеру), дабы вернуть эту микросекунду.
[uquote="BOB51",url="/forum/viewtopic.php?p=4337323#p4337323"]Сложность восприятия Си для привыкшего к ассемблеру - необходимость продумывания порой непривычных алгоритмов. Зато потом и в работе с ассемблером многое проще/удобнее делать становится.[/uquote]
С этим трудно не согласиться.
По коду - так вот эту функцию pgm_read_word_near и хотел переписать.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Re: Попытка ускорить код Arduino
Оптимальнее, чем это сделает компилятор вряд ли получится.
А вот насчет множества операций на одном МК - это вопрос конкретной схемотехники и организации программ.
МК (по крайней мере "одноядерный") никогда больше одной прожки в единицу времени исполнить не может.
В любом случае это последовательное выполнение нескольких задач. Каким способом такое можно получить - тут простор для творчества (ибо их множество вариантов).
Если уж совсем "крутокосмическое" требование - делаем смешанный проект из базового ядра на адуринке и прикладных периферийных МК (вполне вероятно из разных семейств или на рассыпухе/специализированных микросхемах).
Периферия готовит критичные по времени данные в реальном времени, а адуринка является центром обработки готовых данных и коммуникаций.
Так что... Придется таки поплотнее адуринкой заняться при желании строить сложные самоделки.

Пы. Сы.
Освоение написания качественных автономных файлов и/или ассемблерных вставок для компилятора Си может оказаться гораздо сложнее освоения самого Си.

А вот насчет множества операций на одном МК - это вопрос конкретной схемотехники и организации программ.
МК (по крайней мере "одноядерный") никогда больше одной прожки в единицу времени исполнить не может.
В любом случае это последовательное выполнение нескольких задач. Каким способом такое можно получить - тут простор для творчества (ибо их множество вариантов).
Если уж совсем "крутокосмическое" требование - делаем смешанный проект из базового ядра на адуринке и прикладных периферийных МК (вполне вероятно из разных семейств или на рассыпухе/специализированных микросхемах).
Периферия готовит критичные по времени данные в реальном времени, а адуринка является центром обработки готовых данных и коммуникаций.
Так что... Придется таки поплотнее адуринкой заняться при желании строить сложные самоделки.
Пы. Сы.
Освоение написания качественных автономных файлов и/или ассемблерных вставок для компилятора Си может оказаться гораздо сложнее освоения самого Си.
Re: Попытка ускорить код Arduino
[uquote="С.Н.",url="/forum/viewtopic.php?p=4337395#p4337395"]Скажу больше. На самом деле считаются даже не такты кварцевого генератора, импульсы гораздо меньших частот 400 кГц-2МГц. Не в этом проблема. Проблема в том, что параллельно с работающей программой, обслуживающей измерительны...[/uquote]
У меня возникло впечатление, что вышеуказанный пост посвящен попытке решения задач реального времени не предназначенными для этого средствами. Полагаю, что углубленное изучение RTOS, которые вроде как уже прижились в т.ч. и в аматерских 32-разрядных МК STM32 и ESP32, ответит на все поставленные ТС вопросы.
У меня возникло впечатление, что вышеуказанный пост посвящен попытке решения задач реального времени не предназначенными для этого средствами. Полагаю, что углубленное изучение RTOS, которые вроде как уже прижились в т.ч. и в аматерских 32-разрядных МК STM32 и ESP32, ответит на все поставленные ТС вопросы.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Попытка ускорить код Arduino
[uquote="С.Н.",url="/forum/viewtopic.php?p=4337395#p4337395"]Вот и хотел сначала переписать пару функций (по ближе к ассемблеру), дабы вернуть эту микросекунду.[/uquote]Вам в самом начале дискуссии дали исчерпывающий ответ, но вы почему-то восприняли его в штыки.[uquote="MLX90640",url="/forum/viewtopic.php?p=4336920#p4336920"]но в Ардуине принят общий стиль написания и использование универсальных написанных функций, которые не лучшим образом сказываются на быстродействии. Поэтому ускорять нужно не ассемблером, а отказом от универсальных медленных функций[/uquote]Разработчики ардуины не дураки, а осознанно пожертвовали производительностью в обмен на унификацию и низкий порог вхождения. Ускорять нужно не там где вы умеете, а там где реально тормозит. Я не скажу, что отказ от ардуины автоматом ускорит ваш код, но хотя бы даст шанс. У вас есть бесспорное преимущество - знание ассемблера. Пишете код, компилируете, смотрите листинг, анализируете где плохо, переписываете или меняете настройки компилятора. Со временем придёт понимание как инструкции языка высокого уровня реализуются в ассемблер и "подглядывать" не придётся.
PS: Чтобы не быть голословным, вот как ваш пример можно без ассемблера сделать. Ссылка на Compiler Explorer. Это лучше, чем вы хотели сделать на асме. И это только оптимизация -O2, а с -O3 ещё быстрее будет.
PS: Чтобы не быть голословным, вот как ваш пример можно без ассемблера сделать. Ссылка на Compiler Explorer. Это лучше, чем вы хотели сделать на асме. И это только оптимизация -O2, а с -O3 ещё быстрее будет.


