分析μC/OS的應(yīng)用及擴(kuò)展
出處:電子產(chǎn)品世界 發(fā)布于:2011-09-05 14:24:58
一、 概述
近年來(lái),隨著微控制器性能的不斷提高,嵌入式應(yīng)用越來(lái)越廣泛。目前源碼開(kāi)放(C代碼)的嵌入式系統(tǒng)有μC/OS的uCLinux。uC/OS是由EAN J.LABROSSE個(gè)人開(kāi)發(fā)的嵌入式操作系統(tǒng)。該系統(tǒng)是一個(gè)源代碼完全公開(kāi)的實(shí)時(shí)內(nèi)核,設(shè)計(jì)人員在應(yīng)用過(guò)程中可以按照自己的需求對(duì)內(nèi)核進(jìn)行裁減和擴(kuò)展,以滿足不同工程對(duì)應(yīng)用軟件設(shè)計(jì)的要求。uC/OS是完全占先式的實(shí)時(shí)內(nèi)核,支持多任務(wù)操作,并且每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧,這樣就清晰了任務(wù)之間的界限,增強(qiáng)了系統(tǒng)的穩(wěn)定性。uC/OS還提供了很多的系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的內(nèi)存的申請(qǐng)和釋放、時(shí)間函數(shù)等,并且還支持多達(dá)255層的中斷嵌套。利用這些系統(tǒng)服務(wù)就能輕而易舉的完成復(fù)雜邏輯的要求,從而縮短系統(tǒng)開(kāi)發(fā)的周期,降低開(kāi)發(fā)的成本。同時(shí)uC/OS良好的可擴(kuò)展性和可移植性,使其能夠廣泛的應(yīng)用到各種架構(gòu)的微處理器上。這里,筆者在ColdFire硬件平臺(tái)上運(yùn)行了μC/OS的,實(shí)現(xiàn)了uCLinux的文件系統(tǒng),使得在嵌入式應(yīng)用中可以進(jìn)行文件操作。
二、 硬件平臺(tái)
本系統(tǒng)的硬件平臺(tái)采用GPFC(General Purpose Fieldbus Controller)數(shù)據(jù)采集系統(tǒng)。該系統(tǒng)是由德國(guó)漢堡國(guó)家同步輻射實(shí)驗(yàn)實(shí)(DESY)Dr.Matthias Clausen領(lǐng)導(dǎo)的研究小組開(kāi)發(fā),采用Motorola公司的ColdFire MCF5206處理器為。ColdFire MCF5206處理器屬于Motorola 32位MCU家族,在源碼上與68K系列兼容。全靜態(tài)設(shè)計(jì),在33MHz的工作頻率下可達(dá)17MIPS的處理能力。除了具有68K系統(tǒng)的通用功能模塊外,片內(nèi)還帶有DRAM控制模塊,可以直接外接DRAM芯片。由于ColdFire將片選邏輯電路、總線控制器、DRAM控制模塊等全部集成在MCU內(nèi)部,使得外圍電路變得十分簡(jiǎn)單。
三、 軟件設(shè)計(jì)
本系統(tǒng)的軟件采用μC/OS為嵌入式平臺(tái)。在應(yīng)用中切實(shí)感到了開(kāi)放源代碼的無(wú)可替代的優(yōu)點(diǎn)。首先是可以根據(jù)自己的需要對(duì)源代碼進(jìn)行取舍,去掉不需要的變量和不使用的函數(shù),甚至可以根據(jù)需要改寫(xiě)相關(guān)函數(shù)。在μC/OS的源代碼中,函數(shù)執(zhí)行中有許多條件判斷,作用是防止參數(shù)的錯(cuò)誤傳遞。作為通用系統(tǒng),這些條件判斷是完全必要的,避免出現(xiàn)錯(cuò)誤時(shí)系統(tǒng)崩潰。但作為具體的應(yīng)用,只要在程序設(shè)計(jì)時(shí)保證參數(shù)傳遞的正確性,完全可以不用條件判斷,就能提高函數(shù)的執(zhí)行速度,尤其一些頻繁調(diào)用的函數(shù),或當(dāng)MCU速率不高的時(shí)候,重寫(xiě)部分函數(shù)往往可以顯著提高系統(tǒng)性能。另外,由于用戶對(duì)系統(tǒng)有源碼級(jí)的了解,可以添加自己編寫(xiě)的模塊,與原系統(tǒng)兼容,使系統(tǒng)具有可擴(kuò)展性。
正是由于μC/OS的可擴(kuò)展性,筆者將uCLinux的RAM盤(pán)、文件系統(tǒng)和用戶Shell移植到了μC/OS上,在用戶程序中可以進(jìn)行文件操作,文件系統(tǒng)可以為任務(wù)保存數(shù)據(jù),并提供了統(tǒng)一的接口函數(shù)。用戶編制的單個(gè)任務(wù)也可以保存在RAM盤(pán)上,可以在終端上用命令方式執(zhí)行運(yùn)行、監(jiān)控、刪除任務(wù)。
四、 文件系統(tǒng)
uCLinux的文件系統(tǒng)與Linux的基本相同,文件以樹(shù)型目錄組織。由于篇幅所限,關(guān)于文件系統(tǒng)的細(xì)節(jié),讀者可參考Linux和Unix的相關(guān)資料,本例中將RAM中高端的1M分配給文件系統(tǒng),建立了容量為1M的RAM盤(pán)。UCLinux的文件系統(tǒng)由邏輯塊組成,如果是磁盤(pán)文件系統(tǒng),對(duì)應(yīng)為磁盤(pán)塊;RAM盤(pán)則對(duì)應(yīng)為內(nèi)存塊,每個(gè)塊為512字節(jié)。一個(gè)標(biāo)準(zhǔn)的邏輯盤(pán)劃分成幾個(gè)部分:引導(dǎo)塊、超級(jí)塊、索引節(jié)點(diǎn)區(qū)和數(shù)據(jù)區(qū)。
| 引導(dǎo)塊 | 超級(jí)塊 | 索引節(jié)點(diǎn)區(qū) | 數(shù)據(jù)區(qū) |
引導(dǎo)塊 超級(jí)塊 索引節(jié)點(diǎn)區(qū) 數(shù)據(jù)區(qū)
引導(dǎo)塊在文件系統(tǒng)的開(kāi)頭,通常為一個(gè)邏輯塊、存放引導(dǎo)程序,用于啟動(dòng)和引導(dǎo)操作系統(tǒng)。在我們的RAM文件系統(tǒng)中由于不需要RAM盤(pán)引導(dǎo),所以不分配引導(dǎo)塊。超級(jí)塊記錄文件系統(tǒng)當(dāng)前狀態(tài),盤(pán)有多大,能存放多少文件,何處可以找到空閑空間和用于文件系統(tǒng)管理的信息。索引節(jié)點(diǎn)區(qū)緊接在超級(jí)塊后面,存放文件系統(tǒng)的索引節(jié)點(diǎn)表。在文件系統(tǒng)中每一個(gè)文件(包含目錄)占據(jù)一個(gè)索引節(jié)點(diǎn)表項(xiàng)。索引節(jié)點(diǎn)是一個(gè)記錄文件信息的數(shù)據(jù)結(jié)構(gòu):
struct dinode{
short di-mode;
/*文件模式:是文件還是目錄,是可讀、可寫(xiě)還是可執(zhí)行*/
short di-nlink;
/*和文件相關(guān)的鏈接數(shù)*/
short di-uid;
/*文件所有者的標(biāo)示*/
short di-gid;
/*文件所有者的組標(biāo)示*/
long di-size; /*文件大小*/
char di-addr[ ];
/*文件數(shù)據(jù)所在的邏輯塊編號(hào)*/
time-t di-atime;
/*文件訪問(wèn)的時(shí)間*/
time-t di-mtime;
/*文件修改的時(shí)間*/
time-t di-ctime;
/*文件建立的時(shí)間*/
}
其中的數(shù)組di-addr[ ]記錄文件數(shù)據(jù)所在的邏輯塊號(hào)。本例中RAM盤(pán)為1M,每個(gè)邏輯塊512字節(jié),共2048個(gè)邏輯塊,所以每個(gè)邏輯塊的編號(hào)要用兩個(gè)字節(jié)表示。為了記錄足夠長(zhǎng)的文件,di-addr[ ]中邏輯塊可分為直接塊和間接塊。關(guān)于直接塊和間接塊的概念,請(qǐng)讀者參考Linux的相關(guān)文檔。分析索引節(jié)點(diǎn)可知,通過(guò)索引節(jié)點(diǎn)就可以完全確定一個(gè)文件。索引節(jié)點(diǎn)表中的項(xiàng)就是根目錄。索引節(jié)點(diǎn)區(qū)的大小決定了文件系統(tǒng)中多能有多少個(gè)文件(包括目錄)。
添加了文件系統(tǒng)后,任務(wù)的運(yùn)行將和文件相關(guān),所以TCB(任務(wù)控制塊)要做相應(yīng)的修改。需要添加任務(wù)所在目錄項(xiàng)和任務(wù)打開(kāi)文件項(xiàng)。當(dāng)一個(gè)任務(wù)調(diào)用OSTaskCreate創(chuàng)立新的任務(wù)的時(shí)候,子任務(wù)應(yīng)該繼承先前任務(wù)的目錄項(xiàng)和任務(wù)打開(kāi)文件項(xiàng)。
五、 用戶Shell
用戶Shell實(shí)際上是一個(gè)在μC/OS下獨(dú)立運(yùn)行的任務(wù),處于的優(yōu)先級(jí)。Shell啟動(dòng)后,進(jìn)入睡眼狀態(tài),等待用戶輸入。由于Shell優(yōu)先級(jí)為,新創(chuàng)建的任務(wù)將馬上運(yùn)行。新任務(wù)執(zhí)行完后可以用OSTaskDel刪除自己。如果在當(dāng)前目錄中找不到匹配項(xiàng),則返回錯(cuò)誤信息。
由于μC/OS中的OSTaskCreate不能動(dòng)態(tài)分配堆棧空間,OSTaskDel也能釋放任務(wù)的堆棧空間。為了實(shí)現(xiàn)Shell的加載和刪除任務(wù)的功能,筆者對(duì)上述兩個(gè)函數(shù)進(jìn)行了改寫(xiě),添加了內(nèi)存管理函數(shù)malloc()和mfree()。系統(tǒng)的內(nèi)存資源由一個(gè)雙向鏈表進(jìn)行管理。在OSTaskCreate中調(diào)用malloc(),參數(shù)為希望分配的內(nèi)存塊數(shù),malloc()將檢索內(nèi)存管理的雙向鏈表,返回空閑塊地址。而OSTaskDel中將調(diào)用mfree()釋放內(nèi)存,重新加入雙向鏈表。為了避免內(nèi)存空洞,在Shell中啟動(dòng)的任務(wù)采用相同大小的堆棧。
通過(guò)用戶Shell,單獨(dú)的任務(wù)可以保存在RAM盤(pán)上,通過(guò)命令方式運(yùn)行、監(jiān)控,查看任務(wù)狀態(tài)、刪除任務(wù),作為一種有力的開(kāi)發(fā)和調(diào)試手段。
六、 結(jié)語(yǔ)
μC/OS的出現(xiàn)和應(yīng)用也只是近年來(lái)的事,其迅猛的發(fā)展證明了開(kāi)放源碼軟件的巨大生命力。相信經(jīng)過(guò)廣大用戶的不斷豐富和完善,μC/OS的功能將日趨成熟,應(yīng)用也會(huì)更加廣闊。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開(kāi)發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開(kāi)啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04
- 編碼器的工作原理及作用1
- 超強(qiáng)整理!PCB設(shè)計(jì)之電流與線寬的關(guān)系2
- 三星(SAMSUNG)貼片電容規(guī)格對(duì)照表3
- 電腦藍(lán)屏代碼大全4
- 國(guó)標(biāo)委發(fā)布《電動(dòng)汽車(chē)安全要求第3部分:人員觸電防護(hù)》第1號(hào)修改單5
- 通俗易懂談上拉電阻與下拉電阻6
- 繼電器的工作原理以及驅(qū)動(dòng)電路7
- 電容單位8
- 跟我學(xué)51單片機(jī)(三):?jiǎn)纹瑱C(jī)串口通信實(shí)例9
- 一種三極管開(kāi)關(guān)電路設(shè)計(jì)10









