Мысли по Forth-библиотеке под Arduino-совместимые платы

 
+
-
edit
 

Balancer

администратор
★★★★★
Часто стало требоваться управлять встроенными железками по последовательному каналу, из сети или как-то ещё. Конечно, первое, что тут приходит в голову — это Forth. Но нормальных готовых решений нет, всерьёз браться за свою реализацию некогда, так что на коленке обычно велосипедится всякое управление из потока по JSON и т.п.

Но такая возня утомила, так что решил попробовать потратить время и сделать под это дело Forth-библиотеку.

Готового ничего не нашёл, это именно либо полноценные Forth-прошивки, либо что-то совсем не-Фортовое…

Думаю о самом простом решении на прямом шитом коде с классической организацией словаря, с сохранением компилированного Форт-кода в RAM и/или EEPROM. Объёмы там смешные, даже по сравнению с Flash, но и задачи не грандиозные. Впрочем, надо подумать, может, R/O-часть и во Flash можно засунуть, не весь же словарь на низком уровне делать?

Реализовываться всё будет в виде Arduino-библиотеки, чтобы подключать её к стандартным программам. Скорее всего в виде нескольких независимых частей, самый минимальный базис для парсинга + опциональные типовые разделы по стандарту (CORE/TOOLS/разные EXT и т.п.) по мере надобности (если возникнет).
 55
+
-
edit
 

Balancer

администратор
★★★★★
Забавно. Сколько писал разных Форт-систем, но первый раз это делаю на Си++ :)

После практических прикидок, понял, что понятия не имею, как на Си в прямом шитом коде реализовать операцию NEXT :) Т.е. банально не понимаю, как на Си скомпилировать безусловный переход по адресу, хранящемуся в памяти.

Пришлось слово хранить как и любой шитый код в виде последовательности адресов, но интерпретировать его не самими же словами, а вызывающей функцией и завершать последовательность по 0x0000.

В целом генерация кода слов начерно сейчас работает. Выглядит примерно так:

// Примитивы
void test1() { Serial.println("Test1"); }
void test2() { Serial.println("Test2"); }
void test3() { Serial.println("Test3"); }

// Высокоуровневые слова
COLON(word3, W({ test2, test3, 0 }))
COLON(word4, W({ word3, 0 }))

// Вызов высокоуровневого слова из Си:

word4();


Теперь надо ломать голову над реализацией стека возврата :)
 55
RU Balancer #09.09.2018 02:02  @Balancer#08.09.2018 20:50
+
-
edit
 

Balancer

администратор
★★★★★
Balancer> Теперь надо ломать голову над реализацией стека возврата :)

Ну, в общем, управление потоком исполнения работает. Хотя чуть голову не сломал, не понимая, почему у меня обнуляется стек возвратов. Оказалось, хитрое антипереполнение стека данных :D

Помигаем:


// LED_BUILTIN HIGH DIGITAL!
void word_digital_write()
{
  int pin = _pop();
  digitalWrite(pin, top_x);   // turn the LED on (HIGH is the voltage level)
  top_x = _pop();
}

void word_delay()
{
  delay(top_x);
  top_x = _pop();
}


COLON(led_on, W({lit, LED_BUILTIN, lit, HIGH, word_digital_write, 0 }));
COLON(led_off, W({lit, LED_BUILTIN, lit, LOW, word_digital_write, 0 }));

COLON(blink, W({led_on, lit, 500, word_delay, led_off, lit, 500, word_delay, 0}));

COLON(fmain, W({blink, blink, blink, blink, 0}));

void setup() {
  Serial.begin(9600);
  while (!Serial) { }

  pinMode(LED_BUILTIN, OUTPUT);
  fmain();
}

void loop() {

}
 55
+
-
edit
 

vvarnak

новичок
Balancer> Готового ничего не нашёл, это именно либо полноценные Forth-прошивки, либо что-то совсем не-Фортовое…
А почему не устраивают именно Форт-прошивки?
И чем будет отличаться использование библиотеки от использования прошивок?
Как будет выглядеть код, использующий эту библиотеку: как входной поток форта или как-то ещё?
 55
+
-
edit
 

Balancer

администратор
★★★★★
vvarnak> А почему не устраивают именно Форт-прошивки?

Несовместимостью с огромным набором целевых библиотек под Ардуино.

vvarnak> Как будет выглядеть код, использующий эту библиотеку: как входной поток форта или как-то ещё?

Да, просто получил входной поток, с того же Serial, скормил Форт-транслятору, что надо сделалось. Основная задача, я писал вначале, просто гибкое управление железкой, чтобы не требовалось перепрошивать по каждому чиху и чтобы не велосипедить протоколы управления.
 55

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru