Есть такой многостаночник - АлексГайвер. И вот он в соавторстве с ещё одним человеком сделал новое ядро для ардуино IDE, ускоренное и расширенное по сравнению со стандартным. Ссылка на страницу его сайта.
Основано на оригинальном ядре Arduino версии 1.8.9, большинство функций заменены на более быстрые и лёгкие аналоги, убрано всё лишнее и не относящееся к микроконтроллеру ATmega328p, убран почти весь Wiring-мусор, код упрощён и причёсан. Добавлено несколько функций и интересных вариантов компиляции: поддержка внутреннего тактового генератора, новая версия загрузчика, вшита новая версия компилятора и многое другое!
Разработано by Александр AlexGyver и Egor ‘Nich1con’ Zaharov"
"Изменения
Облегчено и ускорено
Время выполнения функций, мкс
Функция Arduino GyverCore Быстрее в
millis 1.06 us 1.00 us –
micros 1.19 us 1.13 us –
pinMode 2.90 us 0.57 us 5.09
digitalWrite 2.90 us 0.57 us 5.09
digitalRead 2.45 us 0.50 us 4.90
analogWrite 4.15 us 1.13 us 3.67
analogRead 112.01 us 5.41 us 20.70
analogReference 0.00 us 0.00 us –
attachInterrupt 1.20 us 1.18 us 1.02
detachInterrupt 0.82 us 0.57 us 1.44
tone 5.63 us 2.40 us 2.3
Занимаемое место, Flash, байт
Функция Arduino GyverCore Разница, Flash
millis 26 24 2
micros 24 20 4
pinMode 114 24 90
digitalWrite 200 24 176
digitalRead 190 24 166
analogWrite 406 48 358
analogRead 32 72 -40
analogReference 0 22 -22
attachInterrupt 212 180 32
detachInterrupt 198 150 48
tone 1410 740 670
Serial begin 1028 166 862
print long 1094 326 768
print string 2100 1484 616
print float 2021 446 1575
parseInt 1030 214 816
readString 2334 1594 740
parseFloat 1070 246 824
Примечание: analogRead и analogReference имеют расширенную функциональность и весят чуть больше
Скетч, состоящий из однократного вызова перечисленных выше функций, занимает
Ядро Arduino: 3446 байт (11%) Flash / 217 байт (10%) SRAM
Ядро GyverCore: 1436 байт (4%) Flash / 94 байт (4%) SRAM
Пустой скетч:
Ядро Arduino: 444 байт (1%) Flash / 9 байт (0%) SRAM
Ядро GyverCore: 202 байт (0%) Flash / 0 байт (0%) SRAM
Все библиотеки, работа которых зависит от стандартных функций (время, I/O), работают быстрее:
SPI: отправка байта данных по адресу (опустить latch, отправить адрес, отправить байт, поднять latch) занимает:
Стандартное ядро: 14 мкс (71 кГц)
GyverCore: 6 мкс (164 кГц)
uart является практически полным аналогом Serial, но весит в разы меньше и работает быстрее. Список функций смотри ниже в Добавлено.
Добавлено
Расширена подсветка синтаксиса (вплоть до названий регистров и битов)
Макрос bitToggle(value, bit), инвертирует состояние бита bit в байте value
Быстрая функция digitalToggle(pin), инвертирует состояние пина
Расширенная работа с АЦП
analogStartConvert(byte pin) – начать преобразование с выбранного пина
analogGet() – получить преобразованное значение (между analogStartConvert и analogGet можно выполнять действия, в отличие от ожидания в analogRead())
analogPrescaler(uint8_t prescl) – установить предделитель для АЦП (2, 4, 8, 16, 32, 64, 128) – управляет скоростью работы АЦП (скоростью оцифровки). Prescaler:
2: 3.04 мкс (частота оцифровки 329 000 кГц)
4: 4.72 мкс (частота оцифровки 210 000 кГц)
8: 8.04 мкс (частота оцифровки 125 000 кГц)
16: 15.12 мкс (частота оцифровки 66 100 кГц)
32: 28.04 мкс (частота оцифровки 35 600 кГц)
64: 56.04 мкс (частота оцифровки 17 800 кГц)
128: 112 мкс (частота оцифровки 8 900 Гц)
В функции analogRead(pin) вместо пина можно указать INTERNAL (получить значение внутреннего опорного напряжения) или THERMOMETR (получить приблизительную температуру МК). Примечание: нужно установить предделитель 128
Добавлен очень быстрый и лёгкий uart (аналог классу Serial)
uart.begin() – запустить соединение по последовательному порту со скоростью 9600
uart.begin(baudrate) – запустить соединение по последовательному порту со скоростью baudrate
uart.end() – выключить сериал
uart.peek() – вернуть крайний байт из буфера, не убирая его оттуда
uart.clear() – очистить буфер
uart.read() – вернуть крайний байт из буфера, убрав его оттуда
uart.write(val) – запись в порт
uart.print(val) – печать в порт (числа, строки, char array)
uart.println(val) – печать в порт с переводом строки
uart.available() – возвразает true, если в буфере что-то есть
uart.setTimeout(val) – установить таймаут для функций парсинга (по умолчанию 100 мс)
uart.parseInt() – принять целочисленное число
uart.readString() – принять строку
uart.readStringUntil() – принять строку по терминатору
uart.parseFloat() – принять число float
uart.parsePacket(dataArray) – принять пакет вида $50 60 70; в массив dataArray (смотри пример)
Добавлены расширенные настройки платы из меню платы
Выбор загрузчика
Выбор источника тактирования (внешний, внутренний)
Сохранять или очищать EEPROM
Вывод тактирования на ногу МК
Возможность отключить системный таймер 0 и освободить для себя вектор прерывания ovf
Замена Serial быстрым uart
Настройка или отключение B.O.D.
Возможность отключить стандартную инициализацию периферии
Выбор версии компилятора
Убрано
Убраны всякие сервисные файлы и прочий хлам, не относящийся к ATmega328 (wifi, USB), почищен код. Ядро полностью совместимо с остальными библиотеками, ничего из стандартных функций не вырезано."
*Форматирование таблиц съехало при копировании.