一种shell的实现方法与流程

文档序号:18163033发布日期:2019-07-13 09:25阅读:309来源:国知局
一种shell的实现方法与流程
本发明涉及嵌入式系统软件开发
技术领域
,特别涉及一种shell的实现方法。
背景技术
:shell是指“提供使用者使用界面”的软件(命令解析器),它接收用户命令,然后调用相应的应用程序以满足用户的需求。shell管理用户与系统之间的交互,可以简单的描述为:shell等待用户输入,向系统解释用户的输入,并且处理各种各样的系统输出结果。而shell命令是嵌入式开发中常用的手段,目前shell的实现方式有:1.通过链表的方式实现,该方法将shell信息填充在一个表格中,并将shell信息表通过链串起来,shell的函数查找通过遍历链表实现。2.通过编译器直接生成相应的段实现,即通过将shell函数信息表编译到固定的段,在连接脚本中找到确定该段的起始结束地址,shell信息的获取也是通过遍历整个表格。3.执行带符号表的elf文件,通过读取解析elf文件获取shell函数的信息。elf在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。以上三种实现方式均存在缺点和不足:1.通过链表的方式实现,shell使用复杂,管理链表使用内存较多,shell函数比较单一,添加一个shell命令时,需要添加数组,还需要调用安装命令,使用起来很不方便;2.通过编译器生成相应的段实现,其中典型的u-boot就是这种方式实现的,缺点是函数单一,shell信息未经排序,shell函数查找需要遍历整个表格查找过程比较慢;3.通过查找elf文件符号表的方式占用空间大,不适合嵌入式开发。技术实现要素:为克服上述
背景技术
shell实现方式中的缺陷和不足,本发明提出一种shell的实现方法,其功能是通过如下技术方案实现的。一种shell的实现方法,包含以下步骤:步骤a1,通过宏指定需要添加的shell信息的类型;步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;步骤a4,调用执行相应的shell信息。进一步的,所述步骤a1中,shell信息分为常规shell命令,拓展shell和全局函数调用三个类型。进一步的,所述常规shell的命令参数由命令执行者解释,具备固定的函数原型。进一步的,所述拓展shell命令可以执行任何函数,拓展shell的命令参数由shell模块进行参数解析,调用拓展shell函数时需要按照一定格式输入参数。进一步的,所述全局函数所述全局函数是程序中常规shell命令和扩展shell命令未涵盖的全部函数,调用全局函数时,参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。进一步的,在所述步骤a2中,将shell信息编译到不同的段中的具体过程为:首先设置常规shell的变量、函数、帮助信息和拓展shell的变量、函数、帮助信息,然后在链接脚本中指定保存的段。进一步的,在步骤a3和步骤a4中,还包括系统分别根据步骤a3执行结果和步骤a4的执行结果,判定是否进行出错处理。本发明的有益效果是:1.查找速度快:该方法所添加的shell信息是有序的,所以查找可以通过二分法或其他方法快速定位。2.占用空间少:该方法生成的shell信息都在只读数据段中,所以不会像链表一样浪费内存,达到减少内存占用的效果。3.丰富shell的多样性:使用该方法实现的shell,不仅可以实现shell函数的调用,还可以实现shell变量显示及赋值,以及任意类型函数的调用,还可以根据平台丰富程度分级添加shell信息。4.便利性:添加shell函数只需在相应的函数前加上相应的宏即可,如果是添加所有的全局函数和变量,只需指定添加等级即可,大大方便了shell的使用。附图说明图1是本发明的shell实现方法的方法流程图。图2是本发明的shell命令编译到不同段的实施例。图3是本发明的shell信息表格式的实施例。图4是本发明的bin文件组成结构图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。如图1至图4所示,一种shell的实现方法,包含以下步骤:步骤a1,通过宏指定需要添加的shell信息的类型;步骤a2,通过链接脚本编译步骤a1中的shell信息到相应的段,并编译生成相应的elf文件;步骤a3,解析步骤a2中的elf文件,提取并删除所述elf文件中的所有shell信息,将shell信息添加等级并排序后再重新添加到elf文件中,然后利用elf文件生成相应的bin文件;步骤a4,调用执行相应的shell信息。本发明通过对elf文件的二次加工,添加shell信息,同时实现任意函数的调用,以及对shell信息排序,快速查找。为了方便进行对shell信息的裁剪,在所述步骤a1中,shell信息分为常规shell,拓展shell和全局函数调用三个类型。在具体实施例中,所述常规shell的命令参数由命令执行者解释,具备固定的函数原型。在调用常规shell命令时,其命令的参数由命令执行者解释,常规shell命令的函数原型固定为:bool_tcmdname(char*param)。在具体实施例中,所述拓展shell命令可以执行任何函数,拓展shell的命令参数由shell模块进行参数解析,调用拓展shell函数时需要按照一定格式输入参数。因为拓展shell命令虽然由shell模块进行参数解析,但是在程序中并没有保存参数类型,所以调用shell函数时需要按照一定格式输入参数。参数格式为:命令名参数1类型参数参数2类型参数2参数3类型参数3……其中参数类型请参考下表,u8无符号8位二进制数表示的数据类型u16无符号16位二进制数表示的数据类型u32无符号32位二进制数表示的数据类型u64无符号64位二进制数表示的数据类型s8有符号8位二进制数表示的数据类型s16有符号16位二进制数表示的数据类型s32有符号32位二进制数表示的数据类型s64有符号64位二进制数表示的数据类型b布尔型参数bool_tf单精度浮点型floatd双精度浮点型double参数设置默认为十进制表示,同时也支持其他c语言支持的数据表示形式,如十进制16可以表示为十六进制的0x10。命令与参数、参数类型与参数之间,须用空格隔开。console控制台在收到字符串时,首先会分离出命令,然后按规则解析出参数,及参数类型。而数值解析则符合c语言规范,如十进制16可以写成十六进制的0x10……其中二进制以0b或0b开头;八进制以0开头;十六进制以0x或0x开头;负数前面加-;默认为10进制。在控制台console中直接输入变量名,回车即可查看变量的值。console也可直接给变量赋值,例如:u32var=100。在控制台console输入shell命令后,会先查找in_shell_cmd段或ex_shell_cmd段,如果找到则直接调用,如果找不到,则会进一步查找data段,找到则执行变量显示或变量赋值。在具体实施例中,所述全局函数是程序中常规shell命令和扩展shell命令未涵盖的全部函数,调用全局函数时,参数由shell模块进行参数解析,shell命令行需要按照一定格式输入参数。如图2所示,在所述步骤a2中,将shell信息编译到不同的段中的具体过程为:首先设置常规shell的变量、函数、帮助信息和拓展shell的变量、函数、帮助信息,然后在链接脚本中指定保存的段。图2为常规shell和拓展shell编译到不同段的一个实施例。在具体实施例中,在步骤a3和步骤a4中,还包括系统分别根据步骤a3执行结果和步骤a4的执行结果,判定是否进行出错处理。关于bin文件的映射,由于在不同的运行模式下,符号表内容不同,放置位置也不同。而符号表内容的多少,代表了可供使用的调试命令多少。但由于data段是全局变量,一般不会很多,并且在编码时难于决定哪个变量需要查看,哪个不需要查看,因此在ide中配置时一般将其全部加入或者全部不加入。以下以flash和ram的si模式和dlsp模式为例,分别叙述。在flash中运行的si模式:只有在极少flash的情况下,将不配置shell模块,因此符号表也就没有用处。当flash内存不足时,只需把.in_shell_cmd与.ex_shell_cmd段加入符号表。当flash内存时,可以把全部函数都加入符号表。在ram中运行si模式,对于shell实现来说,与在flash中运行是一样的。对于dlsp模式,由于其内存空间较大,不考虑没有配置shell模块的情景,直接装入全符号表。如果是在flash中运行,则os的符号表仍然在flash中,但app的符号表会在ram中;如果在ram中运行,则所有符号表都在ram中。dlsp模式下,由于os和app不是同时加载的,且多模块的app可能还存在多次加载的情况,导致符号表并不连续,此时需要使用一个链表将其连接起来。关于shell的实现过程,源码文件经过编译链接生成的elf文件包含有,函数,变量的地址,及其名字对应的字符串等信息。shell的实现需要修改根据elf文件生成新的elf文件,其修改包括添加字符串表,内部shell函数,外部shell函数,shell变量信息表。其中,对于内部shell函数参数解析逻辑在函数内部实现,对于外部函数参数解析由shell模块实现。内部shell函数原型为:typedefbool_t(*in_shell_func)(char*param);shell信息表格式如图3所示,图3中的参数说明,cmdname:指向该命令对应的名字。cmdaddr:该shell命令对应的地址,如果是函数则为函数地址,如果是变量则为变量地址,如果是帮助信息,则为帮助信息指针所在地址。cmdtype:命令对应的类型,对应以上宏定义中的几项。如图4所示的bin文件的组成结构图,其中shell_info结构体已包含shell信息表的起始结束地址,而shell信息表已将根据命令名进行排序,因此shell查找就会相当方便。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1