<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > μC/OS-II在A(yíng)Tmega128單片機上的移植與開(kāi)發(fā)

μC/OS-II在A(yíng)Tmega128單片機上的移植與開(kāi)發(fā)

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

本文首先介紹了實(shí)時(shí)內核μCOS-II和微處理器ATmega128的特點(diǎn),論述了在此基礎上進(jìn)行移植,編寫(xiě)API函數,建立自己的RTOS,和用這些API函數建立嵌入式應用系統的方法和步驟。最后總結了運用這一嵌入式應用系統開(kāi)發(fā)便攜式醫療設備的優(yōu)點(diǎn)。

本文引用地址:http://dyxdggzs.com/article/201610/305930.htm

引 言

本文介紹μC/OS-Ⅱ移植到ATMEL公司的8位微控制器ATmega128上的過(guò)程。所謂移植,就是使一個(gè)實(shí)時(shí)內核可以在某個(gè)微處理器上運行,并在此基礎上進(jìn)行驅動(dòng)程序開(kāi)發(fā),使之成為一個(gè)實(shí)用的嵌入式系統。嵌入式系統包括了硬件和軟件兩部分,由于系統硬件資源的限制和實(shí)際應用的要求,應用系統對軟件的基本要求是體積小,執行速度快,具有較好的裁減性和可移植性。

嵌入式系統的軟件一般由嵌入式操作系統和應用軟件組成,通過(guò)在操作系統之上開(kāi)發(fā)應用軟件,可以屏蔽掉很多底層硬件細節,使得應用程序調試方便,移植簡(jiǎn)單,易維護,同時(shí)開(kāi)發(fā)周期也短。多數實(shí)時(shí)操作系統為用戶(hù)提供一些標準的API函數,程序開(kāi)發(fā)人員可以利用這些API函數進(jìn)行應用程序開(kāi)發(fā)。但是現在商用型的實(shí)時(shí)操作系統價(jià)格非常昂貴,而免費型的實(shí)時(shí)操作系統μCOS-II作為一個(gè)源代碼公開(kāi)的實(shí)時(shí)內核已經(jīng)有了10余年使用實(shí)踐,許多行業(yè)都有成功應用該內核的實(shí)例。但由于μCOS-II只是一個(gè)實(shí)時(shí)內核,它沒(méi)有像商用型實(shí)時(shí)操作系統那樣提供API函數接口,有很多工作需要用戶(hù)去完成,還需要根據實(shí)際應用需要進(jìn)行功能擴展,包括底層的硬件驅動(dòng)、文件系統、用戶(hù)圖形接口等程序的編寫(xiě)。

μC/OS-II嵌入式實(shí)時(shí)操作系統簡(jiǎn)介

μC/OS-II是著(zhù)名的、源碼公開(kāi)的實(shí)時(shí)內核,可用于各類(lèi)8位、16 位、32位單片機或DSP。μC/OS-II是一個(gè)完整、可移植、可固化、可裁減的占先式實(shí)時(shí)多任務(wù)內核。它用ANSIC語(yǔ)言編寫(xiě),包含小部分與硬件有關(guān)的匯編代碼,使之便于移植,可以在不同架構的微處理器上使用。到目前為止,該內核已有10多年的應用史,在醫療、網(wǎng)絡(luò )、通信等許多領(lǐng)域得到了廣泛應用。μC/OS-II內核可以分為幾個(gè)獨立的部分,分別是任務(wù)管理、時(shí)間管理、任務(wù)間通信、內存管理幾個(gè)獨立的部分,他的許多功能都是可配置的,這樣可以根據應用的需要對操作系統進(jìn)行裁減。μC/OS-II是占先式實(shí)時(shí)內核,他總是運行在就緒條件下優(yōu)先級最高的任務(wù),μC/OS-II總共可以管理64個(gè)任務(wù),賦予每個(gè)任務(wù)的優(yōu)先級必須是不同的,每個(gè)任務(wù)都有自己獨立的堆棧,可以壓低用戶(hù)程序對內存的需求。全部μC/OS-II的函數調用與服務(wù)執行時(shí)間具有可確定性,它的系統服務(wù)的執行時(shí)間不依賴(lài)于應用程序任務(wù)的多少。μC/OS-II中的任務(wù)可以是一個(gè)無(wú)限的循環(huán),也可以在執行完一次后被刪除掉,任務(wù)在休眠、就緒、運行、等待和掛起等幾個(gè)狀態(tài)之間進(jìn)行轉換。μC/OS-II要求用戶(hù)提供定時(shí)中斷來(lái)實(shí)現延時(shí)和超時(shí)控制等功能,這個(gè)定時(shí)中斷稱(chēng)為時(shí)鐘節拍,他的實(shí)際頻率由用戶(hù)的應用程序決定,一般為10~100Hz 。節拍頻率越高,系統的負荷越重。μC/OS-II中有三種用于數據共享和任務(wù)通信的方法:信號量、郵箱和消息隊列。一個(gè)任務(wù)或者中斷服務(wù)子程序可以通過(guò)事件控制塊向另外的任務(wù)發(fā)信號;一個(gè)任務(wù)可以等待另一個(gè)任務(wù)或中斷服務(wù)子程序給它發(fā)送信號;或者是多個(gè)任務(wù)等待同一個(gè)信號的發(fā)生,在這種情況下,優(yōu)先級最高的任務(wù)將得到這一信號并進(jìn)入就緒狀態(tài)準備執行。

ATmega128微處理器的硬件特點(diǎn)

ATmega128的MCU包括一個(gè)算術(shù)邏輯單元(ALU) ,一個(gè)狀態(tài)寄存器(SREG) ,一個(gè)通用工作寄存器組和一個(gè)堆棧指針。狀態(tài)寄存器(SREG) 的最高位I是全局中斷允許位。如果全局中斷允許位為零,則所有中斷都被禁止。當系統響應一個(gè)中斷后,I位將由硬件自動(dòng)清“0”;當執行中斷返回(RETI) 指令時(shí),I位由硬件自動(dòng)置“1”,從而允許系統再次響應下一個(gè)中斷請求。通用工作寄存器組是由32個(gè)8位的通用工作寄存器組成。其中R26~R31這6 個(gè)寄存器還可以?xún)蓛珊喜? 個(gè)16位的間接地址寄存器,這些寄存器可以用來(lái)對數據存儲空間和程序存儲空間進(jìn)行間接尋址的寄存器。堆棧指針(SP) 是一個(gè)指示堆棧頂部地址的16 位寄存器。ATmega128單片機的硬件堆棧的生長(cháng)方向是向下的(從高地址向低地址生長(cháng)) ,所以軟件堆棧在定義的時(shí)候,也要采取相同的生長(cháng)方向。ATmega128單片機的數據存儲器是線(xiàn)形的,從低地址到高地址依次是CPU寄存器區(32個(gè)通用寄存器) ,I/O寄存器區,數據存儲區。

ATmega128的中斷響應機制

ATmega128有34個(gè)不同的中斷源,每個(gè)中斷源和系統復位在程序存儲空間都有一個(gè)獨立的中斷向量(中斷入口地址) 。每個(gè)中斷源都有各自獨立的中斷允許控制位,當某個(gè)中斷源的中斷允許控制位為“1”且全局中斷允許位I也為“1”時(shí),系統才響應該中斷。當系統響應一個(gè)中斷請求后,會(huì )自動(dòng)將全局中斷允許位I清零,此時(shí),后續中斷響應被屏蔽。當系統執行中斷返回指令RETI時(shí),會(huì )將全局中斷允許位I置“1”,以允許響應下一個(gè)中斷。若用戶(hù)想實(shí)現中斷嵌套,必須在中斷服務(wù)子程序中將全局中斷允許位I置“1”。在中斷向量表中,處于低地址的中斷具有高的優(yōu)先級。優(yōu)先級高只是表明在多個(gè)中斷同時(shí)發(fā)生的時(shí)候,系統先響應優(yōu)先級高的中斷,并不含有高優(yōu)先級的中斷能打斷低優(yōu)先級的中斷處理工作的意思。由于μC/OS-Ⅱ的任務(wù)切換實(shí)際上是模擬一次中斷,因此需要知道CPU的中斷響應機制。中斷發(fā)生時(shí),ATmega128按以下步驟順序執行:

(1) 全局中斷允許位I清零。

(2) 將指向下一條指令的PC值壓入堆棧,同時(shí)堆棧指針SP減2。

(3) 選擇最高優(yōu)先級的中斷向量裝入PC,程序從此地址繼續執行中斷處理。

(4) 當執行中斷處理時(shí),中斷源的中斷允許控制位清零。中斷結束后,執行RETI指令,此時(shí):

①全局中斷允許位I置“1”。

② PC從堆棧推出,程序從被中斷的地方繼續執行。特別要注意的是:ATmega128A單片機在響應中斷及從中斷返回時(shí),并不會(huì )對狀態(tài)寄存器SREG 和通用寄存器自動(dòng)進(jìn)行保存和恢復操作,因此,對狀態(tài)寄存器SREG 和通用寄存器的中斷保護工作必須由用戶(hù)來(lái)完成。

ATmega128的定時(shí)器中斷

ATmega128有三個(gè)定時(shí)器:T0,T1,T2,可以為μCOS-II提供精確的時(shí)鐘源。ATmega128的三個(gè)定時(shí)器都有計數溢出中斷功能,而且T1和T2還有匹配比較中斷,即定時(shí)器計數到設定的值時(shí),產(chǎn)生中斷并自動(dòng)清零。若系統采用這種中斷方式,其好處是在中斷服務(wù)程序ISR中不需要重新裝載定時(shí)器的值。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>