技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動(dòng)網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > μC/OS-II實(shí)時(shí)嵌入式操作系統(tǒng)在AVR mega系列MCU上的移植

μC/OS-II實(shí)時(shí)嵌入式操作系統(tǒng)在AVR mega系列MCU上的移植

時(shí)間:2009-12-28 16:47:26來源:yangliu

導(dǎo)語:?本文以AVR mega系列單片機(jī)為平臺(tái)詳細(xì)介紹了源代碼公開的實(shí)時(shí)嵌入式操作系統(tǒng)μC/OS-II的內(nèi)核代碼及移植方法,并對(duì)系統(tǒng)的相關(guān)性能進(jìn)行了測試

摘  要:本文以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)如下圖所示:


圖1 μ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)簽:

點(diǎn)贊

分享到:

上一篇:變頻器技術(shù)及其在離心泵上的...

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動(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é)任。

網(wǎng)站簡介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號(hào) | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)