一、 概述
近年來,隨著微控制器性能的不斷提高,嵌入式應用越來越廣泛。目前市場上的大型商用嵌入式實時系統,如vertex,vxwork,psos等等,已經十分成熟,并為用戶提供了強有力的開發和調試工具。但商用嵌入式實時系統價格昂貴,而且都針對特定的硬件平臺。對于國內中小型系統的開發,購買商用實時系統并不劃算。
此時,采用免費軟件和開放代碼不失為一種選擇。目前源碼開放(c代碼)的嵌入式系統有μc/os的uclinux。μc/os簡單易學,提供了嵌入式系統的基本功能,其核心代碼短小精悍,如果針對硬件進行優化,還可以獲得更高的執行效率。但是μc/os相對商用嵌入式系統來說還是過于簡單,而且存在開發調試困難的問題。
uclinux是免費軟件運動的產物,包含豐富的功能,包括文件系統、各種外調驅動程序、通訊模塊、tcp/ip、ppp、http,甚至web服務器的代碼。在internet上流傳的uclinux已經被移植到當前幾乎所有的硬件平臺上,功能與pc機上運行的linux不相上下,其代碼也十分復雜。完全移植沒有必要也十分困難,但uclinux的代碼經過世界范圍內的優化,穩定可*而且高效,所有模塊的代碼都可以從internet上獲得,可以進行模塊移植。在本例應用中,筆者在coldfire硬件平臺上運行了μc/os的核心,并實現了uclinux的文件系統,使得在嵌入式應用中可以進行文件操作。同時針對μc/os調試困難的問題。還移植了uclinux的用戶shell,使得用戶可以用命令行方式進行程序的調試和開發。
二、 硬件平臺
本系統的硬件平臺采用gpfc(general purpose fieldbus controller)數據采集系統。該系統是由德國漢堡國家同步輻射實驗實(desy)dr.matthias clausen領導的研究小組開發,采用motorola公司的coldfire mcf5206處理器為核心。coldfire mcf5206處理器屬于motorola 32位mcu家族,在源碼上與68k系列兼容。全靜態設計,在33mhz的工作頻率下可達17mips的處理能力。除了具有68k系統的通用功能模塊外,片內還帶有dram控制模塊,可以直接外接dram芯片。由于coldfire將片選邏輯電路、總線控制器、dram控制模塊等全部集成在mcu內部,使得外圍電路變得十分簡單。
在筆者所用的gpfc系統中,coldfire工作在32mhz,外圍電路包括兩片deam芯片,共計4m的ram,一片128k的flash,用于存放引導程序。其余為i/o電路。系統通過rs-232串口與pc機相連。
三、 軟件設計
本系統的軟件采用μc/os為嵌入式平臺。在應用中切實感到了開放源代碼的無可替代的優點。首先是可以根據自己的需要對源代碼進行取舍,去掉不需要的變量和不使用的函數,甚至可以根據需要改寫相關函數。在μc/os的源代碼中,函數執行中有許多條件判斷,作用是防止參數的錯誤傳遞。例如,與信號量有關的函數在執行前都會檢查一下傳遞給函數的指針是不是一個有效的信號量指針。作為通用系統,這些條件判斷是完全必要的,避免出現錯誤時系統崩潰。但作為具體的應用,只要在程序設計時保證參數傳遞的正確性,完全可以不用條件判斷,就能提高函數的執行速度,尤其一些頻繁調用的函數,或當mcu速率不高的時候,重寫部分函數往往可以顯著提高系統性能。另外,由于用戶對系統有源碼級的了解,可以添加自己編寫的模塊,與原系統兼容,使系統具有可擴展性。
正是由于μc/os的可擴展性,筆者將uclinux的ram盤、文件系統和用戶shell移植到了μc/os上,在用戶程序中可以進行文件操作,文件系統可以為任務保存數據,并提供了統一的接口函數。用戶編制的單個任務也可以保存在ram盤上,可以在終端上用命令方式執行運行、監控、刪除任務。
四、 文件系統
uclinux的文件系統與linux的基本相同,文件以樹型目錄組織。由于篇幅所限,關于文件系統的細節,讀者可參考linux和unix的相關資料,本例中將ram中高端的1m分配給文件系統,建立了容量為1m的ram盤。uclinux的文件系統由邏輯塊組成,如果是磁盤文件系統,對應為磁盤塊;ram盤則對應為內存塊,每個塊為512字節。一個標準的邏輯盤劃分成幾個部分:引導塊、超級塊、索引節點區和數據區。
引導塊在文件系統的開頭,通常為一個邏輯塊、存放引導程序,用于啟動和引導操作系統。在我們的ram文件系統中由于不需要ram盤引導,所以不分配引導塊。超級塊記錄文件系統當前狀態,盤有多大,能存放多少文件,何處可以找到空閑空間和用于文件系統管理的信息。索引節點區緊接在超級塊后面,存放文件系統的索引節點表。在文件系統中每一個文件(包含目錄)占據一個索引節點表項。索引節點是一個記錄文件信息的數據結構:
struct dinode{
short di-mode;
/*文件模式:是文件還是目錄,是可讀、可寫還是可執行*/
short di-nlink;
/*和文件相關的鏈接數*/
short di-uid;
/*文件所有者的標示*/
short di-gid;
/*文件所有者的組標示*/
long di-size; /*文件大小*/
char di-addr[ ];
/*文件數據所在的邏輯塊編號*/
time-t di-atime;
/*文件一次訪問的時間*/
time-t di-mtime;
/*文件一次修改的時間*/
time-t di-ctime;
/*文件建立的時間*/
}
其中的數組di-addr[ ]記錄文件數據所在的邏輯塊號。本例中ram盤為1m,每個邏輯塊512字節,共2048個邏輯塊,所以每個邏輯塊的編號要用兩個字節表示。為了記錄足夠長的文件,di-addr[ ]中邏輯塊可分為直接塊和間接塊。關于直接塊和間接塊的概念,請讀者參考linux的相關文檔。分析索引節點可知,通過索引節點就可以完全確定一個文件。索引節點表中的項就是根目錄。索引節點區的大小決定了文件系統中多能有多少個文件(包括目錄)。在本例中,筆者設定為128項。在索引節點區后就是數據區,數據區以邏輯塊為單位按次序編號。如果要訪問某個文件,只要找到該文件對應的索引節點表項,從di-addr[ ]項中就可以查出文件數據所在的邏輯塊。文件的訪問需要通過fread()或fwrite()函數,其細節不再復述。
添加了文件系統后,任務的運行將和文件相關,所以tcb(任務控制塊)要做相應的修改。需要添加任務所在目錄項和任務打開文件項。當一個任務調用ostaskcreate創立新的任務的時候,子任務應該繼承先前任務的目錄項和任務打開文件項。
五、 用戶shell
用戶shell實際上是一個在μc/os下獨立運行的任務,處于的優先級。shell啟動后,進入睡眼狀態,等待用戶輸入。用戶從終端上輸入命令后將喚醒shell,shell首先檢測輸入命令是不是內部命令,如果不是,則在tcb中查詢當前所在文件目錄,然后在目錄中查詢是否有與輸入匹配的文件,如果有且文件屬性為可執行時,則調用ostaskcreate創立一個新的任務。由于shell優先級為,新創建的任務將馬上運行。新任務執行完后可以用ostaskdel刪除自己。如果在當前目錄中找不到匹配項,則返回錯誤信息。
在本例中,shell中包含的內部命令為cd(改變當前目錄),pwd(顯示當前工作目錄),mkdir,rmdir(創立刪除目錄),ps(顯示當前系統中的任務),kill(刪除任務)。
由于μc/os中的ostaskcreate不能動態分配堆??臻g,ostaskdel也能釋放任務的堆??臻g。為了實現shell的加載和刪除任務的功能,筆者對上述兩個函數進行了改寫,添加了內存管理函數malloc()和mfree()。為了簡間起見,以8k為單位申請和釋放內存塊。系統的內存資源由一個雙向鏈表進行管理。在ostaskcreate中調用malloc(),參數為希望分配的內存塊數,malloc()將檢索內存管理的雙向鏈表,返回空閑塊地址。而ostaskdel中將調用mfree()釋放內存,重新加入雙向鏈表。為了避免內存空洞,在shell中啟動的任務采用相同大小的堆棧。
通過用戶shell,單獨的任務可以保存在ram盤上,通過命令方式運行、監控,查看任務狀態、刪除任務,作為一種有力的開發和調試手段。
六、 結語
μc/os的出現和應用也只是近年來的事,其迅猛的發展證明了開放源碼軟件的巨大生命力。相信經過廣大用戶的不斷豐富和完善,μc/os的功能將日趨成熟,應用也會更加廣闊。
μC/OS的應用和擴展
更新時間: 2007-06-28 10:54:22來源: 粵嵌教育瀏覽量:918
免費預約試聽課
- 姓名
- 電話
- 獲取試聽資格
推薦閱讀
- ·粵嵌科技獲批特級技師/首席技師認定資質,物聯網技能人才培養再添權威背書?。?/a>
- ·代碼空間優化技巧(如使用查表法替代復雜計算)?
- ·如何減少中斷延遲?
- ·深化校企合作,共譜產教融合新篇章 —— 廣州航海學院與粵嵌科技開展校企交流活動
- ·校企聯動促實踐!湖北工程學院 300 + 學子開啟企業級實訓之旅??!
- ·粵嵌科技31項命題入選中國國際大學生創新大賽(2025)產業賽道,誠邀高校團隊共創未來!
- ·在資源受限(如內存不足)的設備中如何實現功能擴展?
- ·廣東賽鉑安智能科技有限公司專場招聘會
- ·設計一個低功耗傳感器采集系統,需考慮哪些因素?
- ·校企聯動促實踐!湖北工程學院 300 + 學子開啟企業級實訓之旅??!