Вариант реализации простейшего реле времени с ядром, управляемым LISP-подобным языком.
Lisp машина в данном случае состоит из 2х частей: это компилятор и интерпретатор. Компилятор производит сжатие исходного файла с переводом его в байт-формат, понятный интерпретатору. Компиляция сделана для более быстрого выполнения кода в интерпретаторе на микроконтроллере.
Ключевые слова (операторы):
WHILE - цикл. IF - условие выполнения. SETQ - установка переменной (или порта ввода-вывода). DELAY - задержка исполнения (в миллисекундах). PRINT - печать переменных на экран. STOP - остановка исполнения.
Арифметические операции:
= (EQ) - равно /= (NEQ) - не равно < (LESS) - меньше > (MORE) - больше + (ADD) - сложить - (SUB) - вычесть * (MUL) - умножить / (DIV) - разделить & (AND) - логическое побитовое AND | (OR) - логическое побитовое OR ^ (XOR) - логическое побитовое XOR
Входные переменные (на порт завязан младший бит данных): A, B, C, D (в сборке для WIN32, это обычные переменные).
Выходные переменные (на порт завязан младший бит данных): X, Y, Z (в сборке для WIN32, это обычные переменные).
Внутренние переменные (16 бит для CY7, 32 бит для Win32): I, J, K.
Функциональные порты ввода-вывода Cypress CY7C63803:
------------------------------------------------ | Pin # | Name | Description | ------------------------------------------------ | 1 | P0.6/TIO1 | PORT A | | 2 | P0.5/TIO0 | PORT B | | 3 | P0.4/INT2 | PORT C | | 4 | P0.3/INT1 | PORT D | | 5 | P0.2/INT0 | | | 6 | P0.1 | STATUS LED RED | | 7 | P0.0 | STATUS LED GREEN | | 8 | Vss | +5V | | 9 | P1.0/D+ | STMCLK - Serial Clock | | 10 | P1.1/D- | STMDATA - Serial Data | | 11 | VDD | Ground | | 12 | P1.2/VREG | BOOTLOADER PIN | | 13 | P1.3/SSEL | | | 14 | P1.4/SCLK | PORT Z | | 15 | P1.5/SMOSI | PORT Y | | 16 | P1.6/SMISO | PORT X | ------------------------------------------------
Принципиальная схема реле, на котором работает uLisp:
И вид платы:
Файл для печати:
Простая программа для переключения реле с частотой 1Гц:
(WHILE 1 (IF (= A 1) (DELAY 1000) ; задержка включения реле 1 секунда (SETQ A 1)) (IF (= A 0) (SETQ A 0)) )
"Компилируется" она в такую строку:
(w1(i(=A1)(dg##)(sA1))(i(=A0)(sA0)))
Символы ## - непечатные значения, в которых сохранена константа 1000. Как можно заметить, компиляция в этом случае - это простое сжатие по определенным правилам, которое избавляет от сравнения строк на стороне интерпретатора. Так же на этапе компиляции производится проверка синтаксиса.