μC/OS的應用和擴展

發(fā)布時(shí)間:2010-11-15 12:50    發(fā)布者:eetech
關(guān)鍵詞: 擴展 , 應用
本文介紹了μC/OS在ColdFire為核心系統上的具體應用,并在此基礎上做了擴展,在μC/OS的核心上實(shí)現了RAM盤(pán)和文件系統。為了方便應用和調試,還實(shí)現了用戶(hù)Shell程序,可以接受并執行用戶(hù)命令,擴展并豐富了μC/OS的功能。                           

一、 概述
        
近年來(lái),隨著(zhù)微控制器性能的不斷提高,嵌入式應用越來(lái)越廣泛。目前市場(chǎng)上的大型商用嵌入式實(shí)時(shí)系統,如VERTEX,VXWORK,PSOS等等,已經(jīng)十分成熟,并為用戶(hù)提供了強有力的開(kāi)發(fā)和調試工具。但商用嵌入式實(shí)時(shí)系統價(jià)格昂貴,而且都針對特定的硬件平臺。對于國內中小型系統的開(kāi)發(fā),購買(mǎi)商用實(shí)時(shí)系統并不劃算。此時(shí),采用免費軟件和開(kāi)放代碼不失為一種選擇。目前源碼開(kāi)放(C代碼)的嵌入式系統有μC/OS的uCLinux。μC/OS簡(jiǎn)單易學(xué),提供了嵌入式系統的基本功能,其核心代碼短小精悍,如果針對硬件進(jìn)行優(yōu)化,還可以獲得更高的執行效率。但是μC/OS相對商用嵌入式系統來(lái)說(shuō)還是過(guò)于簡(jiǎn)單,而且存在開(kāi)發(fā)調試困難的問(wèn)題。UCLinux是免費軟件運動(dòng)的產(chǎn)物,包含豐富的功能,包括文件系統、各種外調驅動(dòng)程序、通訊模塊、TCP/IP、PPP、HTTP,甚至WEB服務(wù)器的代碼。在INTERNET上流傳的uCLinux已經(jīng)被移植到當前幾乎所有的硬件平臺上,功能與PC機上運行的Linux不相上下,其代碼也十分復雜。完全移植沒(méi)有必要也十分困難,但uCLinux的代碼經(jīng)過(guò)世界范圍內的優(yōu)化,穩定可靠而且高效,所有模塊的代碼都可以從INTERNET上獲得,可以進(jìn)行模塊移植。在本例應用中,筆者在ColdFire硬件平臺上運行了μC/OS的核心,并實(shí)現了uCLinux的文件系統,使得在嵌入式應用中可以進(jìn)行文件操作。同時(shí)針對μC/OS調試困難的問(wèn)題。還移植了uCLinux的用戶(hù)Shell,使得用戶(hù)可以用命令行方式進(jìn)行程序的調試和開(kāi)發(fā)。
        
二、 硬件平臺
        
本系統的硬件平臺采用GPFC(General  Purpose Fieldbus Controller)數據采集系統。該系統是由德國漢堡國家同步輻射實(shí)驗實(shí)(DESY)Dr.Matthias  Clausen領(lǐng)導的研究小組開(kāi)發(fā),采用Motorola公司的ColdFire  MCF5206處理器為核心。ColdFire MCF5206處理器屬于Motorola 32位MCU家族,在源碼上與68K系列兼容。全靜態(tài)設計,在33MHz的工作頻率下可達最大17MIPS的處理能力。除了具有68K系統的通用功能模塊外,片內還帶有DRAM控制模塊,可以直接外接DRAM芯片。由于ColdFire將片選邏輯電路、總線(xiàn)控制器、DRAM控制模塊等全部集成在MCU內部,使得外圍電路變得十分簡(jiǎn)單。
        
在筆者所用的GPFC系統中,ColdFire工作在32MHz,外圍電路包括兩片DEAM芯片,共計4M的RAM,一片128K的FLASH,用于存放引導程序。其余為I/O電路。系統通過(guò)RS-232串口與PC機相連。
        
三、 軟件設計
        
本系統的軟件采用μC/OS為嵌入式平臺。在應用中切實(shí)感到了開(kāi)放源代碼的無(wú)可替代的優(yōu)點(diǎn)。首先是可以根據自己的需要對源代碼進(jìn)行取舍,去掉不需要的變量和不使用的函數,甚至可以根據需要改寫(xiě)相關(guān)函數。在μC/OS的源代碼中,函數執行中有許多條件判斷,作用是防止參數的錯誤傳遞。例如,與信號量有關(guān)的函數在執行前都會(huì )檢查一下傳遞給函數的指針是不是一個(gè)有效的信號量指針。作為通用系統,這些條件判斷是完全必要的,避免出現錯誤時(shí)系統崩潰。但作為具體的應用,只要在程序設計時(shí)保證參數傳遞的正確性,完全可以不用條件判斷,就能提高函數的執行速度,尤其一些頻繁調用的函數,或當MCU速率不高的時(shí)候,重寫(xiě)部分函數往往可以顯著(zhù)提高系統性能。另外,由于用戶(hù)對系統有源碼級的了解,可以添加自己編寫(xiě)的模塊,與原系統兼容,使系統具有可擴展性。
        
正是由于μC/OS的可擴展性,筆者將uCLinux的RAM盤(pán)、文件系統和用戶(hù)Shell移植到了μC/OS上,在用戶(hù)程序中可以進(jìn)行文件操作,文件系統可以為任務(wù)保存數據,并提供了統一的接口函數。用戶(hù)編制的單個(gè)任務(wù)也可以保存在RAM盤(pán)上,可以在終端上用命令方式執行運行、監控、刪除任務(wù)。
        
四、 文件系統

        
uCLinux的文件系統與Linux的基本相同,文件以樹(shù)型目錄組織。由于篇幅所限,關(guān)于文件系統的細節,讀者可參考Linux和Unix的相關(guān)資料,本例中將RAM中高端的1M分配給文件系統,建立了容量為1M的RAM盤(pán)。UCLinux的文件系統由邏輯塊組成,如果是磁盤(pán)文件系統,對應為磁盤(pán)塊;RAM盤(pán)則對應為內存塊,每個(gè)塊為512字節。一個(gè)標準的邏輯盤(pán)劃分成幾個(gè)部分:引導塊、超級塊、索引節點(diǎn)區和數據區。
        [td]引導塊
超級塊索引節點(diǎn)區數據區

引導塊在文件系統的開(kāi)頭,通常為一個(gè)邏輯塊、存放引導程序,用于啟動(dòng)和引導操作系統。在我們的RAM文件系統中由于不需要RAM盤(pán)引導,所以不分配引導塊。超級塊記錄文件系統當前狀態(tài),盤(pán)有多大,能存放多少文件,何處可以找到空閑空間和用于文件系統管理的信息。索引節點(diǎn)區緊接在超級塊后面,存放文件系統的索引節點(diǎn)表。在文件系統中每一個(gè)文件(包含目錄)占據一個(gè)索引節點(diǎn)表項。索引節點(diǎn)是一個(gè)記錄文件信息的數據結構:

        struct dinode{
        short di-mode;
        /*文件模式:是文件還是目錄,是可讀、可寫(xiě)還是可執行*/
        short di-nlink;
        /*和文件相關(guān)的鏈接數*/
        short di-uid;
        /*文件所有者的標示*/
        short di-gid;
        /*文件所有者的組標示*/
        long di-size; /*文件大小*/
        char di-addr[ ];
        /*文件數據所在的邏輯塊編號*/
        time-t di-atime;
        /*文件最后一次訪(fǎng)問(wèn)的時(shí)間*/
        time-t di-mtime;
        /*文件最后一次修改的時(shí)間*/
        time-t di-ctime;
        /*文件建立的時(shí)間*/
        }
        
其中的數組di-addr[ ]記錄文件數據所在的邏輯塊號。本例中RAM盤(pán)為1M,每個(gè)邏輯塊512字節,共2048個(gè)邏輯塊,所以每個(gè)邏輯塊的編號要用兩個(gè)字節表示。為了記錄足夠長(cháng)的文件,di-addr[ ]中邏輯塊可分為直接塊和間接塊。關(guān)于直接塊和間接塊的概念,請讀者參考Linux的相關(guān)文檔。分析索引節點(diǎn)可知,通過(guò)索引節點(diǎn)就可以完全確定一個(gè)文件。索引節點(diǎn)表中的第一項就是根目錄。索引節點(diǎn)區的大小決定了文件系統中最多能有多少個(gè)文件(包括目錄)。在本例中,筆者設定為128項。在索引節點(diǎn)區后就是數據區,數據區以邏輯塊為單位按次序編號。如果要訪(fǎng)問(wèn)某個(gè)文件,只要找到該文件對應的索引節點(diǎn)表項,從di-addr[ ]項中就可以查出文件數據所在的邏輯塊。文件的訪(fǎng)問(wèn)需要通過(guò)fread()或fwrite()函數,其細節不再復述。
        
添加了文件系統后,任務(wù)的運行將和文件相關(guān),所以TCB(任務(wù)控制塊)要做相應的修改。需要添加任務(wù)所在目錄項和任務(wù)打開(kāi)文件項。當一個(gè)任務(wù)調用OSTaskCreate創(chuàng )立新的任務(wù)的時(shí)候,子任務(wù)應該繼承先前任務(wù)的目錄項和任務(wù)打開(kāi)文件項。
        
五、 用戶(hù)Shell

        
用戶(hù)Shell實(shí)際上是一個(gè)在μC/OS下獨立運行的任務(wù),處于最低的優(yōu)先級。Shell啟動(dòng)后,進(jìn)入睡眼狀態(tài),等待用戶(hù)輸入。用戶(hù)從終端上輸入命令后將喚醒Shell,Shell首先檢測輸入命令是不是內部命令,如果不是,則在TCB中查詢(xún)當前所在文件目錄,然后在目錄中查詢(xún)是否有與輸入匹配的文件,如果有且文件屬性為可執行時(shí),則調用OSTaskCreate創(chuàng )立一個(gè)新的任務(wù)。由于Shell優(yōu)先級為最低,新創(chuàng )建的任務(wù)將馬上運行。新任務(wù)執行完后可以用OSTaskDel刪除自己。如果在當前目錄中找不到匹配項,則返回錯誤信息。
        
在本例中,Shell中包含的內部命令為cd(改變當前目錄),pwd(顯示當前工作目錄),mkdir,rmdir(創(chuàng )立刪除目錄),ps(顯示當前系統中的任務(wù)),kill(刪除任務(wù))。
        
由于μC/OS中的OSTaskCreate不能動(dòng)態(tài)分配堆?臻g,OSTaskDel也能釋放任務(wù)的堆?臻g。為了實(shí)現Shell的加載和刪除任務(wù)的功能,筆者對上述兩個(gè)函數進(jìn)行了改寫(xiě),添加了內存管理函數malloc()和mfree()。為了簡(jiǎn)間起見(jiàn),以8k為單位申請和釋放內存塊。系統的內存資源由一個(gè)雙向鏈表進(jìn)行管理。在OSTaskCreate中調用malloc(),參數為希望分配的內存塊數,malloc()將檢索內存管理的雙向鏈表,返回空閑塊地址。而OSTaskDel中將調用mfree()釋放內存,重新加入雙向鏈表。為了避免內存空洞,在Shell中啟動(dòng)的任務(wù)采用相同大小的堆棧。
        
通過(guò)用戶(hù)Shell,單獨的任務(wù)可以保存在RAM盤(pán)上,通過(guò)命令方式運行、監控,查看任務(wù)狀態(tài)、刪除任務(wù),作為一種有力的開(kāi)發(fā)和調試手段。
        
六、 結語(yǔ)

        
μC/OS的出現和應用也只是近年來(lái)的事,其迅猛的發(fā)展證明了開(kāi)放源碼軟件的巨大生命力。相信經(jīng)過(guò)廣大用戶(hù)的不斷豐富和完善,μC/OS的功能將日趨成熟,應用也會(huì )更加廣闊。
本文地址:http://selenalain.com/thread-39391-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)在線(xiàn)工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页