Читаем Программируем Arduino. Профессиональная работа со скетчами полностью

В следующей главе мы познакомимся с приемами увеличения производительности Arduino до максимума.

4. Ускорение Arduino

В этой главе рассказывается, как определить производительность платы Arduino и как выжать из нее дополнительную мощность, когда это необходимо.

Как определить производительность Arduino?

Прежде чем заняться изучением приемов увеличения скорости работы скетчей, потратим немного времени на тестирование Arduino, чтобы просто понять, насколько ее производительность сопоставима с производительностью компьютеров, начав с таких понятий, как мегагерц и гигагерц.

Тактовый генератор на плате Arduino Uno имеет частоту 16 МГц. Большинство инструкций (сложения или сохранения значения в переменной) выполняется за один такт. То есть Uno может выполнять до 16 млн элементарных операций в секунду. Вроде бы неплохо, не так ли? Однако все не так просто, потому что инструкции на языке C, которые вы пишете в скетчах, разворачиваются в множество машинных инструкций.

Теперь сравним плату с моим стареньким ноутбуком 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-битном вещественном числе, но это никак не отразится на точности данных.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных