makc 214 10 августа Опубликовано 10 августа · Жалоба 43 минуты назад, mantech сказал: Он же вроде под линукс, не? Нет, он под bare metal: Цитата Targeted at embedded systems engineers and researchers who want to explore the hardware by writing small functions that can be triggered from a shell like interface. 43 минуты назад, mantech сказал: https://github.com/rswier/c4 Спасибо, посмотрел но для моего случая это плохо подходит, т.к. синтаксис C мало кому привычен из техников. С админами проще, но тоже будут вопросы, поэтому я и ищу что-то типа TCL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 10 августа Опубликовано 10 августа (изменено) · Жалоба 31 минуту назад, makc сказал: синтаксис C мало кому привычен их техников Думаю, техникам любой синтаксис не привычен, ну кроме матерного)))))) Это ж техники, не программисты))) Изменено 10 августа пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 10 августа Опубликовано 10 августа · Жалоба 3 минуты назад, mantech сказал: Думаю, техникам любой синтаксис не привычен, ну кроме матерного)))))) Это ж техники, не программисты))) Команды в командной строке они умеют вводить, параметры обычно идут просто через пробел, а в С с этим посложнее будет, скобочки всякие, запятые и т.д. Так что хотелось бы обойтись без этих сложностей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 1 10 августа Опубликовано 10 августа · Жалоба On 8/10/2024 at 2:47 PM, mantech said: техникам любой синтаксис не привычен, ну кроме матерного для них алиасы есть в шелле Quote $ alias херак="cat /etc/lsb-release" $ херак DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 10 августа Опубликовано 10 августа (изменено) · Жалоба 2 часа назад, makc сказал: Команды в командной строке они умеют вводить, параметры обычно идут просто через пробел, а в С с этим посложнее будет Так эт просто команды, типа МС-ДОС cmd консоль, но скрипты там не сделать... Ну и надо для начала понимать, какие возможности должны предоставлять эти скрипты, если это тупая подстановка и присвоение какого-то значения переменной, как в том же МС досе было сделано для батников, это одно, а если нужно что-то подсчитывать, условия и циклы - тут вряд ли без скобочек обойтись))) Изменено 10 августа пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 69 10 августа Опубликовано 10 августа · Жалоба 3 hours ago, makc said: Спасибо, посмотрел но для моего случая это плохо подходит, т.к. синтаксис C мало кому привычен из техников. С админами проще, но тоже будут вопросы, поэтому я и ищу что-то типа TCL. у этого C4 ноги вероятно отсюда растут: http://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c этот гораздо примитивнее, так как задачи уметь собирать самого себя не ставилось, и доработать ему "парсер" добавив нужные команды и до понимания параметров после команды через пробел проще будет. если хочется именно tcl есть https://github.com/zserge/partcl, сам не использовал, просто под руку попался. но вот "set x 4; puts [+ [* $x 10] 2]" с пробелами, по сравнению со скобочками у C выглядит ну совсем не лучше 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 10 августа Опубликовано 10 августа · Жалоба 31 минуту назад, _pv сказал: но вот "set x 4; puts [+ [* $x 10] 2]" с пробелами, по сравнению со скобочками у C выглядит ну совсем не лучше Вот и я об этом)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 10 августа Опубликовано 10 августа · Жалоба 2 hours ago, _pv said: если хочется именно tcl есть https://github.com/zserge/partcl, сам не использовал, просто под руку попался. А вот это, IMHO, интересный кандидат. Рекомендуется прочитать статью из блога автора Serge Zaitsev: Partcl - a tiny command language Там вначале идет мини-анализ положения дел среди маленьких интерпретаторов (Lua, JavaScript, Forth, Tcl), и упоминается пара других интересных проектов: LIL (stands for Little Interpreted Language) picol - made by Antirez (the guy who created Redis and JimTcl). It’s worth reading - only 600 lines of amazingly simple code Что же касается Partcl, то вот выдержки: Spoiler Inspired by these projects, I decided to build my own Tcl interpreter over the weekend. My goals were: Extreme minimalism. It should fit on an MCU with 16K of NAND. It should be easy to extend by writing your own commands in C. All parts should be isolated and should be easy to replace/customize. Default implementation should prefer size over performance. Lexer should tell when the end of the command is met so that we could read user input byte by byte and execute command only when it’s fully read. All parts of the interpreter should be covered with tests. It took Antirez three hours to finish his Picol, it took me 3 days to finish my project. Apparently, I’m not that smart. Still, I’m very satisfied with the results - I ran my TCL interpreter on a STM32F051 microcontroller and firmware size was only 10KB! Хотя в целом мой выбор в такой постановке задачи - это Tcl, но из общего интереса я провентилировал и упоминаемый zserge LIL. Как быстро выяснилось, он отнюдь не исчез в виде исходников, а был выложен на указанный сайт позднее (статья - август 2016 года, а выкладка, похоже проходила или позднее в 2016, или даже 2019-2021). Последняя версия - 20211019. Что интересно, у LIL есть 2 варианта: С and FreePascal/Lazarus. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 10 августа Опубликовано 10 августа · Жалоба 5 минут назад, Raven сказал: А вот это, IMHO, интересный кандидат. Рекомендуется прочитать статью из блога автора Serge Zaitsev: Partcl - a tiny command language Я его уже находил, мне он тоже приглянулся. Но стало интересно, кто-то его использовал, кроме автора? 😉 6 минут назад, Raven сказал: picol - made by Antirez (the guy who created Redis and JimTcl). It’s worth reading - only 600 lines of amazingly simple code И вот этот тоже интересный кандидат, за него говорит его потомок JimTcl. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 10 августа Опубликовано 10 августа · Жалоба Не думаю, что для МК есть готовое решение, но его можно собрать из готовых. Если я правильно понял, нужен функционал: 1) console_shell, т.е. возможность в интерактивном режиме вводить команд (+история, автодополнения). Для МК есть из чего выбрать, например https://github.com/funbiscuit/embedded-cli 2) tcl_shell, т.е. запуск интерактивного TCL интерпретатора. Прямо на странице сайта TCL есть подборка его легковесных легковесных реализаций. Из подходящего для МК там есть ParTcl (github, статья). 3) исполнене tcl команд и запуск tcl_shell из console_shell. Это можно сделать так: в составе ParTcl есть интерпретатор, способный сохранять состояние между вызовами. Вот простейший пример как в embedded-cli завести две команды: tcl (вызов интерпретатора и передача ему аргументов команды) и tcl_shell (запуск интерактивного интерпритатора из примера ParTcl). Код: Спойлер #include <stdio.h> #include <stdbool.h> #include <string.h> #define TEST #include "partcl-master/tcl.c" #define EMBEDDED_CLI_IMPL #include "embedded-cli-master/lib/include/embedded_cli.h" void writeChar(EmbeddedCli *embeddedCli, char c) { printf("%c",c); } void tcl_shell_function(EmbeddedCli *cli, char *arg, void *context) { printf("___partcl shell___\n"); struct tcl *tcl = (struct tcl *)context; int buflen = 1024; char buf[buflen]; memset(buf, 0, buflen); int i = 0; while (1) { int inp = getchar(); if (inp == 0 || inp == EOF) { break; } buf[i++] = inp; tcl_each(buf, i, 1) { if (p.token == TERROR && (p.to - buf) != i) { memset(buf, 0, buflen); i = 0; break; } else if (p.token == TCMD && *(p.from) != '\0') { int r = tcl_eval(tcl, buf, strlen(buf)); if (r != FERROR) { printf("result> %.*s\n", tcl_length(tcl->result), tcl_string(tcl->result)); } else { printf("?!\n"); } memset(buf, 0, buflen); i = 0; break; } } } } void tcl_cmd_function(EmbeddedCli *cli, char *buf, void *context) { struct tcl *tcl = (struct tcl *)context; int i = strlen(buf); if (strlen) { int r = tcl_eval(tcl, buf, i + 1); if (r != FERROR) { printf("result> %.*s\n", tcl_length(tcl->result), tcl_string(tcl->result)); } else { printf("?!\n"); } } } int main() { struct tcl tcl; tcl_init(&tcl); EmbeddedCli *cli = embeddedCliNewDefault(); cli->writeChar = writeChar; embeddedCliAddBinding(cli, (CliCommandBinding){ .name = "tcl", .tokenizeArgs = false, .binding = tcl_cmd_function, .context = (void *)&tcl }); embeddedCliAddBinding(cli, (CliCommandBinding){ .name = "tcl_shell", .binding = tcl_shell_function, .context = (void *)&tcl }); printf("___embeddedCli shell___\n"); while (1) { embeddedCliProcess(cli); char ch = getchar(); embeddedCliReceiveChar(cli, ch); } return 0; } Вот что в консоле можно сделать: выполнить две TCL команды из console_shell (присваивание значений переменным), затем запустить интерактивный TCL интерпритатор и в нём выполнить суммирование переменных: Цитата ___embeddedCli shell___ > tcl set a 1 result> 1 > tcl set b 2 result> 2 > tcl_shell ___partcl shell___ puts [+ $a $b] 3 result> 3 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 10 августа Опубликовано 10 августа · Жалоба 1 hour ago, arhiv6 said: 2) tcl_shell, т.е. запуск интерактивного TCL интерпретатора. Прямо на странице сайта TCL есть подборка его легковесных легковесных реализаций. Посыпаю голову пеплом: лично я на главный сайт TCL почему-то не догадался зайти (думал, там все посвящено имплементациям для PC). Но ТС, думаю, его отсматривал. 2 hours ago, arhiv6 said: Из подходящего для МК там есть ParTcl (github, статья). ParTcl попал в поле зрения парой постов выше. И да, он вошел в short-list. 2 hours ago, arhiv6 said: 3) исполнене tcl команд и запуск tcl_shell из console_shell. Это можно сделать так: в составе ParTcl есть интерпретатор, способный сохранять состояние между вызовами. Вот простейший пример как в embedded-cli завести две команды: tcl (вызов интерпретатора и передача ему аргументов команды) и tcl_shell (запуск интерактивного интерпритатора из примера ParTcl). Код: Вот что в консоле можно сделать: выполнить две TCL команды из console_shell (присваивание значений переменным), затем запустить интерактивный TCL интерпритатор и в нём выполнить суммирование переменных: Зачем такие сложности? Чего ради? Вроде как достаточно tcl_shell. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 214 12 августа Опубликовано 12 августа · Жалоба В 10.08.2024 в 22:36, arhiv6 сказал: 1) console_shell, т.е. возможность в интерактивном режиме вводить команд (+история, автодополнения). Для МК есть из чего выбрать, например https://github.com/funbiscuit/embedded-cli 2) tcl_shell, т.е. запуск интерактивного TCL интерпретатора. Прямо на странице сайта TCL есть подборка его легковесных легковесных реализаций. Из подходящего для МК там есть ParTcl (github, статья). Мне бы хотелось получить конфигурируемое (расширяемое настройками решение) 2 в 1, чтобы не переписывать прикладной код реализации команд. Подборку тиклевских интерпретаторов я видел, но мне был интересен практический опыт их применения, реальная ресурсоёмкость и подводные камни при их использовании. Гуглить я тоже умею. В 11.08.2024 в 00:41, Raven сказал: Посыпаю голову пеплом: лично я на главный сайт TCL почему-то не догадался зайти (думал, там все посвящено имплементациям для PC). Но ТС, думаю, его отсматривал. Конечно я там был, причём большую часть упомянутого там я уже находил просто поиском через гугл. И опять же есть списочек - https://github.com/BaseMax/AwesomeInterpreter , который смотреть - не пересмотреть. 🤔 В 11.08.2024 в 00:41, Raven сказал: Зачем такие сложности? Чего ради? Вроде как достаточно tcl_shell. Именно так, достаточно было бы минималистичного шелла, который для совсем жестких ограничений по памяти и т.п. можно было бы урезать до самого минимума встроенных команд и возможностей (выключить редактирование команд, историю и т.п.). Но прежде всего интересует практический опыт внедрения подобных средств, а не теория. 😉 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться