Contiki开发6:shell系统
2016-07-18 22:51
274 查看
Contiki开发6:shell系统
![](https://img-blog.csdn.net/20160718224229500)
如上面的时序图,UART接收采用中断方式,每接收一个字符ISR检查是不是“回车符”,如果不是直接存储,如果是“回车符”则替换成‘\0’(符合C语言字符串习惯)并发消息给Monitor进程,让其处理该命令。
命令的格式如下图所示,第一个字节存储了命令的长度,后继为命令的字符串。
![](https://img-blog.csdn.net/20160718224237204)
另一方面,需要考虑当Monitor进程正在处理命令字符串时,UART端口又有数据需要接收,为此需要设计缓冲区的数据结构。如下图所示,命令缓冲区组织成环状结构,Head指向ISR当前正处理的命令行,Tail指向需要Monitor进程处理的命令行。
![](https://img-blog.csdn.net/20160718224245383)
![](https://img-blog.csdn.net/20160718224857541)
这个数据结构至少有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:搜索失败,打印该命令非法。
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:搜索失败,打印该命令非法。
相关文章推荐
- contiki udp 使用
- windows cc2530 6lowpan(contiki)报文监控
- Packetbuffer Basics (包缓冲区基础知识)
- Contiki 实例hello_world详细剖析
- 用Doxygen和Graphviz给Contiki文档添加类图和调用图
- cc2650鼓捣教程-2.一切的开始 Hello world程序!
- cc2650鼓捣教程-1.硬件选型与contiki 6lowpan环境配置
- 基于keil的contiki系统的stm32移植
- 对contiki原理的一些理解
- Contiki 配置参数“技巧”说明
- Contiki学习平台推荐
- Contiki高级程序设计
- PC机与嵌入式设备通信协议设计原则
- 怎样把LoRa终端功耗降到极致
- 无线通信设计秘密四:唤醒下发算法
- 嵌入式研发项目管理的方法论
- Contiki高级程序设计(二)
- Contiki高级程序设计(三)
- Contiki 了解(2)-HelloWorld的编译过程
- Contiki 了解(1)