- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программируем Arduino. Основы работы со скетчами - Монк Саймон
Шрифт:
Интервал:
Закладка:
Теперь сравним плату с моим стареньким ноутбуком Mac, имеющим два процессора, работающих с тактовой частотой 2,5 ГГц. Тактовая частота моего ноутбука более чем в 150 раз выше тактовой частоты Arduino. И хотя для выполнения каждой инструкции процессору требуется несколько тактов, он все же оказывается намного быстрее.
Попробуем выполнить следующую тестовую программу на Arduino и немного измененную ее версию — на моем Mac:
// sketch 04_01_benchmark
void setup()
{
Serial.begin(9600);
Serial.println("Starting Test");
long startTime = millis();
// Далее следует код тестирования
long i = 0;
long j = 0;
for (i = 0; i < 20000000; i ++)
{
j = i + i * 10;
if (j > 10) j = 0;
}
// конец кода, выполняющего тестирование
long endTime = millis();
Serial.println(j); // чтобы предотвратить оптимизацию цикла компилятором
Serial.println("Finished Test");
Serial.print("Seconds taken: ");
Serial.println((endTime — startTime) / 1000l);
}
void loop()
{
}
ПРИМЕЧАНИЕ
Версию программы на C для компьютера можно найти в разделе загрузки примеров на веб-сайте книги.
Вот какие результаты получились: на MacBook Pro с процессором 2,5 ГГц тестовая программа выполнялась 0,068 с, тогда как на Arduino Uno ей понадобилось 28 с. Плата Arduino оказалась примерно в 400 раз медленнее при решении данной задачи.
Сравнение плат Arduino
В табл. 4.1 показаны результаты выполнения этого теста в нескольких разных моделях платы Arduino.
Таблица 4.1. Результаты тестирования быстродействия Arduino
Модель
Время выполнения теста, с
Uno
28
Leonardo
29
Arduino Mini Pro
28
Mega2560
28
Due
2
Как видите, большинство моделей имеют схожую производительность, и только Due показала внушительный результат — она оказалась более чем в 10 раз быстрее остальных моделей.
Скорость арифметических операций
Для дальнейших исследований изменим только что использованный тест и вместо арифметики с длинными целыми протестируем быстродействие арифметики с вещественными числами. И те и другие занимают в памяти 32 бита, поэтому можно было бы ожидать, что время работы примера останется сопоставимым. В следующем тесте используем Arduino Uno.
// sketch 04_02_benchmark_float
void setup()
{
Serial.begin(9600);
while (! Serial) {};
Serial.println("Starting Test");
long startTime = millis();
// Далее следует код тестирования
long i = 0;
float j = 0.0;
for (i = 0; i < 20000000; i ++)
{
j = i + i * 10.0;
if (j > 10) j = 0.0;
}
// конец кода, выполняющего тестирование
long endTime = millis();
Serial.println(j); // чтобы предотвратить оптимизацию цикла компилятором
Serial.println("Finished Test");
Serial.print("Seconds taken: ");
Serial.println((endTime — startTime) / 1000l);
}
void loop()
{
}
К сожалению, с использованием вещественных чисел этот скетч выполняется намного дольше. Этот пример выполнялся в Arduino около 467 с вместо 28 с. То есть простая замена длинных целых чисел вещественными уменьшила скорость выполнения более чем в 16 раз. Справедливости ради следует заметить, что отчасти ухудшение обусловлено дополнительными операциями преобразования между значениями вещественных и целочисленных типов, которые также обходятся недешево в смысле времени выполнения.
Нужны ли вещественные числа в действительности?
Многие ошибочно полагают, что если измеряется такая характеристика, как температура, ее значение обязательно следует хранить в виде вещественного числа, потому что оно часто будет выражаться дробным числом, таким как 23,5. Вещественное число действительно может понадобиться, чтобы отобразить температуру, но ее необязательно хранить именно в таком виде.
Значения, прочитанные с аналоговых входов, имеют тип int, и на самом деле значимыми являются только 12 бит, что соответствует целым числам в диапазоне между 0 и 1023. При желании можно, конечно, сохранить эти 12 бит в 32-битном вещественном числе, но это никак не отразится на точности данных.
Значение, читаемое с датчика, может соответствовать, например, температуре в градусах Цельсия. Широко известный температурный датчик (TMP36) выводит напряжение, пропорциональное температуре. В скетчах, как показано далее, часто можно увидеть вычисления, преобразующие значение в диапазоне 0…1023, прочитанное с аналогового входа, в температуру в градусах Цельсия:
int raw = analogRead(sensePin);
float volts = raw / 205.0;
float tempC = 100.0 * volts — 50;
Но в действительности температура в виде вещественного числа нужна только тогда, когда требуется отобразить ее на экране. Другие операции с температурой, такие как сравнение или усреднение при нескольких попытках чтения, вполне можно выполнять с непреобразованным значением типа int, и при этом они будут выполняться значительно быстрее.
Поиск против вычисления
Как вы уже поняли, в скетчах вещественных чисел лучше избегать. Но как быть, если понадобится сгенерировать на аналоговом выходе сигнал синусоидальной формы, для чего, как можно догадаться, потребуется вычислять синус вызовом функции sin? Чтобы сформировать синусоидальный сигнал на аналоговом выходе, нужно обойти диапазон значений угла от 0 до 2
и вывести на аналоговый выход значение синуса этого угла. На самом деле все немного сложнее, потому что синусоиду нужно привести к диапазону значений, которые можно вывести на аналоговый выход.
Следующий пример генерирует синусоиду, разбивая каждый цикл на 64 шага, и выводит сигнал на аналоговый выход DAC0 платы Arduino Due. Имейте в виду, что для данного эксперимента годятся только платы Arduino с истинными аналоговыми выходами, такие как Due.
// sketch_-4_03_sin
void setup()
{
}
float angle = 0.0;
float angleStep = PI / 32.0;
void loop()
{
int x = (int)(sin(angle) * 127) + 127;
analogWrite(DAC0, x);
angle += angleStep;
if (angle > 2 * PI)
{
angle = 0.0;
}
}
Измерение на выходе показывает, что данный скетч действительно производит сигнал замечательной синусоидальной формы, но с частотой всего 310 Гц. Процессор на плате Arduino Due работает с тактовой частотой 80 МГц, поэтому можно было бы ожидать увидеть сигнал с большей частотой. Проблема в том, что здесь скетч снова и снова повторяет одни и те же вычисления. Но поскольку каждый раз получаются одни и те же результаты, почему бы просто не рассчитать их все сразу и не сохранить в массиве?
Следующий пример также генерирует синусоиду, разбивая цикл на 64 шага, но использует прием поиска по таблице заранее подготовленных значений, которые выводит непосредственно в цифроаналоговый преобразователь (ЦАП).
byte sin64[] = {127, 139, 151, 163, 175, 186, 197,
207, 216, 225, 232, 239, 244, 248, 251, 253, 254,
253, 251, 248, 244, 239, 232, 225, 216, 207, 197, 186,
175, 163, 151, 139, 126, 114, 102, 90, 78, 67, 56, 46,
37, 28, 21, 14, 9, 5, 2, 0, 0, 0, 2, 5, 9, 14, 21, 28,
37, 46, 56, 67, 78, 90, 102, 114, 126};
void setup()
{
}
void loop()
{
for (byte i = 0; i < 64; i++)
{
analogWrite(DAC0, sin64[i]);
}
}

