[Перевод] Lisp для микроконтроллеров

xzqg5jixsy0teyqekexuir2e6uk.png

Lisp для плат Arduino, Adafruit M0/M4, Micro: bit, ESP8266/32, RISC-V и Teensy 4.x.

Новость!


ARM версия 3.6b теперь поддерживает save-image (сохранение образа) на всех платах ATSAMD21 

В последнем релизе ARM uLisp, версия 3.6b, можно сохранять образ всего вашего рабочего пространства Lisp во флэш-память плат ATSAMD21, на которых не предоставляется отдельный чип DataFlash.

Таким образом, поддержка save-image добавляется к Adafruit Neo Trinkey, Adafruit Gemma M0, Adafruit Feather M0, Arduino Zero, Arduino MKRZero и Seeedstudio Xiao M0.

uLisp — это версия языка программирования Lisp, специально спроектированная для работы на микроконтроллерах с ограниченным объемом ОЗУ, от Arduino Uno на основе ATmega328 до Teensy 4.0/4.1. Независимо от платформы, можно использовать ровно одну и ту же программу на uLisp.

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

Кроме того, язык Lisp идеально подходит для изучения фундаментальных концепций программирования. В нем предусмотрена работа со строками, обработка списков и сборка мусора, а также этот язык отлично подходит для выражения сложных идей — например, научить робота выбираться из лабиринта или найти кратчайший путь на карте. uLisp не только поддерживает базовый набор функций Lisp, но и содержит расширения для Arduino, поэтому данный язык идеально подходит для управления Arduino.
Актуальную версию uLisp можно бесплатно скачать со страницы Download uLisp.

Проекты uLisp 


8489b2b6ae4f13f9bd7fbf64f6d9aeeb.jpg

Управление NeoPixels на ассемблере
aca572a5d58c6f709525d341b5a38935.jpg

Трассировка лучей при помощи uLisp
6da0469ddd887264f0a0e0cce58fb74e.jpg

Беджик Lisp 
6f080e4af3b1471f3883a7187646f217.jpg

Матричные часы 
2edfcb4a66de04a94cf1a650048c7548.jpg

Приложение для GPS-картографирования 
939675ef5ecdfcd481bbb7c23ddcf0e3.jpg

Интерфейс термопары 

Требования


ОЗУ: не менее 2 кбайт.

Память для хранения программ: не менее 32 кбайт.

ЭCППЗУ, флеш или cегнетоэлектрическая оперативная память (FRAM): при наличии используется для сохранения и загрузки рабочего пространства uLisp.

8/16-битные платформы


Версии uLisp для 8-битных и 16-битных платформ поддерживают целые числа в диапазоне от -32768 до 32767.

AVR-версия 

AVR-версия uLisp поддерживает следующие платы:

Arduino Uno или другие карты на основе ATmega328. На ней достаточно памяти для простого приложения на uLisp с использованием коротких символьных имен. Все Простые примеры пойдут на Arduino Uno.

Arduino Mega 2560 или другие платы на основе ATmega2560. С ними у вас будет достаточно памяти для весьма сложного приложения; см., например,  Animals,  Tweetmaze,  Route finder и Infinite precision arithmetic.

ATmega1284. Хотя, в Arduino нет официальной платы на этой основе, ATmega1284 легко подключить к макетной плате, причем, здесь предоставляется целых 16 кбайт ОЗУ.

Платы ATmega4809. Arduino Nano Every и отладочная плата Microchip Curiosity Nano — бюджетные платофрмы на основе ATmega4809.

32/64-битные платформы


Версии uLisp для 32-битных платформ поддерживают работу с целыми числами в диапазоне от 2147483647 до -2147483648, а также с 32-битными числами с плавающей точкой.

ARM 

ARM-версия uLisp поддерживает следующие платы:

Arduino Zero. Эта плата основана на ядре SAMD21 ARM Cortex-M0+ и предоставляет 256 кбайт флеш-памяти и 32 кбайт ОЗУ.

Arduino MKRZero. Похожа на Arduino Zero, основана на ядре SAMD21 ARM Cortex-M0+ и предоставляет 256 кбайт флеш-памяти и 32 кбайт ОЗУ. В ней имеется гнездо для SD-карты, поэтому SD-карту можно использовать для сохранения и загрузки образов uLisp.

Платы Adafruit M0. Платы Adafruit Gemma M0, Adafruit ItsyBitsy M0 и Adafruit Feather M0 все основаны на микроконтроллере ATSAMD21 48 MГц ARM Cortex M0+. У них схожие возможности и производительность; основные отличия между этими платами заключаются в их коэффициенте формы. 

Платы Adafruit M4. Платы Adafruit Metro M4 Grand Central, Adafruit Metro M4, Adafruit ItsyBitsy M4, и Adafruit Feather M4 все основаны на микроконтроллере ATSAMD51 120 MГц ARM Cortex M4.

Adafruit PyGamer и PyBadge. Adafruit PyGamer и PyBadge — это портативные игровые платформы на основе микроконтроллера ATSAMD51 120 MГц ARM Cortex M4, оснащенные цветным тонкопленочным дисплеем размером 160×128.

Платы Adafruit nRF52840. Adafruit CLUE и Adafruit ItsyBitsy nRF52840 обе основаны на микроконтроллере Nordic Semiconductor nRF52840 64 MГц ARM Cortex-M4,  с 1 Mбайт флеш-памяти для хранения программ и 256 Кбайт ОЗУ.

BBC Micro: bitЭта плата основана на микроконтроллере Nordic Semiconductor nRF51822 ARM Cortex-M0. Она работает на частоте 16 MГц и предоставляет 256 Кбайт флеш-памяти для программ и 16 Кбайт ОЗУ.

Maxim MAX32620FTHRЭта плата основана на микроконтроллере Maxim MAX32620 ARM Cortex-M4F, работающем на частоте 96 MГц, с 2048 Кбайт флеш-памяти и 256 Кбайт ОЗУ.

Teensy 4.0 и 4.1. Они основаны на процессоре NXP iMXRT1062 ARM M7, работающем на частоте 600 MГц с 1 Мбайт ОЗУ.

Версия ESP8266/ESP32 

Версия uLisp для ESP8266/ESP32 поддерживает следующие платы:

Платы ESP8266 . Эти платы основаны на 32-битном микропроцессоре Tensilica Xtensa L106, работающем на частоте 80 MГц, с 4 Мбайт флеш-памяти и 80 Кбайт ОЗУ. В них встроена функция Wi-Fi.

Платы ESP32. Эти платы основаны на 32-битном микропроцессоре Tensilica Xtensa LX6, работающем на частоте 160 или 240 MГц, с 4 Мбайт флеш-памяти и 80 Кбайт ОЗУ. В них встроена функция Wi-Fi и двухрежимный Bluetooth.

Версия RISC-V 

Версия uLisp для RISC-V поддерживает следующие платы:

Платы Sipeed MAiX RISC-V. Эти платы основаны на двухъядерном 64-битном процессоре Kendryte K210 RISC-V, 400 МГц, предоставляют 8 Мбайт ОЗУ и 16 Мбайт флеш-памяти. Они схожи по производительности. 

Другие платформы


Эти платы поддерживаются более ранними версиями uLisp:

Arduino Due. Эта плата основана на ядре AT91SAM3×8E ARM Cortex-M3 и предоставляет 512 Кбайт флеш-памяти, 96 Кбайт ОЗУ и часы 84 МГц.

Версия STM32 

Платы STM32. Платы STM32 Maple Mini и Blue Pill основаны на процессоре STM32F103 ARM Cortex-M3, работающем на частоте 72 МГц, с 128 Кбайт флеш-памяти и 20 Кбайт ОЗУ.

Версия MSP430 

Версия uLisp MSP430 поддерживает следующие платы:

MSP430 F5529 LaunchPad. Она использует флеш-память для сохранения образов и предоставляет достаточно памяти для весьма сложного приложения.

MSP430 FR5969 LaunchPad. Эта версия использует cегнетоэлектрическую оперативную память (FRAM) для рабочего пространства и для сохранения образов, благодаря чему памяти у вас в распоряжении будет предостаточно.

MSP430 FR5994 LaunchPad. Эта версия использует cегнетоэлектрическую оперативную память (FRAM) для рабочего пространства и для сохранения образов, благодаря чему памяти у вас в распоряжении будет предостаточно.

MSP430 FR6989 LaunchPad. Эта версия использует cегнетоэлектрическую оперативную память (FRAM) для рабочего пространства и для сохранения образов,  а также поддерживает вывод текста на встроенный ЖКИ-дисплей.

Производительность


См. Производительность.

Спецификация


В целом, этот язык является подмножеством Common Lisp, и программы на uLisp также должны работать под Common Lisp. Но обратите внимание: там одно пространство имен для функций и переменных; иными словами, нельзя использовать одно и то же имя для функции и переменной. 

На 8/16-битных платформах предоставляются списки, символьные последовательности, целые числа, символы, строки (на 32-битных платформах) и потоки.

Кроме того, на 32-битных платформах предоставляются числа с плавающей точкой и массивы, в том числе, битовые массивы.

Целое число — это последовательность цифр, которой может предшествовать знак »+» или »-». На 8/16-битных платформах целые числа могут быть в диапазоне от -32768 до 32767. На 32-битных платформах целые числа могут быть в диапазоне от 2147483647 до -2147483648. Целые числа можно вводить в шестнадцатеричной, восьмеричной или двоичной системе, при помощи нотаций #x2A, #o52, или #b101010, все эти варианты равны 42.

На платформах, обладающих более чем 2 Кбайт ОЗУ поддерживаются произвольные символьные имена, определяемые пользователем. В качестве символьной может использоваться любая последовательность, не являющаяся целым числом; так, например, 12a — допустимая символьная последовательность. На платформах всего с 2 Кбайт символьное имя может содержать до трех символов из множеств a-z, 0–9, или $, * или or -.

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

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

В uLisp есть сборщик мусора, работающий с применением алгоритма пометок (mark and sweep). Сборка мусора занимает менее 1 мсек на Arduino Uno или менее 3 мсек на Arduino Mega 2560 (см. Производительность).

uLisp также содержит простой редактор программ (см. Работа с редактором программ), средство трассировки и приятный принтер (см. Отладка в uLisp).

Пример


На следующем примере показано, как можно использовать uLisp.

Загрузив uLisp себе на микроконтроллерную плату, с ним можно наладить коммуникацию, вводя или вставляя команды в монитор порта или воспользовавшись последовательным терминалом. Подробнее см. Использование uLisp.

Допустим, вы подключили красный LED-индикатор к аналоговому выводу пина 9 на Arduino Uno. Затем можете ввести команду на Lisp:

(analogwrite 9 128)

чтобы установить LED в 128, что соответствует половинной яркости.

Чтобы не пришлось писать эту команду всякий раз, когда вы хотите установить красный LED, можно написать функцию red:

(defun red (x) (analogwrite 9 x))

Теперь можно добиться того же эффекта, что и выше, просто написав:

(red 128)

В обоих случаях цвет LED изменится сразу же, как только вы введете команду.

Допустим, вы используете потенциометр, который подключили к плате, чтобы варьировать напряжение на аналоговом входе A0. Можно определить функцию dim, чтобы потенциометр сам корректировал яркость LED, вот так:

(defun dim () (loop (red (/ (analogread 0) 4)))

и запустить, написав:

(dim)

Наконец, можно сохранить образ uLisp в ЭСППЗУ и указать, что dim должна выполняться при загрузке, введя:

(save-image 'dim)

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

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


Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

et1aypandyuamqprsz3m2ntm4ky.png

© Habrahabr.ru