時(shí)間:2009-12-28 16:47:26來源:yangliu
摘 要:本文以AVR mega系列單片機(jī)為平臺(tái)詳細(xì)介紹了源代碼公開的實(shí)時(shí)嵌入式操作系統(tǒng)μC/OS-II的內(nèi)核代碼及移植方法,并對(duì)系統(tǒng)的相關(guān)性能進(jìn)行了測試,為在8位單片機(jī)上進(jìn)行嵌入式系統(tǒng)開發(fā)提供了參考。
關(guān)鍵詞:μC/OS-II; AVR mega; 移植; 系統(tǒng)測試
1 簡介
隨著技術(shù)的發(fā)展,在近幾年中,嵌入式系統(tǒng)的設(shè)計(jì)及應(yīng)用對(duì)人們生活產(chǎn)生了很大的影響,并將逐漸改變?nèi)藗兾磥淼纳罘绞健T谔囟ǖ牟僮飨到y(tǒng)之上開發(fā)應(yīng)用程序,可以使得開發(fā)人員忽略掉很多底層硬件細(xì)節(jié),使得應(yīng)用程序調(diào)試更方便,易于維護(hù),同時(shí)開發(fā)周期也縮短,降低了開發(fā)成本,因而嵌入式實(shí)時(shí)操作系統(tǒng)深得開發(fā)人員的青睞。
μC/OS-II是一種專門為微處理器設(shè)計(jì)的搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng),具有源代碼公開、可移植性、可裁減、穩(wěn)定性和可靠性高等特點(diǎn)。其內(nèi)核主要提供進(jìn)程管理、時(shí)間管理、內(nèi)存管理等服務(wù),系統(tǒng)最多支持56個(gè)任務(wù),每個(gè)任務(wù)均有自己單獨(dú)的優(yōu)先級(jí)。由于其內(nèi)核為搶占式,所以總是運(yùn)行優(yōu)先級(jí)最高的任務(wù)。系統(tǒng)提供了豐富的API函數(shù),便于實(shí)現(xiàn)進(jìn)程間的通信及進(jìn)程狀態(tài)的轉(zhuǎn)化。由于μC/OS-II是為嵌入式應(yīng)用編寫的通用軟件,故在具體應(yīng)用時(shí)需根據(jù)不同單片機(jī)的特點(diǎn)進(jìn)行移植,其大部分代碼是用標(biāo)準(zhǔn)C語言所寫,只有與處理器相關(guān)的一部分代碼用匯編語言寫成,因而具有很強(qiáng)的移植性,能在多數(shù)8位、16位、32位單片機(jī)及數(shù)字信號(hào)處理器上實(shí)現(xiàn)運(yùn)行。
AVR mega系列單片機(jī)是基于AVR RISC的,低功耗的8位單片機(jī),內(nèi)部有32個(gè)通用寄存器。通過在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行一條指令,運(yùn)行速度可以達(dá)到1MIPS/MHz的性能。AVR單片機(jī)內(nèi)核有豐富的指令集,通過32個(gè)通用寄存器直接與邏輯運(yùn)算單元相連接,允許在一個(gè)時(shí)鐘周期內(nèi)一條單一的指令訪問兩個(gè)獨(dú)立的寄存器。這樣的結(jié)構(gòu)使得代碼的執(zhí)行效率比傳統(tǒng)的復(fù)雜指令集的微處理器快近10倍。AVR mega128是mega系列里功能最強(qiáng)大、資源最豐富的一款單片機(jī),有128k的在系統(tǒng)可編程flash,4k字節(jié)的SRAM和EEPROM,為系統(tǒng)的移植提供了一個(gè)良好的平臺(tái)。要實(shí)現(xiàn)μC/OS-II在AVR mega 系列MCU上的移植,需要有AVR系列單片機(jī)的編譯器,這里采用的是GNU推出的AVR-GCC編譯器。
2 移植工作概要
移植工作主要包括以下幾個(gè)內(nèi)容:
● 用#define設(shè)置一個(gè)常數(shù)的值(OS_CPU.H);
● 聲明9個(gè)數(shù)據(jù)類型(OS_CPU.H);
● 用#define聲明三個(gè)宏(OS_CPU.H);
● 用C語言編寫六個(gè)函數(shù)(OS_CPU_C.C);
● 編寫四個(gè)匯編語言函數(shù)(OS_CPU_A.ASM).
要移植μC/OS-II,必須編寫OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三個(gè)文件。這三個(gè)文件與芯片的硬件特性有關(guān),它們主要提供任務(wù)切換與時(shí)鐘的功能。μC/OS-II其他內(nèi)核代碼均用C語言寫成,它們?yōu)橄到y(tǒng)提供任務(wù)管理、進(jìn)程間通信、時(shí)間管理以及內(nèi)存管理等功能。μC/OS-II軟、硬件體系結(jié)構(gòu)如下圖所示:
INCLUDES.H是一個(gè)頭文件,在所有后綴為.C的文件開始都包含INCLUDES.H文件,其主要包含CFG.H、OS_CPU.H、UCOS_II.H三個(gè)文件。對(duì)于不同類型的處理器,還需要改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。OS_CFG.H主要包含的是一些二值常量,通過對(duì)這些常量置1或0,可以方便的對(duì)內(nèi)核進(jìn)行裁減,這是μC/OS-II較為突出的一個(gè)優(yōu)點(diǎn)。
3 移植代碼分析
3.1 OS_CPU.H文件
OS_CUP.H包括用#define定義的與處理器有關(guān)的常量,宏和類型定義。大體結(jié)構(gòu)如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /* 無符號(hào)8位數(shù) */
typedef signed char INT8S; /* 帶符號(hào)8位數(shù) */
typedef unsigned int INT16U; /* 無符號(hào)16位數(shù) */
typedef signed int INT16S; /* 帶符號(hào)16位數(shù) */
typedef unsigned long INT32U; /* 無符號(hào)32位數(shù) */
typedef signed long INT32S; /* 帶符號(hào)32位數(shù) */
typedef float FP32; /* 單精度浮點(diǎn)數(shù) */
typedef unsigned char OS_STK; /* 堆棧入口寬度為8位 */
#define OS_STK_GROWTH 1 /* 堆棧由高地址向低地址增長 */
#define OS_ENTER_CRITICAL() asm volatile ("cli")/* 禁止中斷 */
#define OS_EXIT_CRITICAL() asm volatile ("sei")/* 允許中斷 */
#define OS_TASK_SW() OSCtxSw() /* 任務(wù)級(jí)的切換函數(shù) */
(1)數(shù)據(jù)類型
由于不同的處理器有不同的字長,μC/OS-II的移植需要重新定義一系列的數(shù)據(jù)結(jié)構(gòu)以確保其可移植性。用戶還需通過OS_STK聲明正確的C數(shù)據(jù)類型將任務(wù)堆棧的數(shù)據(jù)類型通知μC/OS-II。在AVR mega系列中堆棧是按8位字長進(jìn)行操作的,所以堆棧數(shù)據(jù)類型OS_STK被聲明為8位。所有的任務(wù)堆棧都必須用OS_STK來聲明數(shù)據(jù)類型。
?。?)代碼臨界區(qū)
μC/OS-II在進(jìn)入系統(tǒng)臨界代碼區(qū)之前需關(guān)中斷,退出臨界區(qū)后再開中斷,則μC/OS-II能夠保護(hù)臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程的破壞。在AVR mega系列單片機(jī)中,通過設(shè)置狀態(tài)寄存器SREG中的中斷屏蔽位來實(shí)現(xiàn)。μC/OS-II中的宏OS_ENTER_CRITICAL()定義將狀態(tài)寄存器中的中斷屏蔽位清除,以屏蔽所有的中斷;OS_EXIT_CRITICAL()定義將狀態(tài)寄存器的中斷屏蔽位置位以允許所有的中斷。
?。?)堆棧方向
AVR mega系列微處理器的堆棧是由高地址向低地址遞減的,所以O(shè)S_STK_GROWTH必須設(shè)置為1。
(4) OS_TASK_SW()函數(shù)的定義
在μC/OS-II中,OS_TASK_SW()用來實(shí)現(xiàn)任務(wù)切換。在進(jìn)行宏定義時(shí)直接定義為OSCtxSw()函數(shù),即任務(wù)級(jí)切換函數(shù)。
3.2 OS_CPU_A.ASM文件
3.2.1 相關(guān)函數(shù)
移植μC/OS-II時(shí)需要改寫OS_CPU_A.ASM中的四個(gè)匯編語言函數(shù):
● OSStartHighRdy()
● OSCtxSw()
● OSIntCtxSw()
● OSTickISR()
3.2.2 函數(shù)介紹
?。?) OSStartHighRdy()函數(shù)
該函數(shù)由OSStart()函數(shù)調(diào)用,功能是運(yùn)行優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。在調(diào)用OSStart()函數(shù)之前,用戶必須調(diào)用OSInit(),并且至少已經(jīng)創(chuàng)建了一個(gè)任務(wù)。當(dāng)調(diào)用OSStart()函數(shù)時(shí),獲得了指向就緒任務(wù)中最高優(yōu)先級(jí)任務(wù)的OS_TCB的地址指針OSTCBHighRdy,并把這個(gè)指針賦值給OSTCBCur。OSStartHighRdy()通過OSTCBHighRdy,就可以從任務(wù)的控制塊中獲得堆棧指針。由于OSTaskCreate()函數(shù)創(chuàng)建任務(wù)時(shí)堆棧初始化為模擬一次中斷發(fā)生的結(jié)構(gòu),于是當(dāng)彈出所有保存的寄存器后,運(yùn)行RET命令就可以切換到了新任務(wù)。
OSStartHighRdy()函數(shù)的匯編代碼及相關(guān)介紹如下:
CALL OSTaskSwHook /* 調(diào)用用戶自己定義的函數(shù) */
LDS R16,OSRunning /* 設(shè)置標(biāo)識(shí)系統(tǒng)開始運(yùn)行的變量 */
INC R16
STS OSRunning,R16
LDS R30,OSTCBHighRdy /* Z指針指向最高優(yōu)先級(jí)任務(wù)的OS_TCB */
LDS R31,OSTCBHighRdy+1
LD R28,Z+
out SPL,R28
LD R29,Z+
out SPH,R29 /* 從OS_TCB中獲取堆棧指針 */
POPRS /* 恢復(fù)所有的寄存器 */
RET /* 任務(wù)開始執(zhí)行 */
(2) OSCtxSw()函數(shù)
OSCtxSw()是一個(gè)任務(wù)級(jí)任務(wù)切換函數(shù),其只在任務(wù)中被調(diào)用,區(qū)別于中斷程序中調(diào)用的切換函數(shù)OSIntCtxSw();在μC/OS-II中,如果任務(wù)調(diào)用某個(gè)函數(shù),而該函數(shù)的執(zhí)行結(jié)果可能會(huì)造成系統(tǒng)任務(wù)重新調(diào)度,例如試圖喚醒了一個(gè)優(yōu)先級(jí)更高的任務(wù),則需進(jìn)行任務(wù)切換。由于AVR mega128不支持軟中斷指令,移植時(shí)于OS_CPU.H文件直接定義了OSCtxSw()函數(shù)。
OSCtxSw()函數(shù)的匯編代碼及相關(guān)介紹如下:
PUSHRS /* 保存當(dāng)前環(huán)境 */
LDS R30,OSTCBCur
LDS R31,OSTCBCur+1 /* Z指針指向當(dāng)前任務(wù)的OS_TCB */
in r28,SPL
ST Z+,R28
in r29,SPH
ST Z+,R29 /* 保存堆棧指針到OS_TCB中 */
CALL OSTaskSwHook /* 調(diào)用用戶自己定義的函數(shù) */
LDS R16,OSPrioHighRdy /* OSPrioCur = OSPrioHighRdy */
STS OSPrioCur,R16
LDS R30,OSTCBHighRdy
LDS R31,OSTCBHighRdy /* z指針指向高優(yōu)先級(jí)任務(wù)的OS_TCB*/
STS OSTCBCur,R30
STS OSTCBCur+1,R31 /* OSTCBCur = OSTCBHighRdy */
LD R28,Z+
out SPL,R28
LD R29,Z+
out SPH,R29 /* 獲得堆棧指針 */
POPRS /* 更新寄存器內(nèi)容 */
RET /* 任務(wù)切換 */
?。?) OSIntCtxSw()函數(shù)
在μC/OS-II中,由于中斷的發(fā)生可能引起任務(wù)切換,故在中斷服務(wù)程序的最后會(huì)調(diào)用OSIntExit()函數(shù)檢查任務(wù)就緒狀態(tài)。如果要進(jìn)行任務(wù)切換,將調(diào)用OSIntCtxSw()函數(shù),因而OSIntCtxSw()又稱為中斷級(jí)的任務(wù)切換函數(shù)。由于在調(diào)用OSIntCtxSw()之前已經(jīng)發(fā)生了中斷,OSIntCtxSw()默認(rèn)寄存器已經(jīng)保存在被中斷任務(wù)的堆棧中了。OSIntCtxSw()的代碼大部分和OSCtxSw()函數(shù)相同,不同之處在于:
● 由于中斷已經(jīng)發(fā)生,寄存器入棧的工作已經(jīng)完成,在此不需要再保存寄存器的內(nèi)容;
● 在中斷服務(wù)子程序中調(diào)用OSIntExit()時(shí),將返回地址推入了堆棧。OSIntExit()中的進(jìn)入臨界函數(shù)OS_ENTER_CRITICAL()可能會(huì)將CPU的狀態(tài)字也推入了堆棧,這取決于中斷是怎么關(guān)掉的。同時(shí)OSIntCtxSw()的返回地址也會(huì)被推入堆棧中。
當(dāng)任務(wù)掛起時(shí),棧結(jié)構(gòu)應(yīng)該與μC/OS-II所規(guī)定的完全一致。所以當(dāng)任務(wù)掛起時(shí),OSIntCtxSw()需要對(duì)棧指針進(jìn)行調(diào)整,即調(diào)整的棧結(jié)構(gòu)要保證所有掛起的任務(wù)的棧結(jié)構(gòu)看起來是一樣的。調(diào)整的方法很簡單,只要將堆棧指針加一個(gè)固定的值就可以了。
?。?) OSTickISR()函數(shù)
在μC/OS-II中,當(dāng)調(diào)用OSStart()啟動(dòng)多任務(wù)環(huán)境后,時(shí)鐘中斷非常重要。在時(shí)鐘中斷中處理所有與定時(shí)器相關(guān)的工作,如任務(wù)的延時(shí)、等待操作等。在時(shí)鐘中斷中將查詢處于等待狀態(tài)的任務(wù),判斷是否延時(shí)結(jié)束,以重新進(jìn)行任務(wù)調(diào)度。OSTickISR()采用μC/OS-II中的其他中斷服務(wù)程序原型,移植時(shí)采用了AVR mega128的8位定時(shí)器0的溢出中斷來產(chǎn)生時(shí)鐘節(jié)拍,溢出時(shí)間為10ms,并在OSTickISR()中重新裝載定時(shí)器的起始值。
OSTickISR()函數(shù)匯編代碼及相關(guān)介紹如下:
OSTickISR:
SEI /* 重新開中斷 */
PUSHRS /* 保存所有寄存器 */
LDS R16,OSIntNesting /* μC/OS-II中斷服務(wù)程序原型 */
INC R16
STS OSIntNesting,R16
CALL OSTimeTick /* 調(diào)用時(shí)鐘節(jié)拍處理函數(shù) */
CALL OSIntExit /* μC/OS-II中斷服務(wù)程序原型 */
LDI R16,256-(11059200/50/1024)
OUT TCNT0,R16 /* 重載定時(shí)器,定時(shí)10ms */
POPRS /* 恢復(fù)寄存器的值 */
RET /* 中斷返回 */
3.3 OS_CPU_C.C文件
μC/OS-II的移植需要用戶在OS_CPU_C.C中定義6個(gè)函數(shù),而實(shí)際上需要定義的只有OSStkInit()一個(gè)函數(shù),其他5個(gè)函數(shù)需要聲明,但不一定有實(shí)際內(nèi)容。這五個(gè)函數(shù)是用戶自己定義的。使用時(shí)需要將OS_CFG.H里的OS_CPU_HOOKS_EN定義為1,設(shè)置為零表示不使用這些函數(shù)。在移植代碼中并不要求使用這幾個(gè)函數(shù),故只定義其位空函數(shù)。這5個(gè)函數(shù)分別為:
● OSTaskCreateHook()函數(shù)
● OSTaskDelHook ()函數(shù)
● OSTaskSwHook ()函數(shù)
● OSTaskStatHook ()函數(shù)
● OSTimeTickHook ()函數(shù)
OSTaskStkInit()函數(shù)由任務(wù)創(chuàng)建函數(shù)OSTaskCreate()或OSTaskCreateExt()調(diào)用,用來初始化任務(wù)的堆棧。初始狀態(tài)的堆棧模擬發(fā)生一次中斷后的堆棧結(jié)構(gòu)。按照中斷后的進(jìn)棧次序預(yù)留各個(gè)寄存器的存儲(chǔ)空間,而中斷返回地址指向任務(wù)代碼的起始地址。由于AVR mega128的堆棧是8位寬的,OSTaskStkInit()將創(chuàng)建一個(gè)指向以字節(jié)為單位的內(nèi)存區(qū)域的指針,同時(shí)要求堆棧指針指向空堆棧的頂端。堆棧初始化工作結(jié)束后,OSTaskStkInit()返回新的堆棧指針,OSTaskCreate()或OSTaskCreateExt()將這個(gè)堆棧指針保存到任務(wù)的OS_TCB上。這里要注意的是,堆棧中的SREG初始化為0x80,即使得任務(wù)啟動(dòng)后允許中斷的發(fā)生;如果設(shè)置為0x00,則任務(wù)啟動(dòng)后將禁止中斷。如果選擇任務(wù)啟動(dòng)后允許中斷發(fā)生,則所有的任務(wù)運(yùn)行期間中斷都允許;同樣,如果選擇任務(wù)啟動(dòng)后禁止中斷,則所有的任務(wù)都禁止中斷發(fā)生,而不能有所選擇。如果某個(gè)任務(wù)選擇啟動(dòng)后禁止中斷,那么其他的任務(wù)在運(yùn)行的時(shí)候需要重新開啟中斷。同時(shí)還需要修改OSTaskIdle()和OSTaskStat()函數(shù),在運(yùn)行時(shí)開啟中斷。如果以上任何環(huán)節(jié)出現(xiàn)問題,系統(tǒng)就會(huì)崩潰。所以在初始化任務(wù)堆棧時(shí)設(shè)置狀態(tài)寄存器SREG為0x80,即允許任務(wù)啟動(dòng)后中斷。
4 系統(tǒng)測試
隨著嵌入式產(chǎn)品的廣泛應(yīng)用,嵌入式系統(tǒng)的研究也在不斷發(fā)展,出現(xiàn)了很多的實(shí)時(shí)系統(tǒng)。比如實(shí)時(shí)系統(tǒng)VxWorks,RT-Linux等。但這些操作系統(tǒng)主要在32位處理器上使用,并且需要較高的成本。而由于8位單片機(jī)本身資源的限制,以前很少有在8位機(jī)上運(yùn)行的操作系統(tǒng),隨著8位機(jī)功能和資源的增加,漸漸出現(xiàn)了不少使用在8位單片機(jī)上的實(shí)時(shí)系統(tǒng),比如在AVR單片機(jī)上的AVRX,NUT/OS等。這些操作系統(tǒng)主要用匯編語言寫成,相對(duì)來講代碼效率較高,但也有他本身的限制,即作為一種專用的操作系統(tǒng)而言,它們很難移植到其他平臺(tái)上和在其他場合使用。μC/OS-II作為一個(gè)用C語言編寫成的操作系統(tǒng),已被廣泛的移植到各種平臺(tái)上。同時(shí)因?yàn)槠溆肅語言所寫,性能比匯編語言編寫的操作系統(tǒng)稍差,故在移植工作完成后,對(duì)系統(tǒng)進(jìn)行了測試。
一個(gè)實(shí)時(shí)進(jìn)程在系統(tǒng)中變成可運(yùn)行到進(jìn)程實(shí)際開始它的執(zhí)行,是有一定的延遲時(shí)間的,即分配時(shí)間。這段時(shí)間與內(nèi)核密切相關(guān)。為了測試這段時(shí)間,這里只建立了一個(gè)任務(wù),該任務(wù)在等待一個(gè)信號(hào)量,收到信號(hào)量后對(duì)一個(gè)計(jì)數(shù)值進(jìn)行簡單的加1,而給任務(wù)發(fā)信號(hào)量的過程采用定時(shí)器2的比較匹配中斷完成。AVR單片機(jī)的定時(shí)器有比較匹配中斷模式,當(dāng)定時(shí)器計(jì)數(shù)與預(yù)設(shè)值相等時(shí),可以再次從0開始計(jì)數(shù)。比較匹配中斷的程序采用μC/OS-II的中斷服務(wù)程序原型,并且在中斷程序中給任務(wù)發(fā)信號(hào)量,而且定義一個(gè)變量記錄中斷發(fā)生的次數(shù)。如果在所設(shè)定的比較時(shí)間里,任務(wù)程序中的計(jì)數(shù)值和中斷程序中的計(jì)數(shù)值相等,表明任務(wù)在該時(shí)間內(nèi)能滿足分配時(shí)間。通過不斷縮小比較匹配的時(shí)間發(fā)現(xiàn),當(dāng)時(shí)間減小到24微秒時(shí),任務(wù)已經(jīng)沒有運(yùn)行了,任務(wù)中的計(jì)數(shù)值為0,表明任務(wù)沒來得及運(yùn)行又被比較匹配中斷程序占用了處理器。而當(dāng)大于24微秒時(shí),運(yùn)行了六千次任務(wù)調(diào)度,可以完成。對(duì)于處理速度相對(duì)高檔CPU而言已是較慢的8位單片機(jī)而言,24微秒能滿足應(yīng)用的需要。
在實(shí)時(shí)系統(tǒng)中,實(shí)時(shí)系統(tǒng)的實(shí)時(shí)性表現(xiàn)在系統(tǒng)對(duì)外部事件的響應(yīng)能力上。系統(tǒng)通過中斷來響應(yīng)外部事件的發(fā)生,并且用戶的中斷服務(wù)中做的事要盡量的少,把大部分工作留給任務(wù)去做,只是通過信號(hào)量或者消息隊(duì)列機(jī)制來通知任務(wù)運(yùn)行。因而任務(wù)對(duì)外部事件的響應(yīng)時(shí)間就是一個(gè)重要的性能指標(biāo),這里對(duì)這段時(shí)間進(jìn)行了測試。程序中建立了一個(gè)任務(wù),等待在一個(gè)信號(hào)量上。mega128的定時(shí)器2設(shè)置為比較匹配輸出模式,在匹配時(shí)間到了之后產(chǎn)生一定周期的脈沖輸出并產(chǎn)生中斷。設(shè)置定時(shí)器1為計(jì)數(shù)模式來計(jì)數(shù)產(chǎn)生的脈沖輸出。通過定時(shí)器2的比較匹配中斷服務(wù)子程序來發(fā)信號(hào)量通知任務(wù)運(yùn)行時(shí),并且在中斷子程序中不開中斷,而在任務(wù)收到信號(hào)量得到運(yùn)行后才開中斷,以實(shí)現(xiàn)中斷處理與任務(wù)運(yùn)行的同步。并且任務(wù)中對(duì)一個(gè)全局變量計(jì)數(shù)器加1,記錄任務(wù)運(yùn)行的次數(shù)。如果運(yùn)行一段時(shí)間后在設(shè)置的比較匹配時(shí)間里任務(wù)的計(jì)數(shù)器和定時(shí)器1計(jì)數(shù)值相等,則系統(tǒng)在這段時(shí)間里是能完全響應(yīng)外部事件。當(dāng)定時(shí)器2的比較匹配時(shí)間大于39微秒時(shí),任務(wù)運(yùn)行六千次后退出任務(wù)循環(huán)并停止定時(shí)器1的計(jì)數(shù),這兩個(gè)計(jì)數(shù)器的值相等,都為六千次。當(dāng)匹配時(shí)間小于39微秒時(shí),定時(shí)器1的計(jì)數(shù)值大于任務(wù)的計(jì)數(shù)值六千,任務(wù)的處理時(shí)間不能完全響應(yīng)外部事件的發(fā)生。即系統(tǒng)對(duì)外部事件的響應(yīng)和處理時(shí)間為39微秒,而只有外部事件的發(fā)生大于這段時(shí)間才能保證系統(tǒng)的實(shí)時(shí)性。而當(dāng)匹配時(shí)間減小到24微秒即系統(tǒng)的分配時(shí)間時(shí),任務(wù)計(jì)數(shù)器的值為零,而定時(shí)器1不斷在計(jì)數(shù),這表明任務(wù)已得不到運(yùn)行,即與前述結(jié)論相符。
7 結(jié)束語
μC/OS-II作為通用的嵌入式實(shí)時(shí)操作系統(tǒng),已廣泛使用在各種場合。通過在AVR Mage 系列單片機(jī)上的移植和測試,說明了其在8位單片機(jī)上的可能性。并且由于其公開了源代碼,結(jié)合8位機(jī)的特性,可以在此基礎(chǔ)上進(jìn)行系統(tǒng)的裁減和擴(kuò)展,使之能達(dá)到更好的效果,本文為嵌入式系統(tǒng)應(yīng)用基礎(chǔ)提供了借鑒。
參考文獻(xiàn)
[1] 耿德根,宋建國,馬潮,葉勇建. AVR高速嵌入式單片機(jī)原理與應(yīng)用.北京:北京航空航天大學(xué)出版社,2001.
[2] Jean J.Labrosse著.邵貝貝譯. μC/OS-II – 源碼公開的實(shí)時(shí)嵌入式操作系統(tǒng).北京:中國電力出版社,2001.
[3] 屠祁,屠立德. 操作系統(tǒng)基礎(chǔ).北京:清華大學(xué)出版社,2000.
標(biāo)簽:
中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>新品發(fā)布:CD300系列總線型伺服驅(qū)動(dòng)器
2024-10-31
2024-10-31
2024-10-31
新勢能 新期待|維智B1L直線伺服驅(qū)動(dòng)器
2024-10-31
2024-10-29
2024-10-18
推薦專題
更多>