uShell項(xiàng)目開發(fā)_第1頁(yè)
uShell項(xiàng)目開發(fā)_第2頁(yè)
uShell項(xiàng)目開發(fā)_第3頁(yè)
uShell項(xiàng)目開發(fā)_第4頁(yè)
uShell項(xiàng)目開發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、uShell項(xiàng)目開發(fā)1目錄1緒論 .3.2需求分析 .5.2.1環(huán)境需求 . 硬件環(huán)境: .軟件環(huán)境:.功能需求.5.2.2軟件構(gòu)成 .開發(fā)條件.開發(fā)期間.開發(fā)語(yǔ)言.開發(fā)使用的技術(shù)、知識(shí) .82.2.5主要術(shù)語(yǔ)介紹. 其他 .9.3概要設(shè)計(jì) .103.1模塊概述 .1.03.1.1模塊結(jié)構(gòu)圖 .103.1.2模塊中單元的詳細(xì)描述 .1 13.2外部模塊接口表 .123.3內(nèi)部單元接口表 .133.4狀態(tài)遷移圖 .213.5人機(jī)界面實(shí)現(xiàn)方法 .223.6異常處理 .233.7執(zhí)行時(shí)間估

2、計(jì) .233.8源碼目錄文件結(jié)構(gòu) .254詳細(xì)設(shè)計(jì) .284.1主要數(shù)據(jù)結(jié)構(gòu)描述 .284.1.1格式化輸出 .284.1.2函數(shù)查找 .29uShell項(xiàng)目開發(fā)24.1.3關(guān)鍵結(jié)構(gòu)說(shuō)明.304.2參考資料.314.3單元設(shè)計(jì).314.3.1函數(shù)一覽表 .314.3.2宏定義一覽表 .345系統(tǒng)測(cè)試與分析 .365.1測(cè)試環(huán)境.365.2測(cè)試方法.365.3測(cè)試用例.365.4測(cè)試結(jié)果.385.5測(cè)試總結(jié).396成果演示 .406.1查看系統(tǒng)當(dāng)前任務(wù).4.06.2查看系統(tǒng)當(dāng)前相關(guān)系統(tǒng)資源.406.3掛起任務(wù).426.4演示總結(jié).427結(jié)論 .43致謝.錯(cuò)誤!未定義書簽。參考文獻(xiàn) .44uShe

3、ll項(xiàng)目開發(fā)31緒論TRON (The Real-time Operating system Nucleus 是由東京大學(xué)坂村健博士于1984年提出的實(shí)時(shí)嵌入式操作系統(tǒng)。規(guī)范經(jīng)過(guò)多年發(fā)展,TRON已成為日本電子產(chǎn)業(yè)現(xiàn)行的基礎(chǔ)構(gòu)架,這一系統(tǒng)已經(jīng)安裝到了全球30億到40億臺(tái)家用電子產(chǎn)品當(dāng)中,遠(yuǎn)遠(yuǎn)超過(guò) Windows的普及程度。盡管在個(gè)人電腦領(lǐng)域知名度幾乎 為零,但TRON現(xiàn)在卻占據(jù)了全球微處理器操作系統(tǒng)市場(chǎng)上大約60%的份額,成為低價(jià)高性能嵌入式系統(tǒng)的典范。但隨著嵌入式系統(tǒng)的高功能、網(wǎng)絡(luò)化,軟件 開發(fā)和調(diào)試都變得非常復(fù)雜。TRON相關(guān)軟件的可移植性、可重用性出現(xiàn)了問(wèn)題。 為了實(shí)現(xiàn)更為理想的實(shí)時(shí)操作

4、系統(tǒng)的嵌入式計(jì)算結(jié)構(gòu),出現(xiàn)了T-Engine項(xiàng)目計(jì)劃,為了更進(jìn)一步實(shí)現(xiàn)標(biāo)準(zhǔn)化,基于 TRON的T-Kernel由此而來(lái)。T-E ngine是為了在短時(shí)間內(nèi)高效開發(fā)實(shí)時(shí)嵌入式系統(tǒng)而設(shè)計(jì)的,由標(biāo)準(zhǔn)化硬 件結(jié)構(gòu)和標(biāo)準(zhǔn)開源實(shí)時(shí)操作系統(tǒng)核心(T-Kernel)組成的嵌入式標(biāo)準(zhǔn)開放平臺(tái)。 在T-Engine開發(fā)過(guò)程中,搭載的CPU為可變的,而規(guī)定了其他硬件結(jié)構(gòu)規(guī)范、 操作系統(tǒng)核心界面規(guī)范、對(duì)象數(shù)據(jù)格式規(guī)范等要素,使TRON在標(biāo)準(zhǔn)化的基礎(chǔ)結(jié)構(gòu)上,具備充分的外圍資源及開發(fā)環(huán)境。 這個(gè)開放式標(biāo)準(zhǔn)平臺(tái)結(jié)構(gòu)的最大目標(biāo) 是將CPU從基礎(chǔ)結(jié)構(gòu)中獨(dú)立出來(lái),使在T-Kernel上開發(fā)的中間件可不依存于 CPU 結(jié)構(gòu)而移植。

5、T-Kernel是運(yùn)行于標(biāo)準(zhǔn)T-Engine/片Engine硬件平臺(tái)上的標(biāo)準(zhǔn)實(shí)時(shí)操作系統(tǒng) 核心軟件。與其他開源軟件所不同的是,它是單一源代碼軟件,具有強(qiáng)標(biāo)準(zhǔn)化特 點(diǎn),以保證其作為各種中間件發(fā)布的平臺(tái)。操作系統(tǒng)與外部最主要的接口就叫做 shello shell是操作系統(tǒng)最外面的一層。 它不屬于內(nèi)核部分,而是在核心之外。shell管理使用者與操作系統(tǒng)之間的交互: 等待使用者輸入,向操作系統(tǒng)解釋使用者的輸入,并且處理各種各樣的操作系統(tǒng) 的輸出結(jié)果。在當(dāng)今嵌入式開發(fā)過(guò)程中,如何提高開發(fā)效率,縮短開發(fā)周期至關(guān)重要。在 T-Kernel在嵌入式領(lǐng)域運(yùn)用如此廣泛,而在設(shè)計(jì)與研發(fā)當(dāng)中,如果有與 T-Kerne

6、l 相關(guān)的開發(fā)研究調(diào)試運(yùn)用工具無(wú)疑會(huì)給開發(fā)者帶來(lái)便捷, 提高開發(fā)效率,同時(shí)對(duì) 于想要學(xué)習(xí)和研究的開發(fā)者,是否能通過(guò)一種便捷實(shí)踐的方式來(lái)學(xué)習(xí)T-Kernel, uShell項(xiàng)目開發(fā)4而uShell能滿足這些要求,uShell是基于T-Kernel操作系統(tǒng)上的一個(gè)命令行應(yīng)用 程序,主要功能是通過(guò)串口輸入命令,根據(jù)命令來(lái)查詢和修改T-Engine開發(fā)板上 T-Kernel中的任務(wù)、郵箱、事件標(biāo)志、信號(hào)量、內(nèi)存池系統(tǒng)資源狀態(tài)。這樣在開 發(fā)過(guò)程中隨時(shí)查詢修改相關(guān)信息,可方便地進(jìn)行調(diào)試,縮短開發(fā)周期從而在開發(fā) 過(guò)程中提高開發(fā)效率。同時(shí)對(duì)于學(xué)習(xí)研究T-Kernel的開發(fā)者來(lái)說(shuō),不是單從理論 方面來(lái)認(rèn)知它,需

7、要理論學(xué)習(xí)的同時(shí)加以實(shí)踐,而uShell能為開發(fā)者提供實(shí)踐途 徑,從而為開發(fā)者提高學(xué)習(xí)和研究 T-Kernel的效率。uShell項(xiàng)目開發(fā)52需求分析環(huán)境需求2.1.1硬件環(huán)境:在該項(xiàng)目中,使用的硬件是 atmel公司的AT91SAM9261開發(fā)板,主板為單 板設(shè)計(jì),CPU直接集成在主板上。AT91SAM9261是以 ARM926EJ-S ARM Thumb 處理器為核心的完全的片上系統(tǒng), 它擴(kuò)展了 DSP指令集和Jazelle Java加速器。 主時(shí)鐘頻率 190MHz,性能高達(dá) 210 MIPS。外部總線接口包括支持同步 DRAM( SDRAM )和支持靜態(tài)存儲(chǔ)器的控制器,并有特殊接口電路

8、以支持 NOR FLASH、NAND Flash。該項(xiàng)目中會(huì)把 mot 文件加載至U NOR FLASH,NOR FLASH 為16bit 4M字節(jié)。在開發(fā)uShell過(guò)程中,主要功能是通過(guò)串口輸入命令,根據(jù)命 令來(lái)查詢和修改T-Engine開發(fā)板上T-Kernel中的任務(wù)、郵箱、事件標(biāo)志、信號(hào) 量、內(nèi)存池系統(tǒng)資源狀態(tài)。為了調(diào)試和燒制可執(zhí)行文件到開發(fā)板的flash上我們還需要J-Link。2.1.2軟件環(huán)境:AT91SAM9261開發(fā)板上加載的是嵌入式實(shí)時(shí)操作系統(tǒng) T -Kernel。為了把我 們的T-Kernel操作系統(tǒng)和我們開發(fā)的程序集成到一個(gè)可執(zhí)行文件上,我們需要專 門的SDK,其中集成

9、了 T-Kernel操作系統(tǒng),同時(shí)包含了 T-Kernel操作系統(tǒng)的內(nèi) 核API的接口,出了這些當(dāng)然其中還包含有一部分標(biāo)準(zhǔn) C庫(kù)。除了比較重要的SDK夕卜,我們需要一個(gè)集成開發(fā)環(huán)境,該開發(fā)環(huán)境要具備 兩個(gè)條件,第一,它能加載我們的 SDK,第二,它的編譯器要是 GCC ARM編 譯器。這里我們使用的是具有強(qiáng)大插件功能Eclipse集成開發(fā)環(huán)境,當(dāng)然其中還得安裝一些插件。uShell項(xiàng)目開發(fā)62.1.3功能需求功能概要1. USH是作為T-Kernel的應(yīng)用運(yùn)行的程序,它具有如下功能:2. 根據(jù)命令,參考/操作T-Kernel的各種狀態(tài)。3. 用戶程序的加載和卸載。4. 當(dāng)處于等待輸入命令狀態(tài)時(shí)

10、,在超級(jí)終端上顯示下面的提示符:5. USH%6. 接受用戶輸入命令并執(zhí)行。7. 以*開始的行是注釋,被視為無(wú)效輸入。8. 命令中有數(shù)值參數(shù)和字符串參數(shù)。9. 數(shù)值參數(shù)有如下輸入方法:10. H后面連接的是16進(jìn)制的數(shù)字串(09, AF)或者Ox后面連接的是16 進(jìn)制的數(shù)字串(09, AF)11. 后面連接的是10進(jìn)制的數(shù)字串(09)12. B后面連接的是2進(jìn)制的數(shù)字串(01)13. 無(wú)前綴的數(shù)字串的進(jìn)制,為radix命令設(shè)定的默認(rèn)進(jìn)制。詳細(xì)功能can wup撤消對(duì)任務(wù)的喚醒請(qǐng)求chg pri更改任務(wù)的優(yōu)先級(jí)clr flg清除EventFlag的位模式del tsk刪除任務(wù)frsm tsk強(qiáng)制

11、解除任務(wù)的所有掛起get reg參考任務(wù)的寄存器信息h幫助命令lodspg執(zhí)行用戶擴(kuò)展模塊prompt提示符設(shè)定radix基數(shù)的設(shè)定ref alm參考系統(tǒng)中 Alarm handler的狀態(tài)uShell項(xiàng)目開發(fā)7ref cyc參考系統(tǒng)中Cyclic handler的狀態(tài)ref flg參考系統(tǒng)中Eve nt Flag的狀態(tài)ref mbf參考系統(tǒng)中Message Buffer的狀態(tài)ref_mbx _參考系統(tǒng)中Mailbox的狀態(tài)ref_mpf_ 參考系統(tǒng)中固定大小內(nèi)存池的狀態(tài)ref_mpl _ 參考系統(tǒng)中可變大小內(nèi)存池的狀態(tài)ref_mtx _ 參考系統(tǒng)中 Mutex的狀態(tài)ref_por _ 參考系

12、統(tǒng)中Rendezvous Port的狀態(tài)ref_sem _ 參考系統(tǒng)中信號(hào)量的狀態(tài)ref_tsk_ 參考系統(tǒng)中任務(wù)的狀態(tài)rel_wai _ 解除任務(wù)的等待狀態(tài)rot_rdq _ 反轉(zhuǎn)同優(yōu)先級(jí)任務(wù)隊(duì)列的執(zhí)行時(shí)序rsm_tsk_強(qiáng)制解除任務(wù)的一次掛起set_flg_ 設(shè)置 Event Flag的位模式set_pow _ 設(shè)定系統(tǒng)的省電模式sig_sem _ 釋放信息量計(jì)數(shù)值sta_tsk _ 啟動(dòng)任務(wù)sus_tsk_ 掛起任務(wù)ter_tsk_ 強(qiáng)行終止任務(wù)wup_tsk _ 喚醒任務(wù)軟件構(gòu)成2.2.1開發(fā)條件Shell是作為一個(gè)T-Kernel下可以動(dòng)態(tài)加載的應(yīng)用程式運(yùn)行的222開發(fā)期間開發(fā)期間:

13、2010/3/15-2010/5/21uShell項(xiàng)目開發(fā)82.2.3開發(fā)語(yǔ)言開發(fā)語(yǔ)言:C選擇理由:C語(yǔ)言一直是嵌入式系統(tǒng)開發(fā)的最佳選擇,基于C語(yǔ)言的開發(fā)有代碼執(zhí)行效 率高,可移植性好,能訪問(wèn)硬件等特性,且 T-Kernel提供的接口是C語(yǔ)言接口, 因?yàn)檎麄€(gè)項(xiàng)目我們都要用到T-Kernel的內(nèi)核接口,所以我們選擇用 C語(yǔ)言。2.2.4開發(fā)使用的技術(shù)、知識(shí)除了要熟悉整個(gè)開發(fā)過(guò)程中用到的開發(fā)環(huán)境Eclipse外,這里我們還得熟悉的掌握T-Kernel操作系統(tǒng)的內(nèi)核API,及T-Kernel操作系統(tǒng)中的任務(wù)(類似于進(jìn) 程)的調(diào)度關(guān)系,因?yàn)樵谶@個(gè)項(xiàng)目中我們會(huì)創(chuàng)建三個(gè)主要的任務(wù), 分別負(fù)責(zé)管理,接受輸入

14、,處理輸入的命令。當(dāng)然任務(wù)間的通信也是我們這個(gè)項(xiàng)目中的一個(gè)非常 重要的部分,輸入的命令是通過(guò)T-Kernel中的一種通信機(jī)制把用戶輸入的命令傳 給別一任務(wù)進(jìn)行解析,并作出相應(yīng)的處理的。最后我們還要用到一個(gè)重要的技術(shù) 就是嵌入式開發(fā)的調(diào)試技術(shù),這是在嵌入式開發(fā)中不可少也不能少的一個(gè)部分。2.2.5主要術(shù)語(yǔ)介紹任務(wù):并行程序執(zhí)行的基本單元稱為“任務(wù)”。一個(gè)任務(wù)的程序是順序執(zhí)行 的;而多個(gè)不同任務(wù)的程序卻是并行執(zhí)行的。 該并行處理只是概念上的現(xiàn)象。 通 過(guò)內(nèi)核控制任務(wù)間的時(shí)間共享來(lái)實(shí)現(xiàn)并行執(zhí)行。由晞:郵箱是一個(gè)通過(guò)在系統(tǒng)(共享)內(nèi)存空間傳遞消息實(shí)現(xiàn)同步和通信的 對(duì)象,它包含一個(gè)用來(lái)發(fā)送消息的消息隊(duì)列

15、和一個(gè)用于等待消息的任務(wù)隊(duì)列。事件標(biāo)志:當(dāng)任務(wù)要與多個(gè)任務(wù)同步時(shí),就要用到事件標(biāo)志。事件標(biāo)志是一 個(gè)用來(lái)實(shí)現(xiàn)同步的對(duì)象,由多個(gè)位組成,用來(lái)指示對(duì)應(yīng)事件存在的標(biāo)志,除了有 用來(lái)指示對(duì)應(yīng)事件存在的位模式外,事件標(biāo)志還有一個(gè)等待事件標(biāo)志的任務(wù)隊(duì) 列,當(dāng)?shù)却?duì)列中的任務(wù)發(fā)現(xiàn)它等待的那個(gè)位被標(biāo)記了,這時(shí)它會(huì)被從等待任務(wù)隊(duì)列刪除并把它轉(zhuǎn)換為就緒狀態(tài)。消息緩沖區(qū):消息緩沖區(qū)是一個(gè)通過(guò)傳遞大小可變的消息來(lái)實(shí)現(xiàn)同步和通信 的對(duì)象。每個(gè)消息緩沖區(qū)有一個(gè)等待發(fā)送消息的消息隊(duì)列,和一個(gè)等待接收消息 uShell項(xiàng)目開發(fā)9的任務(wù)隊(duì)列。在本項(xiàng)目中,輸入的命令通過(guò)串口傳給輸入任務(wù), 輸入任務(wù)與解析 任務(wù)之間的同步和通信是通

16、過(guò)消息緩沖區(qū)實(shí)現(xiàn)的。任務(wù)間同步:即任務(wù)間信息的同步(傳遞)。2 2 6其他項(xiàng)目管理按照T-Engine實(shí)驗(yàn)室規(guī)定,采用SVN作為源碼管理工具。流程按 照天府軟件園有限公司 PEO中心開發(fā)流程進(jìn)行。編碼規(guī)范也使用天府軟件園C代碼編碼規(guī)范。uShell項(xiàng)目開發(fā)103概要設(shè)計(jì)模塊概述Shell主要的功能是通過(guò)串口輸入命令,根據(jù)命令來(lái)調(diào)用T-Kernel的系統(tǒng)功能 調(diào)用,進(jìn)而查詢或者改變系統(tǒng)對(duì)象的狀態(tài)。為了考慮以后重用、擴(kuò)展、移植、本 地化,在設(shè)計(jì)時(shí)考慮以下的思想:采用一個(gè)Mai n入口程序和三個(gè)任務(wù)的結(jié)構(gòu):Ma in主要負(fù)責(zé)啟動(dòng)一個(gè)管理任 務(wù),管理任務(wù)負(fù)責(zé)啟動(dòng)另外二個(gè)任務(wù), 其中一個(gè)任務(wù)是負(fù)責(zé)監(jiān)聽輸

17、入命令,格式化后,轉(zhuǎn)為內(nèi)部的消息,另外一個(gè)任務(wù)是負(fù)責(zé)根據(jù)消息,查詢命令函數(shù)表,執(zhí)行 相應(yīng)的功能查詢單元。1. 采用命令函數(shù)表管理所有的命令和對(duì)應(yīng)的參數(shù)檢查函數(shù)、執(zhí)行函數(shù)。2. 所有的命令功能按照任務(wù)、事件標(biāo)志、信號(hào)量、內(nèi)存,郵箱,周期,警報(bào),通用等分類歸入相應(yīng)的單元。3. 采用攜帶時(shí)間戳的命令結(jié)構(gòu),便于統(tǒng)計(jì)命令的執(zhí)行時(shí)間。4. 單獨(dú)的語(yǔ)言單元保存錯(cuò)誤信息和提示信息,這樣容易進(jìn)行本地化。5. 單獨(dú)設(shè)計(jì)錯(cuò)誤處理機(jī)制,統(tǒng)一處理嚴(yán)重錯(cuò)誤。6. 單獨(dú)的擴(kuò)展庫(kù)單元保存所有針對(duì)標(biāo)準(zhǔn) C庫(kù)函數(shù)和T-Kernel系統(tǒng)函數(shù)的擴(kuò) 展函數(shù),共同函數(shù)必須設(shè)計(jì)成為可以重入的結(jié)構(gòu)。7. 不使用系統(tǒng)靜態(tài)資源和固定內(nèi)存,便于可

18、重加載。3.1.1模塊結(jié)構(gòu)圖uShell項(xiàng)目開發(fā)11uShellUSH O01USH O02TKL廠USH_Parseo3SH_I撐撐USH_lnputStrinTKL O03GridTimeT-kernel丄DSOSSMRTC本概要設(shè)計(jì)采用結(jié)構(gòu)圖的方法,逐層分解模塊,一直到以文件為單位的單元,結(jié)構(gòu)圖參見下圖DriversCon soleSerial IO圖模塊中單元的詳細(xì)描述模塊詳細(xì)描述見表3.1,該表對(duì)圖3.1中的各個(gè)模塊的單元類型,及對(duì)相應(yīng) 功能模塊做了簡(jiǎn)要功能描述。表3.1模塊詳細(xì)描述No.單元名單元類型功能描述1USH_Mai n普通Shell的入口,創(chuàng)建及啟動(dòng)USH

19、 Kerl任務(wù)。2USH_Kerl任務(wù)管理任務(wù),啟動(dòng)時(shí)創(chuàng)建 USH_Parse和USH_lnput任務(wù), 退出時(shí)結(jié)束 USH_Parse和USH_Input任務(wù);創(chuàng)建任務(wù) 間用的消息緩沖區(qū)USH MainUSH Kerl103102USH 107USH I01USH 104rorTKUSH一_O01KT06TK O02TK O03 占TK-O04USH_I08USH SH 109TK O01.匕 TK-O5TKTKuShell項(xiàng)目開發(fā)123USH_I nput任務(wù)獲取用戶的輸入并格式化,并將格式正確的命令通過(guò)消息緩沖區(qū)發(fā)給任務(wù) USH Parse進(jìn)行處理。uShell項(xiàng)目開發(fā)134USH_Pa

20、rse任務(wù)接受消息緩沖區(qū)發(fā)送的用戶命令,解析后,查詢命令函數(shù)表,并執(zhí)行命令功能函數(shù)。5USH_Tsk普通執(zhí)行 Task 相關(guān)命令,包括 ref_tsk、sta_tsk、del_tsk、 sus_tsk、ter_tsk 、wup_tsk、can_wup、rsm_tsk、 frsm_tsk 、rel_wai 、chg_pri。6USH_Flg普通執(zhí)行事件標(biāo)志相關(guān)命令,包括ref_flg 、clr_flg 、set_flg 。7USH_Mpf普通執(zhí)行固定內(nèi)存池相關(guān)命令,包括ref_mpf。8USH_Cyc普通執(zhí)行周期性處理相關(guān)命令,包括ref cyc。9USH_Sem普通執(zhí)行信號(hào)量相關(guān)命令,包括re

21、f sem、sig sem。10USH Mbx普通執(zhí)行郵箱相關(guān)命令,包括ref mbx。11USH Alm普通執(zhí)行警報(bào)處理相關(guān)命令,包括ref alm 。12USH_Comm普通執(zhí)行其他一些命令,包括set_pow、h/?、prompt、sleep、radix、exit、date。13USH_La ng普通公共單兀,疋乂所有錯(cuò)誤提小和命令提小等信息,便于本地化。14USH Error普通公共單元,定義錯(cuò)誤處理的機(jī)制,統(tǒng)一處理錯(cuò)誤。15TKL_Stri ng普通公共單元,擴(kuò)展T-Kernel下C標(biāo)準(zhǔn)庫(kù)的字符串處理 函數(shù)。16TKL_Time普通公共單元,擴(kuò)展T-Kernel下C標(biāo)準(zhǔn)庫(kù)的時(shí)間日期處

22、 理函數(shù)。17TKL Grid普通公共單元,擴(kuò)展命令行下表格輸出函數(shù)。外部模塊接口表外部接口的詳細(xì)描述,見表3.2表3-2外部模塊接口表No.接口 ID接口接口類型接口內(nèi)容描述1USH O01ER mai n( W ac, B *av)函數(shù)Shell 作為 T-Kernel 應(yīng)uShell項(xiàng)目開發(fā)14用的入口函數(shù)2USH_O02 wup_tsk USH_KerllD命令通過(guò)命令喚醒 USH_Kerl任務(wù)內(nèi)部單元接口表內(nèi)部接口的詳細(xì)描述,見表3.3。表3.3內(nèi)部模塊接口表No.接口 ID接口接口類型接口內(nèi)容描述1.1USH_I01void USH_Kerl(INT stacd,VP exi nf

23、)任務(wù)作為創(chuàng)建USH_Kerl任務(wù)的入口函數(shù)。1.2USH_I01ID USH_KerlI ni t(void)函數(shù)初始化USH_Kerl任務(wù)。2.1USH_I02void USH_Parse(INT stacd,VP exi nf)任務(wù)作為創(chuàng)建USH_Parse任務(wù)的入口函數(shù)。2.2USH_I02ID USH_ParseI ni t(void)函數(shù)參數(shù)任務(wù)初始化3.1USH_I03void USH_I nput(INT stacd,VP exi nf)任務(wù)作為創(chuàng)建USH_lnput任務(wù)的入口函數(shù)。3.2USH I03ID USH_I nputl ni t(void)函數(shù)任務(wù)參數(shù)初始化4.1U

24、SH_I04ID USH_CommCreFlg(void)函數(shù)作為創(chuàng)建事件標(biāo)志的函 數(shù)。4.2USH_I04TMO USH_CommGetSlpTim(void)函數(shù)返回睡眠時(shí)間的入口函 數(shù)。5.1USH_I05ER tk_s nd_ mbf(ID stacd, VP msg,INT msgsz, TMO tmout)消息緩沖區(qū)輸入監(jiān)聽任務(wù)向緩沖區(qū)發(fā) 送消息。5.2USH_I05INT tk_rcv_mbf(ID stacd, VP msg, TMO tmout)消息緩沖區(qū)從消息緩沖區(qū)接收消息。6.1USH I06-uShell項(xiàng)目開發(fā)157.1USH_IO7ER USH_TskDel(W P

25、arC nt,UB *paParStr)函數(shù)刪除任務(wù)的入口7.2USH_IO7ER USH_TskChkDel(W ParC nt,UB *paParStr)函數(shù)核對(duì)刪除任務(wù)的命令的參數(shù)7.3USH_I07ER USH_TskSta(W ParC nt,UB *paParStr)函數(shù)啟動(dòng)任務(wù)的入口7.4USH_I07ER USH_TskChkSta(W ParC nt,UB *paParStr)函數(shù)核對(duì)啟動(dòng)任務(wù)的命令的參 數(shù)7.5USH_I07ER USH_TskTer(W ParC nt,UB *paParStr)函數(shù)終止其他任務(wù)的入口7.6USH_I07ER USH_TskChkTer(W

26、 ParC nt,UB *paParStr)函數(shù)核對(duì)終止其他任務(wù)命令的參數(shù)7.7USH_I07ER USH_TskChkChgPri(W ParC nt,UB *paParStr)函數(shù)改變?nèi)蝿?wù)的優(yōu)先級(jí)7.8USH_I07ER USH_TskChkChgPri(W ParC nt,UB *paParStr)函數(shù)核對(duì)改變?nèi)蝿?wù)的優(yōu)先級(jí)的命令的參數(shù)7.9USH_I07ER USH_TskRef(W ParC nt,UB *paParStr)函數(shù)查詢?nèi)蝿?wù)狀態(tài)的入口7.10USH_I07ER USH_TskChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢?nèi)蝿?wù)狀態(tài)的命令的參數(shù)uShe

27、ll項(xiàng)目開發(fā)167.12USH_IO7ER USH_TskWup(W ParC nt,UB *paParStr)函數(shù)喚醒其他任務(wù)的入口7.13USH_IO7ER USH_TskChkWup(W ParC nt,UB *paParStr)函數(shù)核對(duì)喚醒其他任務(wù)的命令的參數(shù)7.14USH_I07INT USH_TskCa nWup(W ParC nt,UB *paParStr)函數(shù)取消喚醒其他任務(wù)的入口7.15USH_I07INT USH_TskChkCa nWup(W ParC nt,UB *paParStr)函數(shù)核對(duì)取消喚醒其他任務(wù)的命令的參數(shù)7.16USH_I07ER USH_TskRelWa

28、i(W ParC nt,UB *paParStr)函數(shù)釋放等待狀態(tài)的入口7.17USH_I07ER USH_TskChkRelWai(W ParC nt,UB *paParStr)函數(shù)核對(duì)釋放等待狀態(tài)的命令的參數(shù)7.18USH_I07ER USH_TskSus(W ParC nt,UB *paParStr)函數(shù)掛起其他任務(wù)的入口7.19USH_I07ER USH_TskChkSus(W ParC nt,UB *paParStr)函數(shù)核對(duì)掛起其他任務(wù)的命令的參數(shù)7.20USH_I07ER USH_TskRsm(W ParC nt,UB *paParStr)函數(shù)恢復(fù)掛起其他任務(wù)的入口7.21USH

29、_I07ER USH_TskChkRsm(W ParC nt,UB *paParStr)函數(shù)核對(duì)恢復(fù)掛起其他任務(wù)的命令的參數(shù)uShell項(xiàng)目開發(fā)177.22USH_IO7ER USH_TskFrsm(W ParC nt,UB *paParStr)函數(shù)強(qiáng)制恢復(fù)掛起其他任務(wù)的入口7.23USH_IO7ER USH_TskChkFrsm(W ParC nt,UB *paParStr)函數(shù)核對(duì)強(qiáng)制恢復(fù)掛起其他任務(wù)的命令的參數(shù)7.24USH_I07ER USH_SemSig(W ParC nt,UB *paParStr)函數(shù)釋放信號(hào)量的入口7.25USH_I07ER USH_SemChkSig(W Pa

30、rC nt,UB *paParStr)函數(shù)核對(duì)釋放信號(hào)量的命令的參數(shù)7.26USH_I07ER USH_SemRef(W ParC nt,UB *paParStr)函數(shù)查詢信號(hào)量狀態(tài)的入口7.27USH_I07ER USH_SemChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢信號(hào)量狀態(tài)的命令的參數(shù)7.28USH_I07ER USH_FlgClr(W ParC nt,UB *paParStr)函數(shù)清除事件標(biāo)志的入口7.29USH_I07ER USH_FlgChkClr(W ParC nt,UB *paParStr)函數(shù)核對(duì)清除事件標(biāo)志的命令的參數(shù)7.30USH_I07E

31、R USH_FlgRef(W ParC nt,UB *paParStr)函數(shù)查詢事件標(biāo)志的入口7.31USH_I07ER USH_FlgChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢事件標(biāo)志的命令的參數(shù)uShell項(xiàng)目開發(fā)187.32USH_IO7ER USH_FlgSet(W ParC nt,UB *paParStr)函數(shù)設(shè)置事件標(biāo)志的入口7.33USH_IO7ER USH_FlgChkSet(W ParC nt,UB *paParStr)函數(shù)核對(duì)設(shè)置事件標(biāo)志的命令的參數(shù)7.34USH_I07ER USH_MbxRef(W ParC nt,UB *paParStr)

32、函數(shù)查詢郵箱狀態(tài)的入口7.35USH_I07ER USH_MbxChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢郵箱狀態(tài)的命令的參數(shù)7.36USH_I07ER USH_MpfRef(W ParC nt,UB *paParStr)函數(shù)查詢固定內(nèi)存池大小的狀態(tài)的入口7.37USH_I07ER USH_MpfChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢固定內(nèi)存池大小狀態(tài)的命令的參數(shù)7.38USH_I07ER USH_AlmRef(W ParC nt,UB *paParStr)函數(shù)查詢警報(bào)處理程序的狀態(tài)的入口7.39USH_I07ER USH_Alm

33、ChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢警報(bào)處理程序狀態(tài)的命令的參數(shù)7.40USH_I07ER USH_CycRef(W ParC nt,UB *paParStr)函數(shù)查詢周期性處理程序的狀態(tài)的入口7.41USH_I07ER USH_CycChkRef(W ParC nt,UB *paParStr)函數(shù)核對(duì)查詢周期性處理程序的狀態(tài)的命令的參數(shù)uShell項(xiàng)目開發(fā)197.42USH_IO7ER USH_TskGetReg(W ParC nt,UB *paParStr)函數(shù)獲得任務(wù)寄存器的內(nèi)容的入口7.43USH_IO7ER USH_TskGetChkReg(W P

34、arC nt,UB *paParStr)函數(shù)核對(duì)獲得任務(wù)寄存器的內(nèi)容的命令的參數(shù)7.44USH_I07ER USH_TskRotRdq(W ParC nt,UB *paParStr)函數(shù)翻轉(zhuǎn)就緒隊(duì)列的入口7.45USH_I07ER USH_TskRotChkRdq(W ParC nt,UB *paParStr)函數(shù)核對(duì)翻轉(zhuǎn)就緒隊(duì)列的命令的參數(shù)7.46USH_I07ER USH_TskSetPow(W ParC nt,UB *paParStr)函數(shù)設(shè)置電源模式的入口7.47USH_I07ER USH_TskSetChkPow(W ParC nt,UB *paParStr)函數(shù)核對(duì)設(shè)置電源模式的命

35、令的參數(shù)7.48USH_I07ER USH_CommChkPar(W ParC nt,UB *paParStr)函數(shù)核對(duì)參數(shù)的合法性7.49USH_I07ER USH_CommHelp(W ParC nt,UB *paParStr)函數(shù)輸出幫助信息的入口7.50USH_I07ER USH_CommChkHelp(W ParC nt,UB *paParStr)函數(shù)核對(duì)輸出幫助信息的命令的參數(shù)7.51USH I07UB USH CommGetRadix(void)函數(shù)進(jìn)制的設(shè)定的入口7.52USH_I07ER USH_CommExit(W ParC nt,函數(shù)退出系統(tǒng)的入口uShell項(xiàng)目開發(fā)20

36、UB *paParStr)7.53USH_IO7ER USH_CommChkExit(W ParC nt,UB *paParStr)函數(shù)核對(duì)退出系統(tǒng)的命令的參 數(shù)7.54USH_IO7ER USH_CommDate(W ParC nt,UB *paParStr)函數(shù)顯示和設(shè)定日期的入口7.55USH_I07ER USH_CommChkDate(W ParC nt,UB *paParStr)函數(shù)核對(duì)顯示和設(shè)定日期的命令的參數(shù)7.56USH_I07UB* USH_CommGetPrompt(void)函數(shù)獲取當(dāng)前提示符的指針8.1USH_I08ER USH_CommSetPrompt(W ParC

37、 nt,UB *paParStr )函數(shù)設(shè)置提示符的入口8.2USH_I08ER USH_CommChkSetPrompt(W ParC nt,UB *paParStr)函數(shù)核對(duì)設(shè)置提示符的命令的參數(shù)8.3USH_I08ER USH_CommSetRadix(W ParC nt,UB *paParStr)函數(shù)設(shè)置進(jìn)制的入口8.4USH_I08ER USH_CommChkSetRadix(W ParC nt,UB *paParStr)函數(shù)核對(duì)設(shè)置進(jìn)制的命令的參 數(shù)9.1USH I09void USH La ngMsg(W MsgID)函數(shù)輸出提示信息的函數(shù)10.1TKL_O01UW TKL_St

38、ri ng2Array(B* pStri ng,B* aStrArray ,UW Row,B* pDelimiter)函數(shù)把字符串按照指定的多個(gè) 分隔符轉(zhuǎn)換成數(shù)組,返回 實(shí)際轉(zhuǎn)換的數(shù)組維數(shù),同 時(shí)源字符串的前后空格會(huì) 被刪除10.2TKL O01UB TKL Stri ngTrim(函數(shù)去除字符串前后的空格,uShell項(xiàng)目開發(fā)21B* pSourStr)返回實(shí)際刪除的空格數(shù)10.3TKL_O01 B* TKL_Stri nglower(B* pSourStr)函數(shù)轉(zhuǎn)換字符串為小寫,返回轉(zhuǎn)換后的字符串指針10.4TKL_O01B* TKL_Stri ngUpper(B* pSourStr)函數(shù)

39、轉(zhuǎn)換字符串為大與,返回轉(zhuǎn)換后的字符串指針10.5TKL_O01UW TKL_Stri ngtol(B *pStr,UB Base)函數(shù)按照指定進(jìn)制把字符串轉(zhuǎn)換為整數(shù)10.6TKL_O01BOOL TKL_Stri nglsDigit(B *pStr)函數(shù)判斷字符串中是否為數(shù)字串,是返回真10.7TKL_O01UW TKL_ltoStri ng(UW Val,B *pStr,UB Base,UB MaxLe n)函數(shù)按照指定的進(jìn)制和最大長(zhǎng) 度,把32位整數(shù)轉(zhuǎn)換為字 符串,返回轉(zhuǎn)換后的字符 串長(zhǎng)度11.1TKL_O02ER TKL_Gridl nit(TKL GRID* pGrid)函數(shù)初始化表信

40、息11.2TKL_O02ER TKL_GridColI nit(TKL_GRID* pGrid,B* pTitle,UW Width,TKL_GRID_ALIGNMENTAlig n)函數(shù)初始化列信息11.3TKL_O02ER TKL_GridColAddl nt(TKL_GRID* pGrid,W Val,W Cnt)函數(shù)增加整型列數(shù)據(jù)11.4TKL_O02ER TKL_GridColAddStr(TKL_GRID* pGrid,B* Val,函數(shù)增加字符型列數(shù)據(jù)uShell項(xiàng)目開發(fā)22W Cnt)11.5TKL_O02ER TKL_GridPutTitle(TKL_GRID* pGrid)

41、函數(shù)輸出定義的Grid的標(biāo)題 行11.6TKL_O02ER TKL_GridPutRow(TKL_GRID* pGrid)函數(shù)輸出定義的Grid的數(shù)據(jù) 行11.7TKL_O02W TKL_GridGetCols(TKL_GRID* pGrid)函數(shù)獲得Grid列數(shù)12.1TKL_O03ER TKL_TimeSet(struct tm * pTime)函數(shù)設(shè)置日期時(shí)間struct tm 參見標(biāo)準(zhǔn)庫(kù)time.h12.2TKL_O03ER TKL_TimeGet( struct tm * pTime)函數(shù)獲得日期時(shí)間12.3TKL_O03BOOL TKL_TimelsYear(UB* pYear)函

42、數(shù)判斷是否是年字符串12.4TKL_O03BOOL TKL_TimeIsM on( UB* pMon)函數(shù)判斷是否是月字符串12.5TKL_O03BOOL TKL_TimelsMday(UB* pMday)函數(shù)判斷是否是日字符串12.6TKL_O03BOOL TKL_TimelsHour(UB* pHour)函數(shù)判斷是否是時(shí)字符串12.7TKL O03BOOL TKL TimeIsMi n( UB* pMi n)函數(shù)判斷是否是分字符串12.8TKL O03BOOL TKL TimelsSec(UB* pSec)函數(shù)判斷是否是秒字符串3.4狀態(tài)遷移圖狀態(tài)遷移圖見圖3.2,該圖顯示出T-Kerne

43、l內(nèi)核中任務(wù)的幾大重要狀態(tài),本 項(xiàng)目中的三個(gè)任務(wù)主要是在running、ready waiting態(tài)之間切換,監(jiān)聽輸入的任 務(wù)長(zhǎng)時(shí)間處于running態(tài),等待接收用戶命令的輸入,而響應(yīng)命令的任務(wù)多數(shù)處 于waiting態(tài)等待事件標(biāo)志的發(fā)生,當(dāng)它等待的事件標(biāo)志位被設(shè)置后,它轉(zhuǎn)入ready 態(tài)。而管理任務(wù)則在建立好監(jiān)聽任務(wù)和處理任務(wù)后長(zhǎng)時(shí)間處于ready態(tài),直到接uShell項(xiàng)目開發(fā)23ReadypreemptionRunningdispatchtk wup tsk()waitWaitingtk_sta_tsk()tk_ext_rak()tk_ter_tsk()tk_exc_tsk()到的命令為e

44、xit,才轉(zhuǎn)為running態(tài)去結(jié)束監(jiān)聽任務(wù)、處理任務(wù)和自己,最終系 統(tǒng)推出停止運(yùn)行。3.5人機(jī)界面實(shí)現(xiàn)方法在本項(xiàng)目中,人機(jī)界面較為簡(jiǎn)單,不需要圖形界面等復(fù)雜界面的顯示, 只是 對(duì)輸入的命令顯示相應(yīng)的反饋信息??紤]到這些需求以及設(shè)計(jì)的簡(jiǎn)單化,我們采 用的是串口輸出顯示。米用串口調(diào)試助手,在串口調(diào)試助手上顯示所輸出的信息。串口設(shè)置:115200bps的波特率、8位數(shù)據(jù)傳輸、1位停止位、無(wú)奇偶校驗(yàn)位。 但是,在輸出過(guò)程中,很重要的是需要調(diào)用 TKL_Grid單元定義輸出格式。要使輸出結(jié)果簡(jiǎn)單明了,操作簡(jiǎn)單,在進(jìn)行設(shè)計(jì)輸出時(shí)需要遵循以下的幾個(gè)要求:1.命令的輸入采用整行輸入的方式,在按下回車鍵后,表

45、明命令已輸入完tk_ter_tsk()圖3.2狀態(tài)前移圖uShell項(xiàng)目開發(fā)24成,輸入任務(wù)通過(guò)消息緩沖區(qū)發(fā)送輸入命令到解析任務(wù)。2. 反饋信息的輸出采用tm_putstring函數(shù),是T-kernel內(nèi)核具有的字符串輸 出函數(shù),以整行方式輸出。3. 表格式的輸出,采用TKL_Grid單元,TKL_Grid單元里提供格式化輸出 信息的所有函數(shù)底層接口,按照何種格式輸出,完全由用戶自己定義, 通過(guò)只提供底層函數(shù)由用戶自定義輸出可以縮小代碼量及提高性能。3.6異常處理暫不實(shí)現(xiàn)。3.7執(zhí)行時(shí)間估計(jì)uShell的一個(gè)命令執(zhí)行包括從串口獲取用戶命令,然后對(duì)命令解析,并調(diào)用 相應(yīng)的命令處理函數(shù),最后將信息

46、返回。一個(gè)命令的執(zhí)行時(shí)間包括了通過(guò)從串口 收到數(shù)據(jù)開始,以及命令的處理時(shí)間。命令執(zhí)行時(shí)間的計(jì)算由USH_Parse負(fù)責(zé)執(zhí)行和輸出。uShell命令處理的時(shí)間如下表。表3.4命令執(zhí)行時(shí)間表No.命令執(zhí)行時(shí)間(ms)說(shuō)明1 ref_tsk6046 個(gè) tsk2 ref_tsk 22291 個(gè) tsk3 sta tsk304 del_tsk305 sus_tsk306 ter_tsk307 wup_tsk308 can _wup309 rsm tsk3010 frsm tsk3011rel wai3012 chg_pri 5,12926uShell項(xiàng)目開發(fā)2513ref_flg54710 個(gè) flg

47、14ref_flg 21231 個(gè) flg15clr_flg3016set_flg3017ref_mbx760 個(gè) mbx18ref_sem67915 個(gè) sem19ref_sem 21081 個(gè) sem20sig_sem3021ref_mbf800 個(gè) mbf22ref_mpf720 個(gè) mpf23ref_mpl830 個(gè) mpl24ref_mtx800 個(gè) mtx25ref_alm800 個(gè) alm26ref_cyc800 個(gè) eye27get_reg8028ref por800個(gè)29rot_rdq800個(gè)30set pow3031Lodspg-取決于程序大小32Un Ispg-取決于程序

48、大小33*134h/?81835h12836Prompt3137Prompt “ IMS ”238Sleep-除非手動(dòng)喚醒39Radix2440Radix H241Exit-uShell項(xiàng)目開發(fā)2654Date663.8源碼目錄文件結(jié)構(gòu)源碼目錄文件結(jié)構(gòu)表3.5源碼目錄文件結(jié)構(gòu)描述No.一級(jí)目錄二級(jí)目錄文件功能描述1 in clude所有單兀的頭文件2uShelluShell單元目錄3USH_Mai n.hT-Kernel入口模塊4USH_Kerl.h管理模塊頭文件5USH_I nput.h輸入模塊頭文件6USH_Parse.h命令處理模塊頭文件7USH_Tsk.h任務(wù)相關(guān)命令處理8USH_Fl

49、g.h事件相關(guān)命令處理9USH_Mpf.h內(nèi)存池相關(guān)命令處理10USH Cyc.h周期程序命令處理11USH Sem.h信號(hào)量命令處理12USH Mbx.h郵箱命令處理13USH_Alm.h警報(bào)命令處理14USH_Comm.h通用模塊15USH_La ng.h語(yǔ)言模塊16USH Error.h錯(cuò)誤處理17TKLTKL單元目錄18TKL Stri ng.h底層字符串處理19TKL Time.h時(shí)間處理20TKL_Grid.h格式化輸出21 src所有單元的源程序22uShelluShell模塊目錄23USH Mai n.cT-Kernel入口模塊uShell項(xiàng)目開發(fā)2724USH_Kerl.c管

50、理模塊頭文件25USH_I nput.c輸入模塊頭文件26USH_Parse.c命令處理模塊頭文件27USH_Tsk.c任務(wù)相關(guān)命令處理28USH_Flg.c事件相關(guān)命令處理29USH_Mpf.c內(nèi)存池相關(guān)命令處理30USH_Cyc.c周期程序命令處理31USH_Sem.c信號(hào)量命令處理32USH_Mbx.c郵箱命令處理33USH_Alm.c警報(bào)命令處理34USH_Comm.c通用模塊35USH_La ng.c語(yǔ)言模塊36USH_Error.c錯(cuò)誤處理37TKLTKL單元目錄38TKL_Stri ng.c底層字符串處理39TKL Time.c時(shí)間處理40TKL_Grid.c格式化輸出41.gd

51、bi nit42Makefile43 tbat9144Makefile45ushell.mot執(zhí)行文件(不帶調(diào)試)46 Tbat91.dabug47Makefile48ushell.mot執(zhí)行文件(帶調(diào)試信 息)49 .cdtproject工程文件50 .project工程文件51 ReadMe.txt自述文件uShell項(xiàng)目開發(fā)2852 SccClear.bat清理VSS的vssver.sccuShell項(xiàng)目開發(fā)294詳細(xì)設(shè)計(jì)4.1主要數(shù)據(jù)結(jié)構(gòu)描述4.1.1格式化輸出輸入命令執(zhí)行后需要產(chǎn)生大量的輸出, 所以,格式化的輸入輸出語(yǔ)句是需要 經(jīng)常調(diào)用的,通常的格式化方法是把輸出的信息放入一個(gè)十字鏈

52、表結(jié)構(gòu)中,然后一起輸出。但是十字鏈表的查找,插入操作很費(fèi)時(shí)間,而且還涉及到動(dòng)態(tài)分配和 釋放內(nèi)存等相當(dāng)耗費(fèi)時(shí)間的處理過(guò)程。內(nèi)存泄露問(wèn)題也很難控制,針對(duì)這種情況, 本課題特別設(shè)計(jì)了一種靜態(tài)鏈表的數(shù)據(jù)結(jié)構(gòu), 我們采用填充一行數(shù)據(jù)輸出一行數(shù)據(jù),以求達(dá)到時(shí)間和空間的相對(duì)合理,結(jié)構(gòu)定義如下:#defi ne MAX_WIDTH (32)#defi ne MAX_COLUMN (20)typedef enum TKL_GRID_ALIGNMENTLEFT,/*左對(duì)齊*/RIGHT/*右對(duì)齊*/ TKL_GRID_ALIGNMENT;/*輸出信息的對(duì)齊方式 */*表的列單元結(jié)構(gòu)*/typedef struct

53、 COLUMNB dataMAX_WIDTH;/*數(shù)據(jù)最大寬度 */B titleMAX_WIDTH;/*標(biāo)題最大寬度 */UW width;/*標(biāo)題和數(shù)據(jù)存放的寬度*/uShell項(xiàng)目開發(fā)30TKL_GRID_ALIGNMENT alignment;/* 對(duì)齊方式 */ COLUMN;/*表結(jié)構(gòu)*/typedef struct TKL_GRIDCOLUMN columnsMAX_COLUMN; /* 表格總列數(shù) */W columnNumber;/*格式化表格當(dāng)前列數(shù) */ TKL_GRID;4.1.2函數(shù)查找該項(xiàng)目中,我們的工作是通過(guò)得到用戶的命令然后解析輸出相應(yīng)的信息給用 戶,在設(shè)計(jì)過(guò)程

54、中我們采用一個(gè)命令對(duì)應(yīng)一個(gè)函數(shù)的形式,以方便命令的處理, 這就引出一個(gè)問(wèn)題就是得到命令后要去函數(shù)集中查找對(duì)應(yīng)這個(gè)命令的處理函數(shù) 是哪一個(gè),當(dāng)然很多方式可以得到預(yù)期的目的,但是考慮到查詢速度、擴(kuò)展性等各方面原因,我們這里采用的是一個(gè)雙鏈鍵樹結(jié)構(gòu)。它的查詢的時(shí)間復(fù)雜度為 O(1),查詢到對(duì)應(yīng)函數(shù)需要執(zhí)行的次數(shù)是以命令長(zhǎng)度成1:1的關(guān)系的。數(shù)據(jù)結(jié)構(gòu)定義如下:/*樹節(jié)點(diǎn)類型*/typedef enum NODEKINDBRANCH, /*樹的分支節(jié)點(diǎn) */LEAF /*樹的葉子節(jié)點(diǎn) */NODEKIND;/* -鍵樹節(jié)點(diǎn)結(jié)構(gòu)-*/typedef struct TRIENODEenum NODEKIND

55、 kind; /*當(dāng)前樹節(jié)點(diǎn)類型 */unionvoid * record;/*存儲(chǔ)函數(shù)指針 */uShell項(xiàng)目開發(fā)31struct TRIENODE * ptr27;/*當(dāng)前節(jié)點(diǎn)的孩子節(jié)點(diǎn) */;trieNode,*trieTree;4.1.3關(guān)鍵結(jié)構(gòu)說(shuō)明Allld結(jié)構(gòu)體類型,存放了項(xiàng)目中建立的所有資源的ID,包括3個(gè)任務(wù),1個(gè)標(biāo)志事件組、1個(gè)消息緩沖區(qū):typedef structID tskldA,tskldB,tskldC; /* 任務(wù) ID */ID flgld;/* 事件標(biāo)志 ID */ID mbfid;/*消息緩沖區(qū)ID */ allId;T_CTSK結(jié)構(gòu)體類型,存放了建立一個(gè)

56、任務(wù)需要設(shè)置的所有屬性,在uShell項(xiàng)目中,創(chuàng)建任務(wù)時(shí)需初始化 exinf、tskatr、task、itskpri、stksz變量。typedef struct t_ctsk VP exi nf;/*存放任務(wù)擴(kuò)展信息的地址*/ATR tskatr;/*任務(wù)屬性*/FP task;/*任務(wù)啟動(dòng)地址*/PRI itskpri;W stks z;/*任務(wù)啟動(dòng)時(shí)的優(yōu)先級(jí)*/*用戶堆棧大小(字節(jié))*/UB dsname8; /* 對(duì)象名稱 */VP bufptr;/*用戶緩沖區(qū)*/ T_CTSK;在uShell項(xiàng)目中創(chuàng)建任務(wù)時(shí),allId和T_CTSK結(jié)構(gòu)類型初始化如下/*入口函數(shù)說(shuō)明,以下是入口函數(shù)

57、創(chuàng)建任務(wù) A的過(guò)程*/EXPORT INT UshellMai n(void) UshellMa inallId taskId;T_CTSK ctskA;uShell項(xiàng)目開發(fā)32/* TaskA是負(fù)責(zé)監(jiān)聽輸入命令 */uShell項(xiàng)目開發(fā)33/*任務(wù)屬性設(shè)置*/*任務(wù)地址*/*任務(wù)優(yōu)先級(jí)*/*堆棧大小*/*擴(kuò)展信息,存放著任務(wù)和緩沖區(qū)及標(biāo)志事件組的ID */ctskA.exi nf = (VP)(& taskld);ctskA.tskatr = TA_HLNG | TA_RNGO; ctskA.task = &TaskA;ctskA.itskpri = 21;ctskA.stksz = 102

58、4;4.2參考資料表4.1參考資料表序號(hào)資料名稱1USHM要設(shè)計(jì)2UML嵌入式C3 卩 T-Kernel Specification(詳細(xì)說(shuō)明書)1.01.00_en4源碼開放的嵌入式實(shí)時(shí)操作系統(tǒng)T-Kernel4.3單元設(shè)計(jì)4.3.1函數(shù)一覽表該函數(shù)一覽表只列出了部分我們實(shí)現(xiàn)的函數(shù)接口及功能描述,表中描述的函數(shù)接口主要是用來(lái)處理與任務(wù)相關(guān)的命令和格式化輸出相關(guān)的接口。表4.2函數(shù)一覽表文件名ush_tsk.h ush_tsk.c塊名函數(shù)ID函數(shù)原型類型功能描述USH_Tsk7.1ER USH_TskDel(W parC nt,UB *paParStr)函數(shù)刪除任務(wù)的入口uShell項(xiàng)目開發(fā)3

59、47.2ER USH_TskChkDel(W parC nt,UB *paParStr)函數(shù)核對(duì)刪除任務(wù)的命令的參數(shù)7.3ER USH_TskSta(W parC nt,UB *paParStr)函數(shù)啟動(dòng)任務(wù)入口7.4ER USH_TskChkSta(W parC nt,UB *paParStr)函數(shù)核對(duì)啟動(dòng)任務(wù)的命令的參數(shù)7.5ER USH_TskTer(W parC nt,UB *paParStr)函數(shù)終止其他任務(wù)的入口7.6ER USH_TskChkTer(W parC nt,UB *paParStr)函數(shù)核對(duì)終止其他任務(wù)命令的參數(shù)7.7ER USH_TskChgPri(W parC n

60、t,UB* paParStr)函數(shù)改變指定任務(wù)的優(yōu)先級(jí)7.8ER USH_TskChkChgPri(W parC nt,UB* paParStr)函數(shù)檢查 USH TskChgPri中的參數(shù)7.9ER USH_TskRef(W parC nt,UB* paParStr)函數(shù)參考系統(tǒng)中任務(wù)的狀態(tài),查詢指定的任務(wù)的狀態(tài)信息7.10ER USH_TskChkRef(W parC nt,UB* paParStr)函數(shù)檢查USH TskRef中的參數(shù)USH_Tsk7.12ER USH_TskWup(W parC nt,UB *paParStr)函數(shù)喚醒其他任務(wù)的入口uShell項(xiàng)目開發(fā)357.13ER

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論