📄 自由风os梦工厂--genie shell for ucos ii 详细说明及使用指南.htm
字号:
<P class=p4><STRONG>1 简单介绍</STRONG></P>
<P
class=p4>uCOSII只提供了操作系统内核,用户要自己添加文件处理、人机界面、网络接口等重要部分。其中Shell(人机界面)提供了人与机器交互的界面,是机器服务于人的体现,是系统必不可少的重要组成部分。现代的很多OS如UNIX、DOS、VxWorks都提供了友好的命令行界面。Windows更是提供了GUI。大部分人认识OS都是从这里开始的。<BR>由于Skyeye下的仿真串口USART已经实现了中断方式的接收(实际是从键盘接收输入),而且串口输出(实际上是输出到终端屏幕)也已经实现,所以实现一个类似DOS或Bash的简化版Shell并不困难。其本质思想就是:Shell作为一个uC/OSII下的任务,接收用户输入的字符,存储到缓冲区,并回显在屏幕上,以回车键为用户输入的结束信号,随后解析用户输入的命令名称、参数,调用相应的命令函数。一直到这个命令函数运行返回,才继续Shell的人机交互界面。Shell作为一个任务工作于内核之外,占用一个任务号。其流程图如下:</P>
<P class=p4><IMG height=369
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/shell.jpg"
width=368><BR>我们目前在uC/OSII下实现的Shell起名为Genie
Shell,非常简单,只实现了最基本的命令输入、解析参数、调用命令函数功能,以及两条示例性的命令。这个Shell的特色是采用了一些面向对象的思路来实现Shell的各种命令。</P>
<P class=p4><STRONG>2.Genie Shell实现分析</STRONG></P>
<UL>
<LI><SPAN class=p4>2.1 Genie Shell的实现基础(串口通讯函数)
</SPAN>
<P class=p4>Genie
shell与硬件相关的部份有三个函数:<BR>CommRxIntEn(UART0);
初始化串口硬件<BR>CommGetChar(UART0,0,&err);
从串口接收一个字符,这个串口最好是中断方式的,否则用轮询方式Genie
shell就会占用全部cpu。参数0表示永远等待,没有timeout的情况。<BR>printf函数
向串口打印字符,注意虽然在Skyeye中是打印在屏幕上的,但实际上是向串口发送字符,只是Skyeye的串口仿真输出就是到终端屏幕。<BR>以上三个函数由用户根据自己的单片机上的串口去实现。在Skyeye中我们已经实现了,参见ucosii\samples目录下的例子。</P>
<LI><SPAN class=p4>2.2 shell task部份:(shelltask.[ch])
</SPAN>
<P class=p4>A.void shelltask(void)
这是应该由用户在ucosII中用OSTaskCreate建立的任务(task)。首先做以下初始化工作:<BR>CommRxIntEn(UART0);
//初始化串口<BR>InitCommands();
//初始化命令对象数组<BR>CommandBuf[0] =
'\0';<BR>然后进入无限循环(for(;;))中,用CommGetChar函数接收输入字符。对不同的输入字符分别做不同的处理:</P></LI></UL>
<TABLE cellSpacing=0 cellPadding=0 width=499
align=center border=0>
<TBODY>
<TR class=p4>
<TD class=p4 width=90>退格键</TD>
<TD class=p4 width=409>光标回退,删除显示的字符,光标再回退</TD></TR>
<TR class=p4>
<TD class=p4>回车键</TD>
<TD
class=p4>命令输入结束,调用CommandAnalys函数分析命令格式和参数,CommandAnalys会返回命令号,然后根据命令号从ShellComms对象数组中找到相应的命令对象,然后执行这个命令对象的方法(也就是命令函数),命令参数也会传递过去</TD></TR>
<TR class=p4>
<TD class=p4>普通合法字符</TD>
<TD class=p4>先显示(printf),再放入CommandBuf中等待分析</TD></TR>
<TR class=p4>
<TD class=p4>非法字符</TD>
<TD class=p4>不接收输入</TD></TR></TBODY></TABLE>
<BLOCKQUOTE>
<P
class=p4>此外还做了一些简化,如不接收连续两个空格,不接收行首的空格。嵌入式系统嘛,简单一些。<BR>B.INT8U
CommandAnalys(char
*Buf);<BR>对用户输入的字符串做分析,根据字符串的内容,分析出命令名称,命令参数。分析过程本文不详细描述了。</P></BLOCKQUOTE>
<UL>
<LI class=p4>2.3 Command命令部份(command.[ch]) </LI></UL>
<BLOCKQUOTE>
<P class=p4>Genie Shell
把每个命令看成一个对象,对象的属性是命令名,而对象的方法就是命令的执行函数本身。用户输入命令及参数后,将参数传递给对象的方法并执行。在shell中增加一条命令,就是增加一个对象,并实现这个对象的方法。在c语言中实际是一个带函数指针的结构体:<BR>typedef
struct{<BR>int num; //命令序号<BR>char *name;
//命令名称(目前的设定是小于20个字符)<BR>INT8U (*CommandFunc)(INT8U
argc,char **argv); //命令函数<BR>}command;
<BR>每条命令对应一个command对象,所有的命令对象都存放在command数组ShellComms[MAX_COMMAND_NUM]中。MAX_COMMAND_NUM是总的命令个数,用户应该根据自己shell的命令个数设置,注意MAX_COMMAND_NUM应该正好等于总的命令个数,不能多也不能少。<BR>用户增加自己的命令时,首先把在commands.h中把MAX_COMMAND_NUM加1;然后在commands.c中InitCommands()函数里增加如下语句:<BR>ShellComms[i].num
= 0;<BR>ShellComms[i].name =
"hello";<BR>ShellComms[i].CommandFunc =
HelloFunc;<BR>其中的i和具体值由用户根据情况决定。最后实现命令函数,并把函数名称赋给ShellComms[i].CommandFunc就可以了。请参照commands.c中已经有的两个例子。</P></BLOCKQUOTE>
<UL>
<LI class=p4>2.4. 目前的例子
<P class=p4>目前的genie
shell带有两条命令:<BR>hostname命令在屏幕上打印一句话,很简单。<BR>hello
命令可以带多个参数,如hello a b c d,回车后会显示:</P>
<BLOCKQUOTE>
<P class=p4><EM>hello,I am Genie<BR>your argv
is:<BR>a<BR>b<BR>c<BR>d</EM></P></BLOCKQUOTE>
<P
class=p4>这个例子说明了参数的解析和传递方法,具体这里不分析了,请参考源代码。</P></LI></UL></TD></TR></TBODY></TABLE><!-- InstanceEndEditable --><BR></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD background="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/bot.gif"
height=40>
<DIV align=center><A href="http://half.nease.net/info/about.htm"><FONT
color=#666666>◇</FONT> 关于本站</A> <FONT color=#666666>◇</FONT> <A
href="http://half.nease.net/info/server.htm">网站服务</A> <FONT
color=#666666>◇ </FONT><A
href="http://half.nease.net/info/declare.htm">网站声明</A> <FONT
color=#666666>◇ </FONT><A
href="http://half.nease.net/info/help.htm">帮助信息</A> <FONT
color=#666666>◇</FONT><A
href="http://gb.go98.com:81/gbbs.cgi?user=freewind" target=_blank> 留 言
簿</A> <FONT color=#666666>◇</FONT> <A
href="mailto:freewindos@sina.com">给我写信</A> <FONT
color=#666666>◇</FONT></DIV></TD></TR>
<TR bgColor=#cccccc>
<TD bgColor=#ffffff height=100>
<DIV align=center>
<P class=p7 align=center><FONT color=#666666>★ Copyright © 2003 FreeWind
Studio All Rights Reserved ★<BR><IMG height=20
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/vline.gif"
width=1><IMG height=20
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/hline.gif"
width=102> 自由风工作室版权所有<FONT color=#ffffff> </FONT></FONT><FONT
color=#666666><IMG height=20
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/hline.gif"
width=102><IMG height=20
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/vline.gif"
width=1></FONT></P>
<P class=p7 align=center><FONT class=p2 color=#666666><IMG
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/count.png"
align=absMiddle></FONT></P></DIV></TD></TR></TBODY></TABLE>
<DIV id=Layer1
style="Z-INDEX: 1; LEFT: 221px; VISIBILITY: hidden; WIDTH: 49px; POSITION: absolute; TOP: 289px; HEIGHT: 45px"><FONT
class=p2 color=#666666>
<SCRIPT>var tc_user="guojingfen";var tc_class="2";</SCRIPT>
<SCRIPT
src="自由风OS梦工厂--Genie shell for UCOS II 详细说明及使用指南.files/stat.js"></SCRIPT>
</FONT></DIV>
<P align=center><SPAN class=p7><FONT class=p2 color=#666666></FONT></SPAN></P><!-- InstanceEnd --></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -