HelloX應用開發(fā)概述
可以通過三種方式,在HelloX操作系統(tǒng)基礎(chǔ)上開發(fā)應用:
1. 以內(nèi)部命令方式實現(xiàn)應用,直接編譯鏈接到HelloX的內(nèi)核shell中。這時候應用代碼的執(zhí)行上下文,是shell線程的上下文。應用程序代碼不會單獨成為一個獨立的線程;
2. 以外部命令方式實現(xiàn)應用。直接編譯鏈接到HelloX的內(nèi)核中,通過shell來啟動應用。這時候的應用,內(nèi)核會創(chuàng)建一個獨立的線程來承載;
3. 以外部應用方式實現(xiàn)應用。應用代碼單獨編譯鏈接,完成后存放在安裝了HelloX操作系統(tǒng)的計算機存儲設(shè)備中。在shell下,使用loadapp命令,加載可執(zhí)行的應用模塊。這種方式下,應用代碼也是在一個獨立的線程中執(zhí)行的。需要注意的是,在這種方式下,應用代碼只能調(diào)用HelloX SDK提供的API接口函數(shù)和C庫函數(shù)。
本文主要對第一種和第二種實現(xiàn)方式進行說明。
以內(nèi)部命令方式實現(xiàn)應用
內(nèi)部命令采用映射表的方式,使系統(tǒng)功能的添加和刪除變得比較容易。比如要添加一個功能,只需要寫一個處理函數(shù),然后在HelloX的內(nèi)部命令射表內(nèi)添加一個項目即可。下面我們通過一個示例來說明如何往系統(tǒng)中添加新的功能。
第一步:假設(shè)新增的功能命令為mycommand,首先編寫一個功能函數(shù),可以直接在SHELL.CPP文件中添加,也可以通過另外的模塊實現(xiàn),然后在SHELL.CPP中,包含實現(xiàn)的命令函數(shù)的頭文件。假設(shè)mycommand命令的實現(xiàn)函數(shù)如下。
VOID mycommand(LPSTR)
{
ChangeLine();
PrintLine("Hello,World!");
ChangeLine();
}
該函數(shù)的功能十分簡單,打印出“Hello,World!”字符串,這也是大多數(shù)編程語音的一個入門示例。
第二步:把該命令字符串和命令函數(shù)添加到內(nèi)部命令列表中,并更改CMD_OBJ_NUM宏為原來的值加一,因為新增加了一個內(nèi)部命令。代碼如下(黑體部分是修改內(nèi)容):
//#define CMD_OBJ_NUM 21
#defineCMD_OBJ_NUM 22
__CMD_OBJ CmdObj[CMD_OBJ_NUM] = {
{"version" , VerHandler},
{"memory" , MemHandler},
{"sysinfo" , SysInfoHandler},
{"sysname" , SysNameHandler},
{"help" , HlpHandler},
{"cpuinfo" , CpuHandler},
{"support" , SptHandler},
{"runtime" , RunTimeHandler},
{"test" , TestHandler},
{"untest" , UnTestHandler},
{"memview" , MemViewHandler},
{"ktview" , KtViewHandler},
{"ioctrl" , IoCtrlApp},
{"sysdiag" , SysDiagApp},
{"loadapp" , LoadappHandler},
{"gui" , GUIHandler},
{"reboot" , Reboot},
{"poff" , Poweroff},
{"cls" , ClsHandler},
{“mycommand”, mycommand}
};
第三步:重新編譯連接(rebuild)整個操作系統(tǒng)核心,并重新制作引導盤引導系統(tǒng)。成功啟動后,在命令行提示符下,輸入mycommand并回車,就可以看到mycommand的輸出了。
需要注意的是,內(nèi)部命令是直接在shell線程上下文中被調(diào)用的,沒有自己獨立的執(zhí)行環(huán)境。因此只適合于實現(xiàn)較為簡單的功能。
以外部命令方式實現(xiàn)應用
外部命令則會有獨立的執(zhí)行上下文,被內(nèi)核以獨立線程方式加載運行。因此,外部命令的功能非常強大,可以進一步以子命令的方式,實現(xiàn)更進一步的功能。比如,HelloX的網(wǎng)絡診斷功能,就是以外部命令方式實現(xiàn)的。用戶在shell界面下,輸入network后回車,即可進入network診斷命令。這時候系統(tǒng)提示符會改變。在network命令下,輸入help命令,可以看到該命令模式下所有可用的子命令,如下圖:
其中iflist,ping等就是network應用下的子命令。在執(zhí)行子命令的時候,用戶可以指定參數(shù),HelloX會以一種統(tǒng)一的方式,把用戶指定的參數(shù),傳遞給命令處理函數(shù)。
下面以network診斷外部命令的實現(xiàn)為例,說明外部命令的實現(xiàn)方式。
第一步:編寫外部命令的入口處理函數(shù)。
以network命令為例,要編寫類似下列形式的處理函數(shù):
DWORD networkEntry(LPVOID p)
{
return Shell_Msg_Loop(NETWORK_PROMPT_STR,CommandParser,QueryCmdName);
}
具體的處理函數(shù)的實現(xiàn),就是開發(fā)者大顯神通的地方。比如要實現(xiàn)子命令,則需要定義一些子命令映射列表等信息。在上面的實現(xiàn)中,是一個消息處理循環(huán),根據(jù)用戶的輸入,來調(diào)用特定的子命令。