⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 自由风os梦工厂--genie shell for ucos ii 详细说明及使用指南.htm

📁 网上下载的一些心得集 网友交流之经验谈 uCOS51移植心得 uCOS-II 在 ARM7 上的移植
💻 HTM
📖 第 1 页 / 共 2 页
字号:
                        <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,&amp;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 &copy; 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 + -