Добавить в корзинуПозвонить
Найти в Дзене
Будни инженера

Как сэкономить на микроконтроллере: Хитрость инженера

Ранее я рассказывал о разбросе цен на микроконтроллеры. Диапазон довольно широкий. Но, несмотря на это, если вы создаёте устройство в единичном экземпляре, то не так уж и важно, сколько стоит микроконтроллер — 500 рублей или 5000. А вот если ваше устройство выпускается серийно, то здесь разница в цена даже на 1 рубль может иметь очень даже существенное значение. И в таких случаях надо продумывать всё до мелочей, в том числе и выбор микроконтроллера. Представьте, что вы разрабатываете умный полив для газона. Датчик дождя срабатывает, полив надо отключить, и нужно подождать ровно 3 секунды, прежде чем закрыть клапан, чтобы успеть выключить насос и не получить гидроудар. Казалось бы, что тут сложного? Но проблема возникает, когда ваш микроконтроллер стоит копейки (например, 8-битный ATtiny), а время ожидания зависит от внешней переменной, которую нужно ДЕЛИТЬ. В математике нет ничего страшного, но для маленького дешевого процессора операция деления — это катастрофа. Она занимает в сотни р
Оглавление

Ранее я рассказывал о разбросе цен на микроконтроллеры. Диапазон довольно широкий. Но, несмотря на это, если вы создаёте устройство в единичном экземпляре, то не так уж и важно, сколько стоит микроконтроллер — 500 рублей или 5000. А вот если ваше устройство выпускается серийно, то здесь разница в цена даже на 1 рубль может иметь очень даже существенное значение. И в таких случаях надо продумывать всё до мелочей, в том числе и выбор микроконтроллера.

Представьте, что вы разрабатываете умный полив для газона. Датчик дождя срабатывает, полив надо отключить, и нужно подождать ровно 3 секунды, прежде чем закрыть клапан, чтобы успеть выключить насос и не получить гидроудар. Казалось бы, что тут сложного? Но проблема возникает, когда ваш микроконтроллер стоит копейки (например, 8-битный ATtiny), а время ожидания зависит от внешней переменной, которую нужно ДЕЛИТЬ.

В математике нет ничего страшного, но для маленького дешевого процессора операция деления — это катастрофа. Она занимает в сотни раз больше времени, чем сложение или сдвиг. Из-за этого процессор может "тормозить", не успевая опрашивать другие датчики. Выход — покупать более мощный и дорогой чип со встроенным аппаратным делителем. Или... обмануть математику.

Суть проблемы на пальцах

Допустим, нам нужно выдержать задержку в зависимости от скорости ветра (чем сильнее ветер, тем меньше ждем перед закрытием, чтобы не разбрызгивать воду).

Пусть базовый такт таймера — 1 миллисекунда. А скорость ветра измеряется в условных единицах от 0 до 10.

Формула:
Время_ожидания = (3000 мс) / (Скорость_ветра + 1).

Если ветер = 2, то ждем 1000 мс. Если ветер = 5, ждем 500 мс.

Для процессора это операция деления 3000 на 5. Это сложно и долго.

Гениальное решение "бедных"

Вместо того чтобы измерять скорость ветра в десятичных единицах (0, 1, 2...10), мы переопределяем шкалу датчика. Мы заставляем его выдавать показания степенями двойки: 1, 2, 4, 8, 16.

А вместо того чтобы делить на скорость, мы будем делить на степень двойки. А деление на 2, 4, 8 или 16 в микропроцессоре — это просто сдвиг битов вправо.

Смотрите, как это работает в коде (мысленно):

  • Раньше: 3000 / 5 = 600 мс. (Нужно делить).
  • Теперь: Мы берем число 3000 и применяем к нему сдвиг.

Допустим, скорость ветра = 4 (по нашей новой шкале). Нам нужно поделить 3000 на 4.
Вместо деления мы просто сдвигаем двоичное представление числа 3000 на 2 бита вправо (потому что 4 = 2²).

3000 >> 2 = 750 мс. Результат почти тот же, что нам нужен, но операция занимает 1 такт процессора вместо 50 тактов при делении. Ну а в некоторых случаях, если постараться, то можно добиться ещё большей точности.

Почему это работает?

Мы пожертвовали точностью измерения скорости (теперь у нас не 10 градаций, а всего 5), но зато мы избавили процессор от тяжелой работы.

В итоге:

  1. Мы используем микроконтроллер за $0,50 вместо $2,50.
  2. Программа работает быстрее, так как сдвиг выполняется аппаратно даже в самых простых чипах.
  3. Мы тратим меньше энергии, потому что процессор быстрее выполняет свои задачи и переходит в спящий режим.

В сухом остатке

Это классический пример инженерной хитрости: вместо того чтобы заставлять железо считать сложные формулы, мы подгоняем физическую величину (скорость ветра) под возможности железа. Мы переходим от десятичной системы к двоичной там, где это выгодно.

Такой подход называется "Ценою точности получаем скорость". И это гораздо умнее, чем просто купить более мощный процессор. Иногда лучше потратить час на пересчет формул, чем платить лишние деньги за каждый чип в партии из 10 000 устройств.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить…