μCOS-II在ATmega128單片機(jī)上的移植與開發(fā)
引 言
本文介紹μC/OS-Ⅱ移植到ATMEL公司的8位微控制器ATmega128上的過程。所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核可以在某個(gè)微處理器上運(yùn)行,并在此基礎(chǔ)上進(jìn)行驅(qū)動(dòng)程序開發(fā),使之成為一個(gè)實(shí)用的嵌入式系統(tǒng)。嵌入式系統(tǒng)包括了硬件和軟件兩部分,由于系統(tǒng)硬件資源的限制和實(shí)際應(yīng)用的要求,應(yīng)用系統(tǒng)對(duì)軟件的基本要求是體積小,執(zhí)行速度快,具有較好的裁減性和可移植性。
嵌入式系統(tǒng)的軟件一般由嵌入式操作系統(tǒng)和應(yīng)用軟件組成,通過在操作系統(tǒng)之上開發(fā)應(yīng)用軟件,可以屏蔽掉很多底層硬件細(xì)節(jié),使得應(yīng)用程序調(diào)試方便,移植簡(jiǎn)單,易維護(hù),同時(shí)開發(fā)周期也短。多數(shù)實(shí)時(shí)操作系統(tǒng)為用戶提供一些標(biāo)準(zhǔn)的API函數(shù),程序開發(fā)人員可以利用這些API函數(shù)進(jìn)行應(yīng)用程序開發(fā)。但是現(xiàn)在商用型的實(shí)時(shí)操作系統(tǒng)價(jià)格非常昂貴,而免費(fèi)型的實(shí)時(shí)操作系統(tǒng)μCOS-II作為一個(gè)源代碼公開的實(shí)時(shí)內(nèi)核已經(jīng)有了10余年使用實(shí)踐,許多行業(yè)都有成功應(yīng)用該內(nèi)核的實(shí)例。但由于μCOS-II只是一個(gè)實(shí)時(shí)內(nèi)核,它沒有像商用型實(shí)時(shí)操作系統(tǒng)那樣提供API函數(shù)接口,有很多工作需要用戶去完成,還需要根據(jù)實(shí)際應(yīng)用需要進(jìn)行功能擴(kuò)展,包
μC/OS-II嵌入式實(shí)時(shí)操作系統(tǒng)簡(jiǎn)介
μC/OS-II是著名的、源碼公開的實(shí)時(shí)內(nèi)核,可用于各類8位、16 位、32位單片機(jī)或DSP。μC/OS-II是一個(gè)完整、可移植、可固化、可裁減的占先式實(shí)時(shí)多任務(wù)內(nèi)核。它用ANSIC語言編寫,包含小部分與硬件有關(guān)的匯編代碼,使之便于移植,可以在不同架構(gòu)的微處理器上使用。到目前為止,該內(nèi)核已有10多年的應(yīng)用史,在醫(yī)療、網(wǎng)絡(luò)、通信等許多領(lǐng)域得到了廣泛應(yīng)用。μC/OS-II內(nèi)核可以分為幾個(gè)獨(dú)立的部分,分別是任務(wù)管理、時(shí)間管理、任務(wù)間通信、內(nèi)存管理幾個(gè)獨(dú)立的部分,他的許多功能都是可配置的,這樣可以根據(jù)應(yīng)用的需要對(duì)操作系統(tǒng)進(jìn)行裁減。μC/OS-II是占先式實(shí)時(shí)內(nèi)核,他總是運(yùn)行在就緒條件下優(yōu)先級(jí)最高的任務(wù),μC/OS-II總共可以管理64個(gè)任務(wù),賦予每個(gè)任務(wù)的優(yōu)先級(jí)必須是不同的,每個(gè)任務(wù)都有自己獨(dú)立的堆棧,可以壓低用戶程序?qū)?nèi)存的需求。全部μC/OS-II的函數(shù)調(diào)用與服務(wù)執(zhí)行時(shí)間具有可確定性,它的系統(tǒng)服務(wù)的執(zhí)行時(shí)間不依賴于應(yīng)用程序任務(wù)的多少。μC/OS-II中的任務(wù)可以是一個(gè)無限的循環(huán),也可以在執(zhí)行完一次后被刪除掉,任務(wù)在休眠、就緒、運(yùn)行、等待和掛起等幾個(gè)狀態(tài)之間進(jìn)行轉(zhuǎn)換。μC/OS-II要求用戶提供定時(shí)中斷來實(shí)現(xiàn)延時(shí)和超時(shí)控制等功能,這個(gè)定時(shí)中斷稱為時(shí)鐘節(jié)拍,他的實(shí)際頻率由用戶的應(yīng)用程序決定,一般為10~100Hz 。節(jié)拍頻率越高,系統(tǒng)的負(fù)荷越重。μC/OS-II中有三種用于數(shù)據(jù)共享和任務(wù)通信的方法:信號(hào)量、郵箱和消息隊(duì)列。一個(gè)任務(wù)或者中斷服務(wù)子程序可以通過事件控制塊向另外的任務(wù)發(fā)信號(hào);一個(gè)任務(wù)可以等待另一個(gè)任務(wù)或中斷服務(wù)子程序給它發(fā)送信號(hào);或者是多個(gè)任務(wù)等待同一個(gè)信號(hào)的發(fā)生,在這種情況下,優(yōu)先級(jí)最高的任務(wù)將得到這一信號(hào)并進(jìn)入就緒狀態(tài)準(zhǔn)備執(zhí)行。
ATmega128微處理器的硬件特點(diǎn)
ATmega128的MCU包括一個(gè)算術(shù)邏輯單元(ALU) ,一個(gè)狀態(tài)寄存器(SREG) ,一個(gè)通用工作寄存器組和一個(gè)堆棧指針。狀態(tài)寄存器(SREG) 的最高位I是全局中斷允許位。如果全局中斷允許位為零,則所有中斷都被禁止。當(dāng)系統(tǒng)響應(yīng)一個(gè)中斷后,I位將由硬件自動(dòng)清“0”;當(dāng)執(zhí)行中斷返回(RETI) 指令時(shí),I位由硬件自動(dòng)置“1”,從而允許系統(tǒng)再次響應(yīng)下一個(gè)中斷請(qǐng)求。通用工作寄存器組是由32個(gè)8位的通用工作寄存器組成。其中R26~R31這6 個(gè)寄存器還可以兩兩合并為3 個(gè)16位的間接地址寄存器,這些寄存器可以用來對(duì)數(shù)據(jù)存儲(chǔ)空間和程序存儲(chǔ)空間進(jìn)行間接尋址的寄存器。堆棧指針(SP) 是一個(gè)指示堆棧頂部地址的16 位寄存器。ATmega128單片機(jī)的硬件堆棧的生長(zhǎng)方向是向下的(從高地址向低地址生長(zhǎng)) ,所以軟件堆棧在定義的時(shí)候,也要采取相同的生長(zhǎng)方向。ATmega128單片機(jī)的數(shù)據(jù)存儲(chǔ)器是線形的,從低地址到高地址依次是CPU寄存器區(qū)(32個(gè)通用寄存器) ,I/O寄存器區(qū),數(shù)據(jù)存儲(chǔ)區(qū)。
ATmega128的中斷響應(yīng)機(jī)制
ATmega128有34個(gè)不同的中斷源,每個(gè)中斷源和系統(tǒng)復(fù)位在程序存儲(chǔ)空間都有一個(gè)獨(dú)立的中斷向量(中斷入口地址) 。每個(gè)中斷源都有各自獨(dú)立的中斷允許控制位,當(dāng)某個(gè)中斷源的中斷允許控制位為“1”且全局中斷允許位I也為“1”時(shí),系統(tǒng)才響應(yīng)該中斷。當(dāng)系統(tǒng)響應(yīng)一個(gè)中斷請(qǐng)求后,會(huì)自動(dòng)將全局中斷允許位I清零,此時(shí),后續(xù)中斷響應(yīng)被屏蔽。當(dāng)系統(tǒng)執(zhí)行中斷返回指令RETI時(shí),會(huì)將全局中斷允許位I置“1”,以允許響應(yīng)下一個(gè)中斷。若用戶想實(shí)現(xiàn)中斷嵌套,必須在中斷服務(wù)子程序中將全局中斷允許位I置“1”。在中斷向量表中,處于低地址的中斷具有高的優(yōu)先級(jí)。優(yōu)先級(jí)高只是表明在多個(gè)中斷同時(shí)發(fā)生的時(shí)候,系統(tǒng)先響應(yīng)優(yōu)先級(jí)高的中斷,并不含有高優(yōu)先級(jí)的中斷能打斷低優(yōu)先級(jí)的中斷處理工作的意思。由于μC/OS-Ⅱ的任務(wù)切換實(shí)際上是模擬一次中斷,因此需要知道CPU的中斷響應(yīng)機(jī)制。中斷發(fā)生時(shí),ATmega128按以下步驟順序執(zhí)行:
(1) 全局中斷允許位I清零。
(2) 將指向下一條指令的PC值壓入堆棧,同時(shí)堆棧指針SP減2。
(3) 選擇最高優(yōu)先級(jí)的中斷向量裝入PC,程序從此地址繼續(xù)執(zhí)行中斷處理。
(4) 當(dāng)執(zhí)行中斷處理時(shí),中斷源的中斷允許控制位清零。中斷結(jié)束后,執(zhí)行RETI指令,此時(shí):
?、偃种袛嘣试S位I置“1”。
?、?PC從堆棧推出,程序從被中斷的地方繼續(xù)執(zhí)行。特別要注意的是:ATmega128A單片機(jī)在響應(yīng)中斷及從中斷返回時(shí),并不會(huì)對(duì)狀態(tài)寄存器SREG 和通用寄存器自動(dòng)進(jìn)行保存和恢復(fù)操作,因此,對(duì)狀態(tài)寄存器SREG 和通用寄存器的中斷保護(hù)工作必須由用戶來完成。
評(píng)論