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:搜索失败,打印该命令非法。
- Contiki开发6:shell系统
- 【Contiki学习】01.Contiki-stm32系统下实现serial-shell功能
- Contiki开发5:Hello,Contiki
- 6、contiki系统开发-通过边界路由器PING终端设备的节点-初陷曲折
- 1、contiki系统开发-instantcontiki2.7 开发环境安装
- 4、contiki系统开发-UDP-IPV6数据传输功能测试
- Contiki开发3:调试平台与Debug系统
- Contiki 系统框架
- contiki系统学习套件
- Contiki开发4:基于DEMO移植Contiki
- Contiki开发要点
- Contiki开发要点
- 7、contiki系统开发-通过边界路由器PING终端设备的节点-学习(在OpenWrt上实现6lowpan边缘路由器)
- STM32移植contiki入门之一:系统介绍和开发环境搭建
- 5、contiki系统开发-边界路由器的功能测试-探索发现
- 8、contiki系统开发-边界路由器PING通测试-初具成果与反思
- Contiki开发8:进程协作
- Contiki开发9: 下载源代码
- the working copy"工程名" failed to commit files.
- HDU - 1281 - 棋盘游戏(二分图匹配)
- JTA Entity JPA 事务(Transaction) 会话(Conversation)
- Java 内部类的详解
- leetcode解题笔记:84. Largest Rectangle in Histogram
- Contiki开发6:shell系统
- APP开发实战100-Android的外部存储(External Storage)
- Git入门(2)-创建版本库及个人信息
- web.xml的配置文件讲解
- Android 快速实现Parcelable接口
- workerman平滑重启原理
- android 固定横屏幕竖屏
- sqlite应用demo
- 字符串的扩展