Перейти к содержанию
    

Библиотека командной строки с поддержкой скриптов

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 сказал:

Спасибо, посмотрел но для моего случая это плохо подходит, т.к. синтаксис C мало кому привычен из техников. С админами проще, но тоже будут вопросы, поэтому я и ищу что-то типа TCL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, makc сказал:

синтаксис C мало кому привычен их техников

Думаю, техникам любой синтаксис не привычен, ну кроме матерного)))))) Это ж техники, не программисты)))

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, mantech сказал:

Думаю, техникам любой синтаксис не привычен, ну кроме матерного)))))) Это ж техники, не программисты)))

Команды в командной строке они умеют вводить, параметры обычно идут просто через пробел, а в С с этим посложнее будет, скобочки всякие, запятые и т.д. Так что хотелось бы обойтись без этих сложностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, makc сказал:

Команды в командной строке они умеют вводить, параметры обычно идут просто через пробел, а в С с этим посложнее будет

Так эт просто команды, типа МС-ДОС cmd консоль, но скрипты там не сделать... Ну и надо для начала понимать, какие возможности должны предоставлять эти скрипты, если это тупая подстановка и присвоение какого-то значения переменной, как в том же МС досе было сделано для батников, это одно, а если нужно что-то подсчитывать, условия и циклы - тут вряд ли без скобочек обойтись)))

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 выглядит ну совсем не лучше

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, _pv сказал:

но вот "set x 4; puts [+ [* $x 10] 2]" с пробелами, по сравнению со скобочками у C выглядит ну совсем не лучше

Вот и я об этом))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, _pv said:

если хочется именно tcl есть https://github.com/zserge/partcl, сам не использовал, просто под руку попался.

А вот это, IMHO, интересный кандидат. Рекомендуется прочитать статью из блога автора Serge Zaitsev:

Там вначале идет мини-анализ положения дел среди маленьких интерпретаторов (Lua, JavaScript, Forth, Tcl), и упоминается пара других интересных проектов:

Что же касается 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Raven сказал:

А вот это, IMHO, интересный кандидат. Рекомендуется прочитать статью из блога автора Serge Zaitsev:

Я его уже находил, мне он тоже приглянулся. Но стало интересно, кто-то его использовал, кроме автора? 😉

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не думаю, что для МК есть готовое решение, но его можно собрать из готовых. Если я правильно понял, нужен функционал:

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 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.

Именно так, достаточно было бы минималистичного шелла, который для совсем жестких ограничений по памяти и т.п. можно было бы урезать до самого минимума встроенных команд и возможностей (выключить редактирование команд, историю и т.п.).

Но прежде всего интересует практический опыт внедрения подобных средств, а не теория. 😉

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...