📄 genie-shell4ucosii.txt
字号:
Genie shell for UCOS II 详细说明及使用指南
作者:杨晔 yangye@163.net
2003-2-19 ver0.1
Genie shell目前是一个UART 串口shell,也就是只能通过UART远程登录的方式使用。
1。Genie shell与硬件相关的部份有两个函数:
CommRxIntEn(UART0); 初始化串口硬件
CommGetChar(RS485,0,&err); 从串口接收一个字符,这个串口最好是中断方式的,否则用轮询方式Genie shell就会占用全部cpu。
以上两个函数由用户根据自己的串口去实现。
2。Genie shell本身分为两大部份:shell task部份和Command命令部份
2.1 shell task部份:
void shelltask(void);
应该由用户在ucosII中用OSTaskCreate建立的task。首先做以下初始化工作:
CommRxIntEn(UART0); //初始化串口
InitCommands(); //初始化命令对象数组
CommandBuf[0] = '\0';
然后进入无限循环(for(;;))中,用CommGetChar函数接收输入字符。对不同的输入字符分别做不同的处理:
退格键: 光标回退,删除显示的字符,光标再回退
回车键: 命令输入结束,调用CommandAnalys函数分析命令格式和参数, CommandAnalys会返回命令号,然后根据命令号从ShellComms 对象数组中找到相应的命令对象,然后执行这个命令对象的 方法(也就是命令函数),命令参数也会传递过去。
普通合法字符:先显示(printf),再放入CommandBuf中等待分析
非法字符: 不接收输入。
此外还做了一些简化,如不接收连续两个空格,不接收行首的空格。嵌入式系统嘛,简单一些。
INT8U CommandAnalys(char *Buf);
对用户输入的字符串做分析,根据字符串的内容,分析出命令名称,命令参数。
2.2 Command命令部份
Genie Shell 把每个命令看成一个对象,在c语言中实际是一个带函数指针的结构体:
typedef struct{
int num; //命令号
char *name; //命令名称(目前的设定是小于20个字符)
INT8U (*CommandFunc)(INT8U argc,char **argv); //命令函数
}command;
每条命令对应一个command对象,所有的命令对象都存放在command数组ShellComms[MAX_COMMAND_NUM]中。MAX_COMMAND_NUM是总的命令个数,用户应该根据自己shell的命令个数设置,注意MAX_COMMAND_NUM应该正好等于总的命令个数,不能多也不能少。
用户增加自己的命令时,首先把在commands.h中把MAX_COMMAND_NUM加1;然后在commands.c中InitCommands()函数里增加如下语句:
ShellComms[i].num = 0;
ShellComms[i].name = "hello";
ShellComms[i].CommandFunc = HelloFunc;
其中的i和具体值由用户根据情况决定。最后实现一个名字和ShellComms[i].CommandFunc相同的命令函数就可以了。请参照commands.c中已经有的两个例子。
3. 目前的例子
目前的genie shell带有两条命令,hostname命令在屏幕上打印一句话。hello 命令可以带多个参数,如hello a b c d,回车后会显示:
hello,I am Genie
your argv is:
a
b
c
d
4。对回车键和退格键的补充
我在ez80单片机上运行genie shell并用超级终端连接时,回车键和退格键的值分别是‘13’和‘8’,但在skyeye下运行时,用这两个值又不行了,必须使用‘10’和‘127’来代表回车和退格,这点请注意。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -