Contiki开发6:shell系统

来源:互联网 发布:优酷网络电视客户端 编辑:程序博客网 时间:2024/06/01 08:27

Contiki开发6:shell系统

1 引言

熟悉Linux的用户会对它的shell系统印象深刻:命令丰富,效率高,特别适合程序员做调试。其实,在Contiki系统中,也可以很轻松地设计一个shell系统。

2 串口输入

 

如上面的时序图,UART接收采用中断方式,每接收一个字符ISR检查是不是“回车符”,如果不是直接存储,如果是“回车符”则替换成‘\0’(符合C语言字符串习惯)并发消息给Monitor进程,让其处理该命令。

命令的格式如下图所示,第一个字节存储了命令的长度,后继为命令的字符串。

 

另一方面,需要考虑当Monitor进程正在处理命令字符串时,UART端口又有数据需要接收,为此需要设计缓冲区的数据结构。如下图所示,命令缓冲区组织成环状结构,Head指向ISR当前正处理的命令行,Tail指向需要Monitor进程处理的命令行。

  

3 命令解析

设计一个优秀的数据结构将会使shell系统更容易实现。如下所示,PCCmd是一个结构体数组,结构体包括2部分:指向字符串的指针和函数指针。


这个数据结构至少有2个优点:

良好的扩展性:如果shell需要扩展一条命令,只需要为该命令编写一个执行函数,然后将该函数的指针和命令的字符串“挂接”在PC Cmd数组中。

更好地解析命令:如果用户输入一个命令,算法简单地遍历PC Cmd数据中的字符串指针,如果匹配,执行对应的函数;如果不匹配,返回该命令非法。

一起看看解析命令的实现吧:

/*---------------------------------------------------------------------------------------------*/

static void ProcPCCmd(void)

{

  #defineUNKNOWN_PROMPT    ("Unknown command,? for help.\r\n")

  INT8S    chCnt;

  /*Match the command string one by one */

  for(chCnt = 0; chCnt < SIZE_OF_ARRAY(s_astPCCmd); ++chCnt)     1

  {

if ( 0 ==strcmp( s_astPCCmd[chCnt].p_chCmdStr,

(char *)s_abyPCCmdBuf ) )                                                                     2

{

      (*s_astPCCmd[chCnt].pfnProcCmd)();                                              3

     return;    /* Finished job */                                                                   4

    }/*if*/

  }/*for*/

  dp_Tx(UNKNOWN_PROMPT,strlen(UNKNOWN_PROMPT));            5

  return;

}

Line#1:遍历搜索结构体数据s_astPCCmd;

Line#2:判断用户输入字符串 是否与 当前命令字符串 相等;

Line#3:如果字符串匹配,调用该命令的函数;

Line#4:执行命令完毕,退出搜索算法;

Line#5:搜索失败,打印该命令非法。


0 0
原创粉丝点击