一个简单的shell的软件设计方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个简单的shell的软件设计方法

一个简单的shell的软件设计方法 姓名:黄崇 学号:1座机电话号码 摘 要 shell是操作系统提供给用户操作的必备窗口,用户通过这个窗口调用操作系统提供的服务。本文并不是在操作系统上实现一个简单的shell,而是在单片机上用C语言编写一个shell实现的框架,以阐述shell的工作原理。 关键词:shell软件功能需求分析 1、本文的开发环境 本文希望在单片机上运行这个shell程序,单片机可以是STM32、AVR等等,本文的测试是在S3C2440开发板上完成的。用户输入通常选用PC机的键盘,由于硬件运行平台是单片机,就选用串口进行交互数据的传输。软件开发环境选用linux系统下的arm-linux-gcc交叉编译工具链,该工具链功能强大,可配置性较集成开发环境尤其独到之处。 2、本文shell的基本功能要求 本文目的在于实现一个简单的shell,功能不要求很多,但是要求完全描绘出一个shell的工作原理和shell软件结构。有了这样的软件结构,再向shell里添加其他的功能,就好像做填空题一样。 简单的shell功能可支持的命令虽然很少,但是也要确定选择哪些命令比较合适。实现这样简单的命令最好不需要增添其他的外设,比如说硬盘、网卡,利用最小的单片机系统就能搞定。这样可以节省工作量,将主要精力集中到shell软件结构上,而不是具体命令的实现上。基于这样的考虑,本文选择echo(回显)、md(内存显示)和hello(打印“hello world”)三个命令作为测试。另外,还必须提供shell必备的命令help或者?(打印所有命令的帮助信息)。而且对于每一个命令,通过“help+命令”的输入打印单个命令的详细信息。 三、shell软件设计方案 在shell运行期间,无非涉及两个模块。一个模块是等待用户输入,并把用户输入的字符保存起来。另外一个模块,就是把之前保存的用户输入解析出来,并且根据解析到的命令找到对应的函数地址。再根据用户输入命令的参数,将参数传给这个函数地址,进行函数调用。 shell的核心是如何根据命令字符串,找到对应的函数地址,这是一个算法问题。因为命令字符串相对应着一个函数地址,需要将它们用一个数据结构包含在一起,所以也是一个数据结构的问题。 有什么样的数据结构,就有什么样的算法,设计数据结构成了关键。一个命令的结构体应该包含这样的内容:命令的名字、命令参数的最大个数、命令对应函数的地址、命令的简要帮助信息、命令的详细帮助信息。 有了命令数据结构,在设计一个命令的时候,就将这些命令的必要信息提供好,然后将这些信息填充到它对应的结构体变量中。最后,再将所有命名对应的结构体变量保存在一个数据段中。通过编译器产生的参数,我们可以掌握这个数据段的起始地址和结束地址,从而知道命令数据段的长度,进而知道命令的个数。只要我们知道这个数据段的起始地址,因为命令结构体的长度固定,我们就可以准确的遍历整个命令数据段,找到匹配的命令。 如果设计好这样的命令数据结构,再来思考如何实现根据命令字符串找到对应的函数地址,其实就是一个遍历命令数据段的问题。从命令数据段的开头,拿所要找的命令子妇产依次与命令数据段中的每个命令结构体进行比较,直到找到匹配的那个为止。找到了匹配的命令结构体,也就找到了命令字符串对应的调用函数地址。 shell软件实现 1、命令结构体 根据上一章节的分析,命令结构体的实现代码如下: struct cmd_tbl_s char *name; /* Command Name */ int maxargs; /* maximum number of arguments */ /* Implementation function */ int *cmd struct cmd_tbl_s *, int, int, char *[] ; char *usage; /* Usage message short */ char *help; /* Help message long */ ; 其中,核心成员是命令对应的函数指针cmd,cmd的参数有4个。第一个参数是当前函数指针对应的命令结构体的地址,传递这样的参数的好处是命令函数可以根据这个指针找到命令所有的信息,为程序拓展带来了方便。最后一个参数是一个字符型指针,保存了输入参数的存放地址,以供函数调用。 2、读取输入函数 读取输入函数名为readline,这个函数就是将用户的输入按照一定的格式存储到一个缓冲区console_buffer中,并且将用户的输入在返回到显示界面中。当用户输入Enter键的时候,这个函数就认为用户输入结束。 查找并执行命令的函数 此函数的函数名为run_cmmand,它通过调用查找命令函数find_cmd

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档