vxWorks включает командную оболочку, которая встраивает таблицу символов и реализует оценщик выражений C, так что вы можете вызывать функции, оценивать выражения и получать доступ к глобальным символам во время выполнения. Оценщик выражений поддерживает целочисленные и строковые константы.
Когда я работал над проектом, который перешел с vxWorks на embOS, я реализовал ту же функциональность. Для встраивания таблицы символов требуется немного гимнастики, так как она существует только после связывания. Я использовал шаг после сборки, чтобы проанализировать выходные данные инструмента GNU nm для создания таблицы символов в качестве отдельного модуля загрузки. В более ранней версии я вообще не встраивал таблицу символов, а скорее создал программу оболочки хоста, которая работала на хосте разработки, где находилась таблица символов, и связывалась с отладочной заглушкой на цели, которая могла выполнять вызовы функций для произвольных адреса и чтение / запись произвольной памяти. Этот подход лучше подходит для устройств с ограниченным объемом памяти, но вы должны быть осторожны, чтобы таблица символов, которую вы используете, и код цели были для одной и той же сборки. Опять же, эту идею я позаимствовал у vxWorks, которая поддерживает как целевую, так и основанную на хосте оболочку с одинаковыми функциями. Для оболочки хоста vxWorks проверяет контрольные суммы кода, чтобы убедиться, что таблица символов совпадает; в моем случае это был ручной (и подверженный ошибкам) процесс, поэтому я реализовал встроенную таблицу символов.
Хотя изначально я реализовал только чтение / запись в память и возможность вызова функций, позже я добавил оценщик выражений на основе алгоритма (но не кода), описанного здесь . Затем после этого я добавил простые возможности сценариев в виде конструкций if-else, while и while (используя очень простой синтаксис не-C). Поэтому, если вы хотите получить новую функциональность или выполнить тестирование, вы можете либо написать новую функцию, либо создать скрипт (если производительность не была проблемой), поэтому функции были скорее похожи на «встроенные модули» для языка сценариев.
Чтобы выполнить произвольные вызовы функций, я использовал указатель функции typedef, который принял произвольно большое (24) число аргументов, затем, используя таблицу символов, вы нашли адрес функции, привели его к типу указателя функции и передали это реальные аргументы, плюс достаточно фиктивных аргументов, чтобы составить ожидаемое число и, таким образом, создать подходящий (если расточительный) фрейм стека поддержки.
В других системах я реализовал потоковый интерпретатор Forth, который очень прост в реализации, но, возможно, имеет менее удобный для пользователя синтаксис. Вы также можете встраивать существующие решения, такие как Lua или Ch.