時(shí)間:2009-12-28 16:47:26來(lái)源:yangliu
摘 要:本文以AVR mega系列單片機(jī)為平臺(tái)詳細(xì)介紹了源代碼公開(kāi)的實(shí)時(shí)嵌入式操作系統(tǒng)μC/OS-II的內(nèi)核代碼及移植方法,并對(duì)系統(tǒng)的相關(guān)性能進(jìn)行了測(cè)試,為在8位單片機(jī)上進(jìn)行嵌入式系統(tǒng)開(kāi)發(fā)提供了參考。
關(guān)鍵詞:μC/OS-II; AVR mega; 移植; 系統(tǒng)測(cè)試
1 簡(jiǎn)介
隨著技術(shù)的發(fā)展,在近幾年中,嵌入式系統(tǒng)的設(shè)計(jì)及應(yīng)用對(duì)人們生活產(chǎn)生了很大的影響,并將逐漸改變?nèi)藗兾磥?lái)的生活方式。在特定的操作系統(tǒng)之上開(kāi)發(fā)應(yīng)用程序,可以使得開(kāi)發(fā)人員忽略掉很多底層硬件細(xì)節(jié),使得應(yīng)用程序調(diào)試更方便,易于維護(hù),同時(shí)開(kāi)發(fā)周期也縮短,降低了開(kāi)發(fā)成本,因而嵌入式實(shí)時(shí)操作系統(tǒng)深得開(kāi)發(fā)人員的青睞。
μC/OS-II是一種專門(mén)為微處理器設(shè)計(jì)的搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng),具有源代碼公開(kāi)、可移植性、可裁減、穩(wěn)定性和可靠性高等特點(diǎn)。其內(nèi)核主要提供進(jìn)程管理、時(shí)間管理、內(nèi)存管理等服務(wù),系統(tǒng)最多支持56個(gè)任務(wù),每個(gè)任務(wù)均有自己?jiǎn)为?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)用編寫(xiě)的通用軟件,故在具體應(yīng)用時(shí)需根據(jù)不同單片機(jī)的特點(diǎn)進(jìn)行移植,其大部分代碼是用標(biāo)準(zhǔn)C語(yǔ)言所寫(xiě),只有與處理器相關(guān)的一部分代碼用匯編語(yǔ)言寫(xiě)成,因而具有很強(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è)通用寄存器。通過(guò)在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行一條指令,運(yùn)行速度可以達(dá)到1MIPS/MHz的性能。AVR單片機(jī)內(nèi)核有豐富的指令集,通過(guò)32個(gè)通用寄存器直接與邏輯運(yùn)算單元相連接,允許在一個(gè)時(shí)鐘周期內(nèi)一條單一的指令訪問(wèn)兩個(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語(yǔ)言編寫(xiě)六個(gè)函數(shù)(OS_CPU_C.C);
● 編寫(xiě)四個(gè)匯編語(yǔ)言函數(shù)(OS_CPU_A.ASM).
要移植μC/OS-II,必須編寫(xiě)OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三個(gè)文件。這三個(gè)文件與芯片的硬件特性有關(guān),它們主要提供任務(wù)切換與時(shí)鐘的功能。μC/OS-II其他內(nèi)核代碼均用C語(yǔ)言寫(xiě)成,它們?yōu)橄到y(tǒng)提供任務(wù)管理、進(jìn)程間通信、時(shí)間管理以及內(nèi)存管理等功能。μC/OS-II軟、硬件體系結(jié)構(gòu)如下圖所示:
INCLUDES.H是一個(gè)頭文件,在所有后綴為.C的文件開(kāi)始都包含INCLUDES.H文件,其主要包含CFG.H、OS_CPU.H、UCOS_II.H三個(gè)文件。對(duì)于不同類型的處理器,還需要改寫(xiě)INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。OS_CFG.H主要包含的是一些二值常量,通過(guò)對(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; /* 無(wú)符號(hào)8位數(shù) */
typedef signed char INT8S; /* 帶符號(hào)8位數(shù) */
typedef unsigned int INT16U; /* 無(wú)符號(hào)16位數(shù) */
typedef signed int INT16S; /* 帶符號(hào)16位數(shù) */
typedef unsigned long INT32U; /* 無(wú)符號(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 /* 堆棧由高地址向低地址增長(zhǎng) */
#define OS_ENTER_CRITICAL() asm volatile ("cli")/* 禁止中斷 */
#define OS_EXIT_CRITICAL() asm volatile ("sei")/* 允許中斷 */
#define OS_TASK_SW() OSCtxSw() /* 任務(wù)級(jí)的切換函數(shù) */
?。?)數(shù)據(jù)類型
由于不同的處理器有不同的字長(zhǎng),μC/OS-II的移植需要重新定義一系列的數(shù)據(jù)結(jié)構(gòu)以確保其可移植性。用戶還需通過(guò)OS_STK聲明正確的C數(shù)據(jù)類型將任務(wù)堆棧的數(shù)據(jù)類型通知μC/OS-II。在AVR mega系列中堆棧是按8位字長(zhǎng)進(jìn)行操作的,所以堆棧數(shù)據(jù)類型OS_STK被聲明為8位。所有的任務(wù)堆棧都必須用OS_STK來(lái)聲明數(shù)據(jù)類型。
?。?)代碼臨界區(qū)
μC/OS-II在進(jìn)入系統(tǒng)臨界代碼區(qū)之前需關(guān)中斷,退出臨界區(qū)后再開(kāi)中斷,則μC/OS-II能夠保護(hù)臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程的破壞。在AVR mega系列單片機(jī)中,通過(guò)設(shè)置狀態(tài)寄存器SREG中的中斷屏蔽位來(lái)實(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。
?。?) OS_TASK_SW()函數(shù)的定義
在μC/OS-II中,OS_TASK_SW()用來(lái)實(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í)需要改寫(xiě)OS_CPU_A.ASM中的四個(gè)匯編語(yǔ)言函數(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()通過(guò)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)開(kāi)始運(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ù)開(kāi)始執(zhí)行 */
?。?) 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)看起來(lái)是一樣的。調(diào)整的方法很簡(jiǎn)單,只要將堆棧指針加一個(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的溢出中斷來(lái)產(chǎn)生時(shí)鐘節(jié)拍,溢出時(shí)間為10ms,并在OSTickISR()中重新裝載定時(shí)器的起始值。
OSTickISR()函數(shù)匯編代碼及相關(guān)介紹如下:
OSTickISR:
SEI /* 重新開(kāi)中斷 */
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)用,用來(lái)初始化任務(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í)候需要重新開(kāi)啟中斷。同時(shí)還需要修改OSTaskIdle()和OSTaskStat()函數(shù),在運(yùn)行時(shí)開(kāi)啟中斷。如果以上任何環(huán)節(jié)出現(xiàn)問(wèn)題,系統(tǒng)就會(huì)崩潰。所以在初始化任務(wù)堆棧時(shí)設(shè)置狀態(tài)寄存器SREG為0x80,即允許任務(wù)啟動(dòng)后中斷。
4 系統(tǒng)測(cè)試
隨著嵌入式產(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)主要用匯編語(yǔ)言寫(xiě)成,相對(duì)來(lái)講代碼效率較高,但也有他本身的限制,即作為一種專用的操作系統(tǒng)而言,它們很難移植到其他平臺(tái)上和在其他場(chǎng)合使用。μC/OS-II作為一個(gè)用C語(yǔ)言編寫(xiě)成的操作系統(tǒng),已被廣泛的移植到各種平臺(tái)上。同時(shí)因?yàn)槠溆肅語(yǔ)言所寫(xiě),性能比匯編語(yǔ)言編寫(xiě)的操作系統(tǒng)稍差,故在移植工作完成后,對(duì)系統(tǒng)進(jìn)行了測(cè)試。
一個(gè)實(shí)時(shí)進(jìn)程在系統(tǒng)中變成可運(yùn)行到進(jìn)程實(shí)際開(kāi)始它的執(zhí)行,是有一定的延遲時(shí)間的,即分配時(shí)間。這段時(shí)間與內(nèi)核密切相關(guān)。為了測(cè)試這段時(shí)間,這里只建立了一個(gè)任務(wù),該任務(wù)在等待一個(gè)信號(hào)量,收到信號(hào)量后對(duì)一個(gè)計(jì)數(shù)值進(jìn)行簡(jiǎn)單的加1,而給任務(wù)發(fā)信號(hào)量的過(guò)程采用定時(shí)器2的比較匹配中斷完成。AVR單片機(jī)的定時(shí)器有比較匹配中斷模式,當(dāng)定時(shí)器計(jì)數(shù)與預(yù)設(shè)值相等時(shí),可以再次從0開(kāi)始計(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í)間。通過(guò)不斷縮小比較匹配的時(shí)間發(fā)現(xiàn),當(dāng)時(shí)間減小到24微秒時(shí),任務(wù)已經(jīng)沒(méi)有運(yùn)行了,任務(wù)中的計(jì)數(shù)值為0,表明任務(wù)沒(méi)來(lái)得及運(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)通過(guò)中斷來(lái)響應(yīng)外部事件的發(fā)生,并且用戶的中斷服務(wù)中做的事要盡量的少,把大部分工作留給任務(wù)去做,只是通過(guò)信號(hào)量或者消息隊(duì)列機(jī)制來(lái)通知任務(wù)運(yùn)行。因而任務(wù)對(duì)外部事件的響應(yīng)時(shí)間就是一個(gè)重要的性能指標(biāo),這里對(duì)這段時(shí)間進(jìn)行了測(cè)試。程序中建立了一個(gè)任務(wù),等待在一個(gè)信號(hào)量上。mega128的定時(shí)器2設(shè)置為比較匹配輸出模式,在匹配時(shí)間到了之后產(chǎn)生一定周期的脈沖輸出并產(chǎn)生中斷。設(shè)置定時(shí)器1為計(jì)數(shù)模式來(lái)計(jì)數(shù)產(chǎn)生的脈沖輸出。通過(guò)定時(shí)器2的比較匹配中斷服務(wù)子程序來(lái)發(fā)信號(hào)量通知任務(wù)運(yùn)行時(shí),并且在中斷子程序中不開(kāi)中斷,而在任務(wù)收到信號(hào)量得到運(yùn)行后才開(kāi)中斷,以實(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é)束語(yǔ)
μC/OS-II作為通用的嵌入式實(shí)時(shí)操作系統(tǒng),已廣泛使用在各種場(chǎng)合。通過(guò)在AVR Mage 系列單片機(jī)上的移植和測(cè)試,說(shuō)明了其在8位單片機(jī)上的可能性。并且由于其公開(kāi)了源代碼,結(jié)合8位機(jī)的特性,可以在此基礎(chǔ)上進(jìn)行系統(tǒng)的裁減和擴(kuò)展,使之能達(dá)到更好的效果,本文為嵌入式系統(tǒng)應(yīng)用基礎(chǔ)提供了借鑒。
參考文獻(xiàn)
[1] 耿德根,宋建國(guó),馬潮,葉勇建. AVR高速嵌入式單片機(jī)原理與應(yīng)用.北京:北京航空航天大學(xué)出版社,2001.
[2] Jean J.Labrosse著.邵貝貝譯. μC/OS-II – 源碼公開(kāi)的實(shí)時(shí)嵌入式操作系統(tǒng).北京:中國(guó)電力出版社,2001.
[3] 屠祁,屠立德. 操作系統(tǒng)基礎(chǔ).北京:清華大學(xué)出版社,2000.
標(biāo)簽:
中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(www.connectcrack.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>2025-05-19
2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
rpi-image-gen:樹(shù)莓派軟件鏡像構(gòu)建的終...
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測(cè)節(jié)拍...
2025-03-31