?? 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 + -