Espruino: javascript в микроконтроллере

Espruino: javascript в микроконтроллере

«Для чего?», «Что за абсурд?», «Извращение!», «Фу-фу-фу» — вот кое-какие из многих высказываний, каковые мы услышали, в то время, когда выпустили плату Iskra JS на ядре Espruino.ЗачемКогда верный электронщик слышит, что что-то сделано на Arduino, температура его тела поднимается приблизительно на полградуса: «забрали годный микроконтроллер и вместо того, дабы фигак-фигак и регистрами выжать из него все соки, опошлили всё на свете… нет слов, одна неприязнь».
Смотрите кроме этого: JavaScript-движок из Микрософт Edge переходит на open source

День назад на конференции JSConf компания Микрософт заявила о том, что JavaScript-движок ChakraCore, применяемый в браузере Edge, сейчас дешёв разработчикам в виде проекта с открытым исходным кодом. Уже в следующем месяце все главные компоненты движка будут доступны для загрузки всем желающим на GitHub. ChakraCore не привязан к браузеру Edge: им возможно руководить через особые API, что разрешает применять движок в разных приложениях.ChakraCore создан для применения в любом приложении, которому требуется стремительный, масштабируемый и несложный движок.

Но так как возможно пойти ещё дальше. Забрать микроконтроллер Cortex M4, что в десятки раз богаче того, что стоит на той же Arduino Uno, запихнуть в том направлении интерпретатор JavaScript и делать проекты на JavaScript!Пологаю, что на этом моменте те, кто не готов к такому надругательством над святыми микросхемами, уже лопнули. Я продолжу для остальных.В хобби-электронике для подавляющего большинства проектов Arduino Uno хватает за глаза.

А также не имеет значения будет она трудиться на штатных 16 МГц либо на 4 МГц: включится ли подсветка кровати либо насос на даче за 1 мс либо за 10 мс не имеет значения.Что имеет значение, так это то, что C++ — сложный и древесный. Да, он близок к железу, но как раз исходя из этого требует глубокого понимания информатики и этого железа. Добавим к этому синтаксис с кучей нюансов, что есть суммой неточностей 30-летнего развития языка.

После этого лишим то, что оказалось адекватных массивов, строчков, словарей, а ещё лучше — по большому счету лишим динамической памяти. Вот, наконец мы взяли Arduino.Замечая за вопросами на отечественном форуме я вижу, что люди тратят время на долбание с языком, а не на сути собственных проектов. Так из-за чего бы не снизить пропасть между людьми и железом? Железо — недорогое и всегда развивается, время людей — дорогое и ниоткуда не берётся.Похожий процесс я замечал много лет до тех пор пока трудился в разработке игр.

В 2003-м году представить было нельзя, что игру возможно писать на чём-то не считая C/C++. Позже в движках показались встроенные скрипт автомобили. А после этого и создание полноценного продукта произошло без единой строчка на Си.

Лишь Java, C#, Ruby, Python, JavaScript. Это логично, по причине того, что железо начало тянуть «медленные языки», а засчёт в разы более большего количества и быстрой разработки дешёвых программистов, произошло больше ресурсов тратить на интересность игры, а не на поиск утечек памяти.На что похоже программирование микроконтроллеров на JavaScriptПрограммирование похоже на… JavaScript. На разработку для браузера либо Node.js.

Вот пример:// SMS var sim = require(‘@amperka/Sim900r’).connect(); sim.powerOn(); sim.on(‘sms’, function(sms) { var rgb = sms.text.split(‘ ‘); var r = +rgb[0]; var g = +rgb[1]; var b = +rgb[2]; if (isNaN(r + g + b)) return; fadeTo(r, g, b); });// Лента SPI2.setup({baud:3200000, mosi:B15}); var LED_COUNT = 150; var colors = new Uint8ClampedArray(LED_COUNT * 3);function fadeTo(r, g, b) { var n = 0; var ivalID = setInterval(function() { colors[n*3 + 0] = b; colors[n*3 + 1] = r; colors[n*3 + 2] = g; SPI2.send4bit(colors, 0b0001, 0b0011); if (n++ = LED_COUNT) { clearInterval(ivalID); } }, 50); } Эта программа занимается тем, что принимает SMS’ки и в зависимости от их текста бегущим огоньком меняет цвет подключённой RGB-ленты. Мы делали таковой проект для отечественной новогодней ёлки, но на хорошей Arduino.

Кода было в 4 раза больше.Ядро EspruinoИтак, у компьютера имеется движки V8 и SpiderMonkey для JavaScript. А у микроконтроллеров имеется движок Espruino.В случае если сказать грубо, движок Espruino — это firmware (скетч, скетчище) для микроконтроллеров, что со своей стороны может выполнять JavaScript-код, что вы передаёте на плату через serial-соединение, к примеру по USB.Espruino — это open source проект, фаундером которого есть Gordon Williams. Человек, что в одиночку реализовал солидную часть всей экосистемы и удачно сходил с ней на KickStarter.Эта экосистема имеет несколько главных частей:

  • Espruino Web IDE — среда программирования;
  • Espruino Firmware — JavaScript-машина, которая крутится на микроконтроллере;
  • Железо — сами платы, каковые совместимы с Espruino;
  • Стандартная и внешние библиотека ;
  • Документация.

Обо всём по порядку.Среда программированияНаписание JavaScript-кода, загрузка его в плату и наблюдение за выводом происходит в Espruino Web IDE. Это приложение для Гугл Chrome, исходя из этого оно ставится в 1 клик и трудится под всеми настольными операционками.Для пользователя эта среда заменяет Arduino IDE.По функционалу Espruino IDE, само собой разумеется, большое количество несложнее полновесных Eclipse либо Visual Studio, но она более продвинута, чем Arduino IDE.В случае если окинуть окно среды одним взором, заметите окно для кода (справа), окно консоли (слева) и кнопку для загрузки кода в плату.Консоль — это как Serial Monitor в Arduino IDE, но в отличии от него он не только выводит, но и принимает: возможно прямо налету, без ресета и загрузки новой программы, привести к функции, взглянуть значение переменной, прервать цикл и т.п.Поработав плотнее, вы столкнётесь с отладчиком (ага, step-by-step выполнение, breakpoint’ы), подсказками редактора, подсвечиванием неточностей налету и другими приятными фишечками.Помимо этого, прямо из IDE возможно обновить версию самой Espruino Firmware до последней.

Среда сама сама скачает последний дешёвый релиз и зальёт его через USB.FirmwareСердце совокупности — firmware, которая крутится на микроконтроллере. Она написана на чистом Си, загружается единожды в отдельное место флеш-памяти микроконтроллера и занимается тем, что выполняет пользовательский JS-код, что приходит через последовательное соединение либо находится в пользовательской области флеш-памяти.В случае если схематично изобразить расклад флеш-памяти для Iskra JS, возьмём такую картину:ЗагрузчикСначала идёт загрузчик, которы не обновляется (условно) ни при каких обстоятельствах. Это маленькая программа, с выполнения которой полностью постоянно начинается жизнь микроконтроллера по окончании включения либо сброса.Загрузчик делает достаточно несложную вещь:

  • Если не надавлена пользовательская кнопка BTN1, тут же передаёт управление интерпретатору.
  • В случае если кнопка была надавлена при старте, он зацикливается на себе и ожидает или до тех пор пока кнопку надавят ещё раз, дабы таки выйти в интерпретатор, или ожидает до тех пор пока через USB загрузят новую версию интерпретатора. В этом случае bootloader перепишет область флеш-памяти с Espruino Firmware, а мы возьмём на плате свежую версию интерпретатора.

ИнтерпретаторИтак за загрузчиком направляться интерпретатор, что совершает главную работу.В то время, когда он стартует, контролирует посредством проверки чудесного байта, имеется ли в пользовательской флеш-памяти сохранённый код JavaScript. В случае если имеется, принимается его выполнять.В случае если кода нет либо же, в случае если мы вручную посредством BTN1 вышли из загрузчика, ничего слёту выполнено не будет, мы готовую к работе JS-машину.Свободная памятьПосле интерпретатора имеется ничейная область памяти, которую вы имеете возможность применять для энергонезависимого хранения собственных данных.

Это необычная замена EEPROM на Arduino, но со своей спецификой, а ещё её в десятки-сотни раза больше.Пользовательский кодЗдесь хранится та JS-программа, которую делает интерпретатор. Программа лежит в том месте в простом текстовом виде, одним брикетом, как имеется.За то, дабы множество подключённых библиотек с их зависимостями и ваша личная программа превратились в один литой и минифицированный брикетик следит при загрузке IDE.Вернее, всю работу делает не IDE, а её GUI-свободная составная часть EspruinoTools, у которой имеется интерфейс коммандной строки и точка входа для применения в качестве Node.js-модуля.

Исходя из этого при жажде вы имеете возможность применять Vim, Atom, Eclipse либо чего вам эргономичнее для разработки.На месте кода вместо текстового брикета может лежать сохранённый двоичный слепок оперативной памяти, что всецело отражает состояние интерпретатора на момент сохранения. Но это уже технические подробности не для беглого обзора.БиблиотекиБиблиотеки возможно поделить на 3 вида: стандартная, встроенные и внешние.Стандартная библиотекаСтандартная библиотека — это функции и объекты, каковые возможно слёту применять.

Среди них, как привычные и прописанные в стандарте языка `Date`, `JSON`, `Math`, `Object`, `setInterval`, `setTimeout` и другие-другие, так и специфичные для Espruino функции для работы с пинами, интерфейсами, памятью.Среди функций вы отыщете привычные ардуинщику `pinMode`, `digitalRead`, `digitalWrite`, `analogRead`, `analogWrite`, а ещё не столь привычные `setWatch` для наблюдения за входными пинами, `digitalPulse` для правильной генерации последовательности цифровых импульсов и ещё большое количество различных штук для работы с периферией.Кстати, не обращая внимания на то, что функция `pinMode` на платформе имеется, по умолчанию она трудимся сама, за кадром, исходя из этого в большинстве сценариев имеете возможность о ней не вспоминать (на этом месте звучно лопнул последний электронщик).Чего вы не отыщете в стандартной библиотеке, так это `delay`. Mamma Mia, как я благодарен за это!

Достаточно мало перестроить мышление и делается ясно, что всё решается через `setInterval`, `setTimeout` без всякого `delay`.В признательность вы приобретаете асинхронность выполнения: имеете возможность мигать двадцатью светодиодами независимо, каждым со своей частотой. А ещё вы приобретаете энергоэффективность: `delay` — это прожигание процессорного сремени, а без `delay` процессор может мирно дремать до тех пор пока нечего делать.

В Espruino до тех пор пока нет работы процессор засыпает и потребляет в десятки раз меньший ток.Встроенные библиотекиВстроенные библиотеки — это такая же часть стандартной библиотеки в том смысле, что они жёстко вшиты в Espruino Firmware, но для доступа к их функционалу требуется синтаксически их подключить посредством привычной JavaScript-программистам функции `require`.Среди таких библиотек вы отыщете, к примеру, `fs` для работы с файловыми совокупностями SD-карт, `http` для веб-интерфейса к собственному устройству, `Waveform` для записи/воспроизведения аудиосигналов и другие.Стандартная и встроенные библиотеки реализованы на чистом Си, а пользователю выведен только JavaScript-интерфейс в виде комплекта объектов, модулей и функций. Это разрешает достигнуть большой эффективности для реализации сложных методов, оставляя наряду с этим возможность обращения к ним из высокоуровнего кода.Вы и сами имеете возможность реализовать на Си что-то, на что JavaScript сообщил бы «нет, благодарю», а наружу вывести лишь пара нужных для запуска хвостов.Внешние библиотекиВнешние библиотеки — это то, что формирует достаток экосистемы.

Их пишут на JavaScript авторы Espruino, мы пишем, пишут пользователи Espruino.Храниться они смогут на локальном диске, в песочнице текущего проекта, смогут быть в интернет-репозитории, смогут быть на GitHub’е, смогут лежать на NPM’е.Подключаются библиотеки, традиционно, посредством `require`.В то время, когда среда видит `require`, она рекурсивно загружает их из удалённого источника и при загрузке скетча приклеивает их содержимое к началу вашей программы. Так для микроконтроллера формируется цельный брикетик с кодом, о котором я сказал выше.Таковой подход свидетельствует кроме этого, что в отличии от Arduino пользователю не требуется спотыкаться о то, что библиотеку для начала необходимо отыскать, скачать, положить куда необходимо.

Достаточно легко слямзить откуда-нибудь понравившийся среда и скетч сама разберётся с зависимостями от библиотек.ЖелезоВот мы и подошли к самому осязаемому компоненту экосистемы Espruino. Это платы, каковые смогут выполнить Espruino Firmware.К ним относятся уникальные Espruino Board, Espruino Pico, и выпущенная Амперкой Iskra JS.

На перечисленных платах всё уже установлено на заводе, они сходу готовы к работе.Вы имеете возможность пара раз ударить в бубен и самостоятельно поставить Espruino-ядро на STM32 Discovery, Nucleo и, неожиданно, на ESP8266.ДокументацияНет ничего грустнее, чем что-то весьма крутое и замечательное, но без документации.У Espruino — хорошая документация. На www.espruino.com/Reference вы отыщете большое количество справочных и обучающих статей.Мы желаем сделать ещё больше и лучше. Исходя из этого создали отдельный раздел: js.amperka.ru, снимаем видеоуроки.

Работа до тех пор пока в ходе, но очень многое уже освещено.И традиционно для тех, кто обожает коробочные ответы, мы создали комплект «Йодо». В нём Iskra JS, цветная книга и модули.Вот такая петрушка. Тайной остаётся только то, смог ли хоть один верный электронщик дочитать до данной строки?

Случайная статья:

Игорь Зотов — Iskra JS: JavaScript в микроконтроллере


Похожие статьи:

Комментирование и размещение ссылок запрещено.

Обсуждение закрыто.