我知道这不是什么新鲜事,已经做了好几次了。但我正在寻找一些参考实现(甚至只是参考设计)作为“最佳实践指南”。我们有一个实时嵌入式环境,其想法是能够使用“调试shell”来调用某些命令。示例:“SomeDevice print reg xyz”将请求SomeDevice子系统打印名为xyz的寄存器的值。
答案 0 :(得分:3)
我有一小组例程,基本上由3个函数和一个查找表组成:
一个函数,它在解析的命令行上获取第一个arg并在命令表中查找它。函数指针确定为命令调用哪个函数,因此命令处理程序只需匹配原型:
int command_handler( int argc, char* argv[]);
然后使用适当的argc / argv参数调用该函数。
实际上,查找表还有指向每个命令的基本帮助文本的指针,如果命令后跟' - ?'要么 '/?'显示一些帮助文本。此外,如果命令使用'help',则转储命令表(如果将参数传递给'help'命令,则只可能是子集)。
很抱歉,我无法发布实际的来源 - 但它非常简单直接实现,功能足以满足我对嵌入式系统开发的所有命令行处理需求。
答案 1 :(得分:2)
你可能会对这种反应感到愤怒,但很多年前我们为使用lex / yacc的大规模嵌入式电信系统做了类似的事情(现在我想它将是flex / bison,这实际上是20年前)。
定义你的语法,定义参数范围等......然后让lex / yacc生成代码。
有一点学习曲线,而不是滚动一次性自定义实现,但是你可以扩展语法,添加新命令&参数,变化范围等......非常快。
答案 2 :(得分:1)
您可以查看libcli。它模仿思科的CLI,显然还包括一个telnet服务器。这可能比你正在寻找的更多,但它可能仍然有用作参考。
答案 3 :(得分:1)
如果您的需求非常基本,那么接受简单击键而不是命令shell的调试菜单就是这样做的一种方式。
对于寄存器和RAM,你可以有一个子菜单,只需按需进行内存转储。
同样,要启用或禁用单个功能,您可以通过主菜单或子菜单中的击键来控制它们。
实现此目的的一种方法是通过简单的状态机。每个屏幕都有一个等待按键的相应状态,然后根据需要更改状态和/或更新屏幕。
答案 4 :(得分:1)
vxWorks包含一个命令shell,它嵌入符号表并实现C表达式求值程序,以便您可以在运行时调用函数,求值表达式和访问全局符号。表达式计算器支持整数和字符串常量。
当我处理从vxWorks迁移到embOS的项目时,我实现了相同的功能。嵌入符号表需要一些体操,因为它在链接之后才存在。我使用后构建步骤来解析GNU nm工具的输出,以创建符号表作为单独的加载模块。在早期版本中,我根本没有嵌入符号表,而是创建了一个在符号表所在的开发主机上运行的主机shell程序,并与目标上的调试存根进行通信,该调试存根可以对任意执行函数调用。地址和读/写任意内存。此方法更适合于内存受限设备,但您必须注意,您使用的符号表和目标上的代码是针对相同的构建。这也是我从vxWorks借来的一个想法,它支持具有相同功能的目标和基于主机的shell。对于主机shell vxWorks校验和代码以确保符号表匹配;在我的情况下,这是一个手动(并且容易出错)的过程,这就是我实现嵌入式符号表的原因。
虽然最初我只实现了内存读/写和函数调用功能,但后来我根据描述here的算法(但不是代码)添加了表达式赋值器。然后,我以if-else,while和过程调用构造的形式添加了简单的脚本功能(使用非常简单的非C语法)。因此,如果您想要新的功能或测试,您可以编写新的函数,也可以创建脚本(如果性能不是问题),所以函数就像脚本语言的“内置函数”。
为了执行任意函数调用,我使用了一个函数指针typedef,它接受了任意大(24)个参数,然后使用符号表,找到函数地址,将其转换为函数指针类型,并传递它是真正的参数,加上足够的伪参数来构成预期的数字,从而创建一个合适的(如果浪费的)维护堆栈框架。
在其他系统上,我已经实现了一个Forth线程解释器,这是一种非常简单的实现语言,但可能没有用户友好的语法。您可以同样嵌入现有的解决方案,例如Lua或Ch。
答案 5 :(得分:0)
一种替代方案是使用非常简单的二进制协议来传输您需要的数据,然后使用例如PC在PC上创建用户界面。 Python或其他任何你最喜欢的开发工具。
优点是它可以最小化嵌入式设备中的代码,并尽可能多地将其转移到PC端。这很好,因为:
如果要查看变量 - 如果您的PC工具能够读取链接器生成的ELF文件,那么它可以从符号表中找到变量的位置。更好的是,读取DWARF调试数据并知道变量的类型。然后,您只需要在嵌入式设备上获取“读取内存”协议消息即可获取数据,然后PC就会进行解码和显示。
答案 6 :(得分:0)
对于一个小的轻量级的东西,你可以使用。很容易上手(第四个内核很小) 看看figForth,LINa和GnuForth。
免责声明:我不是Forth,但是openboot和PCI总线一样,而且我已经使用过它们并且它们工作得非常好。
替代用户界面
在您的嵌入式设备上部署Web服务器。甚至连串也适用于SLIP,UI可能相当复杂(甚至可以提供JAR并且真的非常复杂。
如果你真的需要一个CLI,那么你可以指向一个链接并获得一个telnet。