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

в 7:01, , рубрики: Без рубрики

Lisp для микроконтроллеров - 1

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 

Lisp для микроконтроллеров - 2

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

Lisp для микроконтроллеров - 3

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

Lisp для микроконтроллеров - 4

Беджик Lisp 

 

Lisp для микроконтроллеров - 5

Матричные часы 

Lisp для микроконтроллеров - 6

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

Lisp для микроконтроллеров - 7

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

Требования

ОЗУ: не менее 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. С ними у вас будет достаточно памяти для весьма сложного приложения; см., например, AnimalsTweetmazeRoute 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, оснащенные цветным тонкопленочным дисплеем размером 160x128.

Платы 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. Эта плата основана на ядре AT91SAM3X8E 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% скидку на первый месяц аренды сервера любой конфигурации!

Автор: owlofmacloud

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js