Интерпретатор uLisp для MCU

Вариант реализации простейшего реле времени с ядром, управляемым 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. Как можно заметить, компиляция в этом случае - это простое сжатие по определенным правилам, которое избавляет от сравнения строк на стороне интерпретатора. Так же на этапе компиляции производится проверка синтаксиса.

Ссылки на материалы

Original: http://igorkov.org/ulisp,
Author: igorkov