μCOS-II在ATmega128單片機(jī)上的移植與開發(fā)
ATmega128的定時(shí)器中斷
移植就是使一個(gè)實(shí)時(shí)內(nèi)核能在ATmega128上運(yùn)行。μCOS-II大部分的代碼是用ANSIC編寫的,因此移植性很好。但是對(duì)不同的微處理器,仍然需要使用C和匯編語言來編寫其中與處理器相關(guān)的代碼,寄存器的讀、寫只能通過匯編語言的存儲(chǔ)和加載指令來實(shí)現(xiàn)。要使μCOS-II能夠正常工作,處理器必須滿足以下要求:
?、偬幚砥鞯腃編譯器能產(chǎn)生可重入代碼;可重入代碼是指可以被一個(gè)以上的任務(wù)調(diào)用,而不必?fù)?dān)心其數(shù)據(jù)會(huì)被破壞的代碼。可重入代碼任何時(shí)候都可以被中斷,一段時(shí)間以后又可以重新運(yùn)行,而相應(yīng)的數(shù)據(jù)不會(huì)丟失,不可重入代碼則不行。本文所使用ImageCrafT公司的ICCAVRV6. 30編譯器能產(chǎn)生可重入代碼;
?、谟肅語言可以打開和關(guān)閉中斷,本文所使用的ICCAVRV6. 30編譯器支持在C語言中內(nèi)嵌匯編語句且提供專門開關(guān)中斷的宏:CLI() 和SEI() 。這樣,使得在C語言中開關(guān)中斷非常方便;
③處理器支持中斷,并且能夠產(chǎn)生定時(shí)中斷(通常在10-100Hz 之間) ,ATmega128,有3 個(gè)定時(shí)器,能產(chǎn)生μC/OS-Ⅱ所需的定時(shí)中斷;
?、?處理器能夠支持容納一定數(shù)量的硬件堆棧,ATmega128有4KRAM,硬件堆??梢蚤_辟在這4KRAM中;
?、萏幚砥饔袑⒍褩V羔樅推渌拇嫫髯x取和存儲(chǔ)到堆?;騼?nèi)存的指令,一般的單片機(jī)都滿足這個(gè)要求(如PUSH、POP指令) ,且ATmega128還具有直接訪問I/O寄存器的指令( IN、OUT等) 。
移植的實(shí)現(xiàn)μC/OS-Ⅱ的移植工作包括以下幾個(gè)內(nèi)容:
(1) 用Typedef聲明與編譯器相關(guān)的數(shù)據(jù)類型(在OS-CPU. H文件中) ,由于不同的微處理器有不同的字長(zhǎng),在μC/OS-Ⅱ代碼中不能使用C語言的shORT、inT、lOng 等數(shù)據(jù)類型,而采用INT8U、INT16U、INT32U等直觀又可移植的數(shù)據(jù)類型來代換相應(yīng)數(shù)據(jù)類型。
(2) 用# definE設(shè)置一個(gè)常量OS-STK-GROWTH的值(OS-CPU. H) ,決定堆棧的生長(zhǎng)方向,置0表示堆棧從下往上生長(zhǎng),置1表示堆棧從上往下生長(zhǎng)。
(3) # definE聲明三個(gè)宏(OS-CPU. H) 。即進(jìn)入臨界代碼段(criTicaLcOdEsecTiOn) 的方法OS-CRITICAL-METHOD定義為3 ,在宏OS-ENTER-CRITICAL() 中得到當(dāng)前處理器狀態(tài)字的值,并將其保存在C函數(shù)的局部變量中,這個(gè)變量在宏OS-EXIT-CRITICAL( ) 中用于恢復(fù)PSW。宏OS-TASK-SW() 是在內(nèi)核從低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)時(shí)用到的,它總是在任務(wù)級(jí)代碼中被調(diào)用。在ATMEGA128上移植,直接調(diào)用OSCTxSw () 任務(wù)切換函數(shù)就可以了。
(4) 用C語言編寫十個(gè)簡(jiǎn)單的函數(shù)(OS-CPU-C. C) ,OS2TAskSTKIniT() ;OSIniTHoOkBegiN() ;OSIniTHoOKEnd () ; OSTAskCreaTeHoOK( ) ;OSTAskDelHoOK( ) ;OSTAskSw HoOK();OSTAskSTaTHoOK() ;OSTimETickHoOk () ;OSTCB IniTHoOK() ;OSTAsKIdleHoOK() ;實(shí)際需要修改的只有OSTAskSTKIniT() 函數(shù),其它九個(gè)函數(shù)都是由用戶定義的。如果用戶需要使用這九個(gè)函數(shù),可將文件OS-CFG. H中的# definEcOnsTAnTOS-CPU-HOOKS-EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)。函數(shù)OSTAskSTKIniT( ) 是由OSTAskCreaTE() 或OSTAskCreaTEExT() 調(diào)用,用來初始化任務(wù)堆棧的。經(jīng)初始化后的任務(wù)堆棧應(yīng)該跟發(fā)生過一次中斷后任務(wù)的堆棧結(jié)構(gòu)一樣。由前敘述可知,ATmega128在發(fā)生中斷后,自動(dòng)保存了程序計(jì)數(shù)器PC。為了保存全部現(xiàn)場(chǎng),還需要保存狀態(tài)寄存器SREG ,R0~R31這32個(gè)通用寄存器及SP的值。
(5) 編寫四個(gè)匯編語言函數(shù)(OS-CPU-A. S) ,OSSTARTHighRdy () 使就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的任務(wù)開始運(yùn)行;OSCTxSw () 完成將處理器的寄存器保存到堆棧中的任務(wù)后,將任務(wù)指針指向要恢復(fù)運(yùn)行的任務(wù)
硬件驅(qū)動(dòng)程序的編寫
μCOS-II移植完成以后,就要在實(shí)時(shí)內(nèi)核之上編寫外設(shè)驅(qū)動(dòng)程序。外設(shè)驅(qū)動(dòng)程序可以提供訪問外圍設(shè)備的接口,把操作系統(tǒng)和外圍設(shè)備硬件分離開來,當(dāng)外設(shè)改變時(shí),只需修改設(shè)備驅(qū)動(dòng)程序,不影響操作系統(tǒng)內(nèi)核。外設(shè)驅(qū)動(dòng)程序主要完成以下功能:
(1) 對(duì)設(shè)備初始化和釋放;
(2) 把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);
(3) 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);
(4) 檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。對(duì)于擴(kuò)展相應(yīng)的API函數(shù),不同的應(yīng)用有不同的要求,可以根據(jù)硬件結(jié)構(gòu)和實(shí)際應(yīng)用,編寫操作系統(tǒng)的API函數(shù)。
基于μCOS-II進(jìn)行擴(kuò)展的RTOS的總體結(jié)構(gòu)。在內(nèi)核上開發(fā)應(yīng)用,在把內(nèi)核移植到自己的硬件目標(biāo)板上后,在實(shí)時(shí)內(nèi)核的基礎(chǔ)上寫出相應(yīng)的驅(qū)動(dòng)程序、內(nèi)存操作等API函數(shù),建立實(shí)時(shí)操作系統(tǒng),最后利用這些API函數(shù)編寫用戶自己的應(yīng)用程序,就構(gòu)成了嵌入式系統(tǒng)軟件。而應(yīng)用程序處于整個(gè)系統(tǒng)的頂層,根據(jù)具體應(yīng)用要求,其功能有多個(gè)任務(wù)完成,每個(gè)任務(wù)可以調(diào)用API函數(shù),也可以調(diào)用與處理器無關(guān)的代碼提供的系統(tǒng)服務(wù)。
總 結(jié)
采用μCOS-II內(nèi)核開發(fā)的RTOS具有良好的實(shí)時(shí)性,可裁剪性,應(yīng)用它可以使產(chǎn)品更可靠,功能更強(qiáng)大,開發(fā)周期更短。該系統(tǒng)目前已在我院開發(fā)的護(hù)理用體態(tài)語言機(jī)上成功應(yīng)用。
評(píng)論