Визначаємо швидкодію обробника переривань GPIO ESP8266, що досягається на рівні Lua

Задача

Під час проектування чергового пристрою, нам потрібно було побудувати інтеграцію між двома різними системами. І саме через цю необхідність було вирішено перевірити, з якою швидкістю програмний обробник переривань може обробляти зміни вхідного дискретного сигналу на GPIO ESP8266 з рівня Lua.

Для виконання такої перевірки ми використали:

  • модуль мікроконтролера ESP8266-12;
  • для тестування обрали GPIO D3;
  • регульований генератор тестового вхідного сигналу квадратної форми (меандр) з скважністю 50%;
  • тестовий скрипт, написаний на Lua.

Тестовий код

Для того, щоб витягнути з Lua максимальну швидкодію, тестовий код був спеціальним чином оптимізований, а частота ЦП мікроконтролера підвищена до максимуму у 160 МГц.

Оптимізація коду покладається на настанови автора мови (ознайомитися можливо тут: https://www.lua.org/gems/sample.pdf) і полягає у двох заходах:

  • переведення всіх глобальних викликів і змінних у локальні;
  • запобігання повторюваному пере-гешуванню таблиці.

Результати тестування

Ми вирішили не “обкидувати” цю публікацію нудними скріншотами з консолі, а натомість розмістили тексти з тієї ж консолі – так краще видно.

Перевірка з максимальною частотою тактування центрального процесора (160 МГц)

Вхідний дискретний сигнал частотою 100 Гц

Виконання тестового коду при частоті генератора на GPIO D3 100 Гц.

Як видно з видачі, події з 0 по 10 обробилися без брязкоту (стовпчик cnt праворуч з одиниць) – це значить, що контролер все встиг обробити і взаємних накладок фронтів не відбулося.

На цій частоті все добре. Спробуємо перейти в наступний діапазон: 200-300 Гц.

Вхідний дискретний сигнал частотою 200 – 300 Гц

Виконано запуски тестового коду при частоті генератора на GPIO D3 починаючи з 300 Гц з поступовим зниженням частоти доти, доки контролер не почав стабільно якісно обробляти сигнал.

Тест почав виконуватися стабільно на частоті 230 Гц: 10 / 10 запусків дали якісний результат – всі події оброблені без накладок, всі таймаути витримано в припустимих межах.

Приклад одного з запусків:

Це пікова можлива частота обробки подій на рівні прикладного скрипта Lua. Якщо частоту вхідного тестового сигналу збільшити, то події починають проскакувати повз Lua-обробник подій, або сприймаються ним як брязкіт.

Перевірка з частотою тактування центрального процесора за замовчуванням (80 МГц)

В коді встановлюємо частоту ЦП явно 80 МГц, або просто прибираємо інструкції з встановлення частоти ЦП, адже модуль за замовчуванням працює на потрібній нам частоті.

Вхідний дискретний сигнал частотою 230 Гц

І зразу перевіряємо, як контролер відпрацює наш тестовий код з вхідним сигналом частотою 230 Гц, але вже при частоті ЦП 80 МГц.

Приклад одного з запусків:

Як можна бачити (рядки: 6 int: 1 1028985951 2 та rising edge delta uSec: 8622) , мали отримати 230 Гц, але контролер нарахував лише 210 Гц. Так відбулося через те, що контролер просто не встиг обробити всі вхідні зростання фронтів періодичного сигналу.

10 з 10 разів тест виконався з помилками. Обробник не встигає реєструвати події і вони “ковтаються”. Переходи у “Up” та “Down” – або плутаються між собою, або складаються обробником до купи – як одна триваліша подія, чи брязкіт.

Спробуємо поступово знизити частоту вхідного сигналу так, щоб контролер почав успішно відпрацьовувати тест:

  • 225 Гц: 2 з 10 успішно;
  • 220 Гц: 6 з 10 успішно;
  • 215 Гц: 8 з 10 успішно;
  • 210 Гц: 9 з 10 успішно;
  • 205 Гц: 10 з 10 успішно.

Таким чином ми визначили, що 205 Гц є максимальною частотою вхідного дискретного сигналу на GPIO ESP8266, який NodeMCU з Lua може стабільно обробляти засобами обробника переривань з стандартними налаштуваннями частоти (80 МГц) ЦП ESP8266-12.

Висновки

За декілька сот запусків у різних режимах і з різними частотами, ми на практиці визначили, що з прошивкою NodeMCU / Lua можливо стабільно обробити вхідні дискретні сигнали макимальною частотою до 205 Гц при 80 МГц ЦП; та до 230 Гц при 160 Гц ЦП:

Частота обробки подій на GPIO при Duty 50%Частота ЦП ESP8266, МГц
205 Гц80 МГц
230 Гц160 МГц

Чи означає це, що NodeMCU дуже повільна система? – з нашого досвіду – ні. Адже NodeMCU відмінно працює з пристроями по шині I2C, де мінімальна частота тактування 100 000 Гц, також NodeMCU працює з зовнішніми пристроями через інтерфейс SPI, де стандартна швидкодія 80 МГц / 8 = 10 000 000 Гц.

Також на контролері ESP8266 / NodeMCU одночасно з вже згаданими процесами, постійно працюють повноцінний WiFi та UART.

Але так, слід брати до уваги, що отримані нами результати свідчать: систему реального часу на базі даної реалізації NON OS SDK + NodeMCU Lua, будувати не варто.

NodeMCU це мініатюрний супергерой, який просто не призначений для польотів у Космос, комп’ютерного бачення чи автономного керування автомобілем.

Втім, цей мікроконтролер цілком дозволяє користувачеві натискати на кнопки 200 разів на секунду – тепер ми це теж знаємо!. 😉

Зверніть також увагу, що ці тестування виконувалися лише на зростаючих фронтах, а також з вхідним сигналом, що має Duty Cycle 50%. За інших умов, результати можуть бути іншими.