Есть ли хорошие эталонные реализации, доступные для реализаций командной строки для встроенных систем? - PullRequest
5 голосов
/ 16 декабря 2009

Я знаю, что в этом нет ничего нового, и это было сделано несколько раз. Но я ищу некоторую эталонную реализацию (или даже просто эталонный дизайн) в качестве «руководства по передовому опыту». У нас есть встроенная среда реального времени, и идея заключается в том, чтобы иметь возможность использовать «оболочку отладки» для вызова некоторых команд. Пример: «SomeDevice print reg xyz» запросит подсистему SomeDevice напечатать значение регистра с именем xyz.

Ответы [ 7 ]

3 голосов
/ 18 декабря 2009

У меня есть небольшой набор подпрограмм, который по существу состоит из 3 функций и таблицы поиска:

  • функция, которая собирает командную строку - все просто; Там нет истории командной строки или чего-то еще, только возможность вернуться назад или нажать клавишу escape, чтобы отменить все это. Но если бы я подумал, что нужны более сложные возможности редактирования, добавить их сюда будет несложно.
  • функция, которая анализирует строку текста в стиле argc / argv (см. Анализ строки в argv / argc для некоторых идей по этому вопросу)
  • функция, которая берет первый аргумент в разобранной командной строке и ищет его в таблице команд и указателей на функции, чтобы определить, какую функцию вызывать для команды, поэтому обработчики команд просто должны соответствовать прототипу :

    int command_handler( int argc, char* argv[]);

Затем эта функция вызывается с соответствующими параметрами argc / argv.

На самом деле, таблица поиска также имеет указатели на основной текст справки для каждой команды, и, если за командой следует '-?' или же '/?' этот бит текста справки отображается. Кроме того, если для команды используется 'help', таблица команд сбрасывается (возможно только подмножество, если параметр передан команде 'help').

Извините, я не могу опубликовать фактический источник - но он довольно прост и понятен в реализации и достаточно функционален для удовлетворения почти всех потребностей обработки командной строки, которые у меня были для разработки встраиваемых систем.

2 голосов
/ 19 августа 2010

Вы можете быть недовольны этим ответом, но много лет назад мы сделали что-то подобное для крупномасштабной встроенной телекоммуникационной системы, использующей lex / yacc (в настоящее время я предполагаю, что это будет flex / bison, это было буквально 20 лет назад).

Определите вашу грамматику, задайте диапазоны для параметров и т. Д., А затем позвольте lex / yacc сгенерировать код.

Существует некоторая кривая обучения, в отличие от развертывания одноразовой пользовательской реализации, но затем вы можете расширять грамматику, добавлять новые команды и параметры, изменять диапазоны и т. Д. Чрезвычайно быстро.

1 голос
/ 16 декабря 2009

vxWorks включает командную оболочку, которая встраивает таблицу символов и реализует оценщик выражений C, так что вы можете вызывать функции, оценивать выражения и получать доступ к глобальным символам во время выполнения. Оценщик выражений поддерживает целочисленные и строковые константы.

Когда я работал над проектом, который перешел с vxWorks на embOS, я реализовал ту же функциональность. Для встраивания таблицы символов требуется немного гимнастики, так как она существует только после связывания. Я использовал шаг после сборки, чтобы проанализировать выходные данные инструмента GNU nm для создания таблицы символов в качестве отдельного модуля загрузки. В более ранней версии я вообще не встраивал таблицу символов, а скорее создал программу оболочки хоста, которая работала на хосте разработки, где находилась таблица символов, и связывалась с отладочной заглушкой на цели, которая могла выполнять вызовы функций для произвольных адреса и чтение / запись произвольной памяти. Этот подход лучше подходит для устройств с ограниченным объемом памяти, но вы должны быть осторожны, чтобы таблица символов, которую вы используете, и код цели были для одной и той же сборки. Опять же, эту идею я позаимствовал у vxWorks, которая поддерживает как целевую, так и основанную на хосте оболочку с одинаковыми функциями. Для оболочки хоста vxWorks проверяет контрольные суммы кода, чтобы убедиться, что таблица символов совпадает; в моем случае это был ручной (и подверженный ошибкам) ​​процесс, поэтому я реализовал встроенную таблицу символов.

Хотя изначально я реализовал только чтение / запись в память и возможность вызова функций, позже я добавил оценщик выражений на основе алгоритма (но не кода), описанного здесь . Затем после этого я добавил простые возможности сценариев в виде конструкций if-else, while и while (используя очень простой синтаксис не-C). Поэтому, если вы хотите получить новую функциональность или выполнить тестирование, вы можете либо написать новую функцию, либо создать скрипт (если производительность не была проблемой), поэтому функции были скорее похожи на «встроенные модули» для языка сценариев.

Чтобы выполнить произвольные вызовы функций, я использовал указатель функции typedef, который принял произвольно большое (24) число аргументов, затем, используя таблицу символов, вы нашли адрес функции, привели его к типу указателя функции и передали это реальные аргументы, плюс достаточно фиктивных аргументов, чтобы составить ожидаемое число и, таким образом, создать подходящий (если расточительный) фрейм стека поддержки.

В других системах я реализовал потоковый интерпретатор Forth, который очень прост в реализации, но, возможно, имеет менее удобный для пользователя синтаксис. Вы также можете встраивать существующие решения, такие как Lua или Ch.

1 голос
/ 16 декабря 2009

Если ваши потребности довольно просты, одним из способов сделать это может быть меню отладки, которое принимает простые нажатия клавиш, а не командную оболочку.

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

Аналогичным образом, чтобы включить или отключить отдельные функции, вы можете управлять ими с помощью клавиш из главного меню или подменю.

Одним из способов реализации этого является простой конечный автомат. Каждый экран имеет соответствующее состояние, которое ожидает нажатия клавиши, а затем меняет состояние и / или обновляет экран по мере необходимости.

1 голос
/ 16 декабря 2009

Вы можете проверить libcli . Он эмулирует интерфейс командной строки Cisco и, по-видимому, также включает в себя сервер telnet. Это может быть больше, чем вы ищете, но все же может быть полезным в качестве справки.

0 голосов
/ 17 декабря 2009

За небольшую легкую вещь, которую вы можете использовать далее. Его легко начать (четыре ядра МАЛЕНЬКИЕ) посмотрите на figForth, LINa и GnuForth.

Отказ от ответственности: я не Форт, но openboot и шина PCI делают, и я; я использовал их, и они работают очень хорошо.

Альтернативные интерфейсы

Вместо этого разверните веб-сервер на встроенном устройстве. Даже serial будет работать с SLIP, а пользовательский интерфейс может быть достаточно сложным (или даже обслуживать JAR и становиться действительно очень сложным.

Если вам действительно нужен CLI, вы можете указать ссылку и получить телнет.

0 голосов
/ 17 декабря 2009

Одной из альтернатив является использование очень простого двоичного протокола для передачи необходимых данных, а затем создание пользовательского интерфейса на ПК, например, с помощью. Python или любой другой ваш любимый инструмент разработки.

Преимущество состоит в том, что он минимизирует код во встроенном устройстве и переносит как можно большую его часть на сторону ПК. Это хорошо, потому что:

  • Он занимает меньше встроенного места для кода - большая часть кода находится на ПК.
  • Во многих случаях проще разрабатывать определенные функции на ПК с помощью более мощных инструментов и ресурсов ПК.
  • Это дает вам больше возможностей интерфейса. Вы можете использовать только интерфейс командной строки, если хотите. Или вы можете использовать графический интерфейс с графиками, регистрацией данных и другими интересными вещами, которые вам могут понадобиться.
  • Это дает вам гибкость. Встроенный код сложнее обновить, чем код ПК. Вы можете изменить и улучшить свой инструмент для ПК в любое время, не внося никаких изменений во встроенное устройство.

Если вы хотите посмотреть на переменные - если ваш компьютерный инструмент может прочитать ELF-файл, сгенерированный компоновщиком, то он может узнать местоположение переменной из таблицы символов. Более того, прочитайте данные отладки DWARF и узнайте также тип переменной. Тогда все, что вам нужно, это сообщение протокола «чтения из памяти» на встроенном устройстве, чтобы получить данные, а ПК выполняет декодирование и отображение.

...