Shell 对于嵌入式系统的命令行实现,有什么好的参考实现吗?

Shell 对于嵌入式系统的命令行实现,有什么好的参考实现吗?,shell,command-line,embedded,Shell,Command Line,Embedded,我知道这不是什么新鲜事,已经做了好几次了。但我正在寻找一些参考实现(甚至只是参考设计)作为“最佳实践指南”。我们有一个实时嵌入式环境,其思想是能够使用“调试外壳”来调用一些命令。示例:“SomeDevice print reg xyz”将请求SomeDevice子系统打印名为xyz的寄存器的值。您可以签出。它模拟Cisco的CLI,显然还包括一个telnet服务器。这可能比您想要的要多,但作为参考可能仍然很有用。如果您的需求非常基本,那么一种可以接受简单击键的调试菜单,而不是命令shell,是实

我知道这不是什么新鲜事,已经做了好几次了。但我正在寻找一些参考实现(甚至只是参考设计)作为“最佳实践指南”。我们有一个实时嵌入式环境,其思想是能够使用“调试外壳”来调用一些命令。示例:“SomeDevice print reg xyz”将请求SomeDevice子系统打印名为xyz的寄存器的值。

您可以签出。它模拟Cisco的CLI,显然还包括一个telnet服务器。这可能比您想要的要多,但作为参考可能仍然很有用。

如果您的需求非常基本,那么一种可以接受简单击键的调试菜单,而不是命令shell,是实现这一点的方法之一

对于寄存器和RAM,您可以有一个子菜单,只需按需进行内存转储

同样,要启用或禁用单个功能,您可以通过主菜单或子菜单中的按键来控制它们


实现这一点的一种方法是通过一个简单的状态机。每个屏幕都有一个相应的状态,等待击键,然后根据需要更改状态和/或更新屏幕。

vxWorks包含一个命令外壳,它嵌入符号表并实现一个C表达式计算器,以便您可以在运行时调用函数、计算表达式和访问全局符号。表达式计算器支持整数和字符串常量

当我在一个从vxWorks迁移到embOS的项目上工作时,我实现了相同的功能。嵌入符号表需要一些技巧,因为它在链接之后才存在。我使用构建后步骤来解析GNU nm工具的输出,以创建一个符号表作为单独的加载模块。在早期版本中,我根本没有嵌入符号表,而是创建了一个主机外壳程序,该程序在符号表所在的开发主机上运行,并与目标上的调试存根通信,该存根可以执行对任意地址的函数调用和读/写任意内存。这种方法更适合于内存受限的设备,但您必须小心,您使用的符号表和目标上的代码用于相同的构建。这也是我从vxWorks借鉴的想法,vxWorks支持基于目标和基于主机的shell,具有相同的功能。对于主机外壳vxWorks,对代码进行校验,以确保符号表匹配;在我的例子中,这是一个手动(且容易出错)过程,这就是我实现嵌入式符号表的原因

虽然最初我只实现了内存读/写和函数调用功能,但后来我根据所描述的算法(而不是代码)添加了一个表达式计算器。然后,我以if-else、while和过程调用构造(使用非常简单的非C语法)的形式添加了简单的脚本功能。因此,如果您想要新的功能或测试,您可以编写一个新的功能,或者创建一个脚本(如果性能不是问题的话),因此这些功能更像是脚本语言的“内置”

为了执行任意函数调用,我使用了一个函数指针typedef,它接受任意大(24)个参数,然后使用符号表,找到函数地址,将其转换为函数指针类型,并将实际参数传递给它,再加上足够多的伪参数来组成预期的数量,从而创建一个合适的(如果浪费的话)维护堆栈框架


在其他系统上,我实现了一个Forth线程解释器,这是一种非常简单的实现语言,但其语法可能不够用户友好。您也可以嵌入现有的解决方案,如Lua或Ch。

一种替代方法是使用非常简单的二进制协议传输所需的数据,然后使用Python或您最喜欢的开发工具在PC上创建用户界面

它的优点是将嵌入式设备中的代码最小化,并将尽可能多的代码转移到PC端。这很好,因为:

  • 它使用更少的嵌入式代码空间,大部分代码都在PC上
  • 在许多情况下,使用PC上更强大的工具和资源,在PC上开发给定的功能更容易
  • 它为您提供了更多的接口选项。如果需要,可以只使用命令行界面。或者,你可以使用GUI,图形,数据记录,任何你想要的东西
  • 它给你灵活性。嵌入式代码比PC代码更难升级。您可以随时更改和改进基于PC的工具,而无需对嵌入式设备进行任何更改

如果您想查看变量,如果您的PC工具能够读取链接器生成的ELF文件,那么它可以从符号表中找到变量的位置。更好的方法是,读取DWARF调试数据并了解变量的类型。然后,您所需要的只是嵌入式设备上的一条“读取内存”协议消息,以获取数据,然后由PC进行解码和显示。

对于一个小型轻量级的东西,您可以使用forth。很容易启动(第四个内核很小) 看看菲格弗斯和格努弗斯

免责声明:我不知道,但openboot和PCI总线知道,我;我已经用过了,而且效果很好

替代用户界面

改为在嵌入式设备上部署web服务器。即使是serial也可以与SLIP一起工作,UI可能相当复杂(或者甚至提供一个JAR,变得非常复杂)


如果您真的需要CLI,那么您可以指向一个链接并获得一个telnet。

我有一小组例程,基本上由3个函数和一个查找表组成:

  • 一个收集命令行的函数——它很简单;没有命令行历史记录或任何东西,只有后退的功能