Несколько строчек размышлений/замечаний для среднепользователя ардуиноIDE.
Собственно для начала о том, чего там вообще не указано, но имеется в рамках «стандартного Си» (и успешно обрабатывается компилятором).
1. Оператор
m = n ? a : b
при n = true m будет равно a;
при n = false m будет равно b;
«выпал из поля зрения» в референсе, но отрабатывается компилятором.
2. Структуры (STRUCT), объединения (UNION) и перечисления.
Информацию об этих элементах можно найти в книге
Васильев А. Н.
Самоучитель С++ с примерами и задачами. 4-е издание
(переработанное). Книга + виртуальный CD. — СПб.: Наука и
Техника, 2016. — 480 с.: ил. (+ виртуальный CD)
Там же и достаточно хорошее толкование работы со ссылками, указателями, классами, объектами и конструкторами — главы 3, 4, 6-9.
Касательно PROGMEM относительно AVRок в дополнение к базовому описанию в референсе
https://www.arduino.cc/reference/en/lan ... s/progmem/ рекомендую DiHalt
«АВР. Учебный Курс» 2012 года (стр.315-319) …
В самой системе ардуиноIDE помимо обычных для Си/С++ функций включены и «системные» - использующие аппаратный функционал МК.
Особенностям применения данных функций (особенно при смене платформы-платки на иной базовый МК) следует уделить особое внимание.
Поскольку используется аппаратная часть — а она может заметно отличаться в разных семействах МК и, в дополнение, может создать проблемы в случае, если пользователь вознамерится использовать собственный доступ к аппаратным ресурсам.
То, что удалось по капушкам собрать в данном направлении (включая цитатки из некоторых популярных изданий):
Функция LOOP() представляет собой бесконечный цикл вида
for (;;;){}
содержащего обязательную часть поддержки последовательного интерфейса (если аппаратный последовательный интерфейс был активирован в SETUP(){Serial.begin();}).
Функция analogWrite()
выдает ШИМ сигнал с частотой приблизительно 490Гц.
Период ШИМ сигнала на портах D5 и D6 будет несколько длиннее. Это связанно с тем, что таймер для данных выходов также задействован функциями millis() и delay(). Данный эффект более заметен при установке коротких периодов ШИМ сигнала (1-10).
Выводы ШИМ базируются на:
D5 и D6 — таймер Т0;
D9 и D10 — таймер Т1;
D3 и D11— таймер Т2.
Функция tone()
основана на работе таймера Т2,
возможная минимальная частота сигнала 31Гц
возможная максимальная частота сигнала 65КГц
Функция shiftOut()
вариант, допускающий произвольное назначение выводов адуринки реализуется программно.
Функции millis() и micros()
основаны на работе таймера Т0 (системный таймер).
Следует также отметить, что в случае с кварцем, отличным от 16МГц разрешающая способность/кратность возвращаемого результата будет отличаться.
Функция delay()
основана на работе системного таймера использующего Т0.
Функция delayMicroseconds()
не использует таймеры/прерывания
посему может использоваться в случае необходимости внутри функций обработки прерываний. По одной из старых публикаций «максимальная корректно воспроизводимая пауза 16383».
Функция преобразования типа word()
выполняет как приведение к типу y=word(x);
так и компоновку двух байт в слово
y=word(h,l);
где h переменная/константа старшего байта,
l переменная/константа младшего байта.
(это правда есть и в референсе, но у популяризаторов практически не встречается).
Функция bit()
аналогия ассемблерного EXP2
возвращает 2 в степени позиционного номера бита bit в текущей переменной.
(бит 0=1, бит 1=2, бит 2=4, бит 3=8.....).
В функции attachInterrupt() для более поздних версий IDE изменилось описание параметров
вместо
attachInterrupt(interrupt, function, mode);
следует применять
attachInterrupt(digitalPinToInterrupt(Pin), function, mode);
(см.
https://www.arduino.cc/reference/en/lan ... interrupt/ ).
Как вариант можно использовать непосредственное управлене портами...
Однако это оправданно только в случае байтового чтения/записи ВСЕГО порта.
Состав содержимого референса на сайте
https://www.arduino.cc/reference/en/
на сегодня (15.10.2019) также претерпел некоторые изменения/дополнения.
В разделах
Conversion, Data Types
и возможно в других, детально мною пока не просматривавшихся...
