嵌入式系統(tǒng)-Chapter7-時(shí)間管理資料_第1頁
嵌入式系統(tǒng)-Chapter7-時(shí)間管理資料_第2頁
嵌入式系統(tǒng)-Chapter7-時(shí)間管理資料_第3頁
嵌入式系統(tǒng)-Chapter7-時(shí)間管理資料_第4頁
嵌入式系統(tǒng)-Chapter7-時(shí)間管理資料_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)(xtng)及應(yīng)用共三十六頁第七章 時(shí)間(shjin)管理共三十六頁主要(zhyo)內(nèi)容硬件時(shí)鐘(shzhng)設(shè)備時(shí)間管理共三十六頁時(shí)間管理一般具有以下功能: 維持(wich)日歷時(shí)間; 任務(wù)有限等待的計(jì)時(shí); 軟定時(shí)器的定時(shí)管理; 維持系統(tǒng)時(shí)間片輪轉(zhuǎn)調(diào)度。 時(shí)間(shjin)管理共三十六頁硬件(yn jin)時(shí)鐘設(shè)備 大多數(shù)嵌入式系統(tǒng)有兩種時(shí)鐘源:實(shí)時(shí)時(shí)鐘(real time clock,RTC)定時(shí)器/計(jì)數(shù)器實(shí)時(shí)時(shí)鐘:一般靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時(shí)間。實(shí)時(shí)時(shí)鐘獨(dú)立于操作系統(tǒng),所以也被稱為硬件時(shí)鐘,為整個(gè)系統(tǒng)提供一個(gè)計(jì)時(shí)標(biāo)準(zhǔn)。 定時(shí)器/計(jì)數(shù)器:實(shí)時(shí)內(nèi)核需要一個(gè)定時(shí)

2、器作為系統(tǒng)時(shí)鐘(或稱OS時(shí)鐘),并由實(shí)時(shí)內(nèi)核控制系統(tǒng)時(shí)鐘工作。一般情況(qngkung)下,系統(tǒng)時(shí)鐘的最小粒度是由應(yīng)用和操作系統(tǒng)的特點(diǎn)決定的。 共三十六頁三星44B0X(ARM7)芯片中的RTC 在系統(tǒng)沒有上電的情況下,可由后備電池供電;可以通過ARM的STRB/LDRB操作獲取RTC以二進(jìn)制編碼的十進(jìn)制數(shù)據(jù)格式向CPU提供8比特?cái)?shù)據(jù)。數(shù)據(jù)包含秒、分、小時(shí)、日、月和年等內(nèi)容;使用一個(gè)外部的32.768KHz晶振; 包括一個(gè)閏年產(chǎn)生器;提供告警中斷或是從掉電模式中喚醒(hunxng)的告警功能:;能夠避免2000年問題(即千年蟲問題);獨(dú)立的電源引腳;能夠?yàn)閷?shí)時(shí)內(nèi)核的系統(tǒng)時(shí)鐘提供毫秒級(jí)的時(shí)間中斷

3、;能夠進(jìn)行循環(huán)復(fù)位。 Time Tick Generator26 Clock DividerReset RegisterLeap Year GeneratorSECMINHOURDATEDAYMONYEARAlarm GeneratorControl Register128 Hz1 HzRTCRSTTIME TICKRTCCONPMWKUPPWDNALMNTRTCALMTICNTXTALEXTAL共三十六頁硬件時(shí)鐘(shzhng)設(shè)備在不同的操作系統(tǒng)中,實(shí)時(shí)時(shí)鐘和系統(tǒng)時(shí)鐘之間的關(guān)系是不同的。實(shí)時(shí)時(shí)鐘和系統(tǒng)時(shí)鐘之間的關(guān)系通常(tngchng)也被稱作操作系統(tǒng)的時(shí)鐘運(yùn)作機(jī)制。一般來說,實(shí)時(shí)時(shí)鐘是系

4、統(tǒng)時(shí)鐘的時(shí)間基準(zhǔn),實(shí)時(shí)內(nèi)核通過讀取實(shí)時(shí)時(shí)鐘來初始化系統(tǒng)時(shí)鐘,此后二者保持同步運(yùn)行,共同維系系統(tǒng)時(shí)間。系統(tǒng)時(shí)鐘并不是本質(zhì)意義上的時(shí)鐘,只有當(dāng)系統(tǒng)運(yùn)行起來以后才有效,并且由實(shí)時(shí)內(nèi)核完全控制。 共三十六頁硬件時(shí)鐘(shzhng)設(shè)備從硬件的角度來看,定時(shí)器(timer)和計(jì)數(shù)器(counter)的概念是可以互換的,其差別主要體現(xiàn)在硬件在特定應(yīng)用中的使用(shyng)情況。 共三十六頁 一個(gè)簡單的定時(shí)器/計(jì)數(shù)器 包含一個(gè)可裝入的8位計(jì)數(shù)寄存器,一個(gè)時(shí)鐘輸入信號(hào)和一個(gè)輸出脈沖。通過軟件(run jin)可以把一個(gè)位于0 x00和0 xFF之間的初始數(shù)據(jù)轉(zhuǎn)入到計(jì)數(shù)寄存器。隨后的每一個(gè)時(shí)鐘輸入信號(hào)都會(huì)導(dǎo)致該

5、值被增加。當(dāng)8位計(jì)數(shù)器溢出時(shí),就產(chǎn)生輸出脈沖。輸出脈沖可以用來觸發(fā)處理器上的一個(gè)中斷,或是在處理器能夠讀取的地方設(shè)置一個(gè)二進(jìn)制位。輸出脈沖是操作系統(tǒng)時(shí)鐘的硬件基礎(chǔ),是因?yàn)檩敵雒}沖將送到中斷控制器上,產(chǎn)生中斷信號(hào),觸發(fā)時(shí)鐘中斷,由時(shí)鐘中斷服務(wù)程序維持操作系統(tǒng)時(shí)鐘的正常工作。為了重啟定時(shí)器,軟件需要重新裝入一個(gè)相同或不同的初始數(shù)據(jù)到計(jì)數(shù)寄存器。 共三十六頁硬件(yn jin)時(shí)鐘設(shè)備在一個(gè)典型的計(jì)數(shù)器中,當(dāng)初始數(shù)據(jù)被裝入后,可以使用一定的方式來啟動(dòng)計(jì)數(shù)器。并且(bngqi),一個(gè)實(shí)際的計(jì)數(shù)器也需要為處理器提供一種通過數(shù)據(jù)總線讀取計(jì)數(shù)寄存器當(dāng)前值的方式。如果希望定時(shí)器能夠自動(dòng)重新裝入初始數(shù)據(jù),就需要

6、一個(gè)鎖存寄存器,以保存處理器所寫入的計(jì)數(shù)數(shù)據(jù)。當(dāng)處理器向鎖存寄存器寫入數(shù)據(jù)時(shí),計(jì)數(shù)寄存器也被寫入了該數(shù)據(jù)。定時(shí)器溢出時(shí),定時(shí)器產(chǎn)生輸出脈沖,然后自動(dòng)把鎖存寄存器中的數(shù)據(jù)重新裝入到計(jì)數(shù)寄存器。由于鎖存寄存器仍然擁有處理器寫入的數(shù)據(jù),計(jì)數(shù)器將從同樣的初始數(shù)據(jù)重新開始進(jìn)行計(jì)數(shù)。這樣的定時(shí)器能夠產(chǎn)生與時(shí)鐘具有相同精度的規(guī)則性輸出。輸出脈沖產(chǎn)生的周期性中斷可以用于實(shí)時(shí)內(nèi)核需要的tick,或是為UART提供一個(gè)波特率時(shí)鐘,或是驅(qū)動(dòng)需要規(guī)則脈沖的設(shè)備。 共三十六頁時(shí)間(shjin)管理 實(shí)時(shí)內(nèi)核的時(shí)間管理以系統(tǒng)時(shí)鐘為基礎(chǔ),系統(tǒng)時(shí)鐘一般定義為整數(shù)或長整數(shù),提供給應(yīng)用程序所有和時(shí)間有關(guān)的服務(wù)。系統(tǒng)時(shí)鐘是由定時(shí)/

7、計(jì)數(shù)器產(chǎn)生的輸出脈沖觸發(fā)中斷而產(chǎn)生的。輸出脈沖的周期(zhuq)叫做一個(gè)“時(shí)鐘滴答”,也稱為時(shí)標(biāo)、tick。 共三十六頁時(shí)間(shjin)管理tick為系統(tǒng)的相對(duì)時(shí)間單位,也被稱為系統(tǒng)的時(shí)基,來源于定時(shí)器的周期性中斷,一次中斷表示一個(gè)tick。一個(gè)tick與具體時(shí)間的對(duì)應(yīng)關(guān)系可在初始化定時(shí)器時(shí)設(shè)定,也就是說,tick所對(duì)應(yīng)的具體時(shí)間長度是可以調(diào)整的。一般來說,實(shí)時(shí)內(nèi)核都提供相應(yīng)的調(diào)整機(jī)制,應(yīng)用可以根據(jù)特定情況改變(gibin)tick對(duì)應(yīng)的時(shí)間長度。例如,可以使系統(tǒng)5毫秒產(chǎn)生一個(gè)tick,也可以是10毫秒產(chǎn)生一個(gè)tick。tick的大小決定了整個(gè)系統(tǒng)的時(shí)間粒度。共三十六頁時(shí)間(shjin)管理

8、通常來說,實(shí)時(shí)內(nèi)核提供以下(yxi)主要與時(shí)間相關(guān)的管理: 維持相對(duì)時(shí)間(時(shí)間單位為tick)和日歷時(shí)間;任務(wù)有限等待的計(jì)時(shí);定時(shí)功能;時(shí)間片輪轉(zhuǎn)調(diào)度的計(jì)時(shí)。 共三十六頁void OSTimeDly (INT16U ticks)/* Allocate storage for CPU status register */#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endif if (ticks 0) /* 0 means no delay! */ OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &=

9、OSTCBCur-OSTCBBitX) = 0) /* Delay current task */ OSRdyGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; /* Load ticks in TCB */ OS_EXIT_CRITICAL(); OS_Sched(); /* Find next task to run! */ OSTimeDly Under uC/OS-II共三十六頁the resolution of a delay is between 0 and 1 tick. In other words, if you try

10、 to delay for only one tick, you could end up with a delay between 0 and 1 tick. 共三十六頁時(shí)間(shjin)管理管理功能是通過tick處理程序來實(shí)現(xiàn)的。定時(shí)器發(fā)生中斷后,執(zhí)行系統(tǒng)時(shí)鐘中斷處理程序,并在中斷處理程序中調(diào)用tick處理程序,實(shí)現(xiàn)系統(tǒng)中與時(shí)間和定時(shí)相關(guān)的操作(cozu)。tick處理程序作為實(shí)時(shí)內(nèi)核的一部分,與具體的定時(shí)器/計(jì)數(shù)器硬件無關(guān),由系統(tǒng)時(shí)鐘中斷處理程序調(diào)用,使實(shí)時(shí)內(nèi)核具有對(duì)不同定時(shí)器/計(jì)數(shù)器硬件的適應(yīng)性。 共三十六頁tick處理程序相對(duì)時(shí)間處理(chl)任務(wù)時(shí)間片處理時(shí)間等待鏈處理軟件定時(shí)器處

11、理日歷時(shí)間處理任務(wù)調(diào)度處理系統(tǒng)時(shí)鐘(shzhng)中斷服務(wù)程序tick處理程序 tick處理程序共三十六頁void OSTickISR(void) Save processor registers; Call OSIntEnter() or increment OSIntNesting; if (OSIntNesting = 1) OSTCBCur-OSTCBStkPtr = SP; Call OSTimeTick(); Clear interrupting device; Re-enable interrupts (optional); Call OSIntExit(); Restore p

12、rocessor registers; Execute a return from interrupt instruction;Tick Under uC/OS-II共三十六頁void OSTimeTick (void)#if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endif OS_TCB *ptcb; OSTimeTickHook(); (1)#if OS_TIME_GET_SET_EN 0 OS_ENTER_CRITICAL(); OSTime+; (2) OS_EXIT_CRITICAL();#endif if (OSRunning = TRU

13、E) ptcb = OSTCBList; (3) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (4) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = 0 x00) (5) OSRdyGrp |= ptcb-OSTCBBitY; (6) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCB

14、Next; OS_EXIT_CRITICAL(); 共三十六頁void TickTask (void *pdata) pdata = pdata; for (;) OSMboxPend(.); /* Wait for signal from Tick ISR */ OSTimeTick(); OS_Sched(); void OSTickISR(void) Save processor registers; Call OSIntEnter() or increment OSIntNesting; if (OSIntNesting = 1) OSTCBCur-OSTCBStkPtr = SP;

15、Post a dummy message (e.g. (void *)1) to the tick mailbox; Call OSIntExit(); Restore processor registers; Execute a return from interrupt instruction;Tick Under uC/OS-II based on DSR共三十六頁 OSTickISR PROC FAR PUSHA ; Save interrupted tasks context PUSH ES PUSH DS MOV AX, SEG _OSIntNesting ; Reload DS

16、MOV DS, AX INC BYTE PTR _OSIntNesting; Notify uC/OS-II of ISR INT 081H ; Chain into DOSs tick ISR CALL FAR PTR _OSTimeTick ; Process system tick CALL FAR PTR _OSIntExit ; Notify uC/OS-II of end of ISR POP DS ; Restore interrupted tasks context POP ES POPA IRET ; Return to interrupted task_OSTickISR

17、ENDPOSTickISR Under 80 x86共三十六頁時(shí)間(shjin)管理相對(duì)時(shí)間即系統(tǒng)時(shí)間,是指相對(duì)于系統(tǒng)啟動(dòng)以來的時(shí)間,以tick為單位,每發(fā)生一個(gè)tick,對(duì)系統(tǒng)的相對(duì)時(shí)間進(jìn)行一次加1操作(cozu)。實(shí)時(shí)內(nèi)核根據(jù)tick對(duì)應(yīng)的時(shí)間長度,可以把相對(duì)時(shí)間轉(zhuǎn)換為以秒或是毫秒為單位的其他時(shí)間格式,并可根據(jù)實(shí)時(shí)時(shí)鐘獲得日歷時(shí)間。 如果對(duì)任務(wù)設(shè)置了時(shí)間片處理方式,需要在tick處理程序中對(duì)當(dāng)前正在運(yùn)行的任務(wù)的已執(zhí)行時(shí)間進(jìn)行更新,使任務(wù)的已執(zhí)行時(shí)間數(shù)值加1。執(zhí)行加1操作后,如果任務(wù)的已執(zhí)行時(shí)間同任務(wù)的時(shí)間片相等,表示任務(wù)使用完一個(gè)時(shí)間片的執(zhí)行時(shí)間,需要結(jié)束當(dāng)前任務(wù)的執(zhí)行,設(shè)置調(diào)度標(biāo)志,把當(dāng)

18、前任務(wù)放置到就緒鏈。 共三十六頁時(shí)間(shjin)管理時(shí)間等待(dngdi)鏈用來存放需要延遲處理的對(duì)象:產(chǎn)生tick后,需要對(duì)時(shí)間等待鏈中的對(duì)象的剩余等待時(shí)間值進(jìn)行處理。對(duì)于時(shí)間等待的對(duì)象,通常都被組織為差分鏈表的方式進(jìn)行管理,以有效降低時(shí)間等待對(duì)象的管理開銷。在時(shí)間差分鏈中,每個(gè)表項(xiàng)所包含的計(jì)時(shí)值并非當(dāng)前時(shí)刻到表項(xiàng)激活時(shí)刻的絕對(duì)計(jì)數(shù),而是該表項(xiàng)和先于它的所有表項(xiàng)的計(jì)數(shù)值之和。 共三十六頁3A2B5C4D3A2B3C4D2EA對(duì)象需要等待(dngdi)3個(gè)時(shí)間單位就應(yīng)被激活B對(duì)象需要等待5(3+2)個(gè)時(shí)間單位就應(yīng)被激活C對(duì)象需要等待10(3+2+5)個(gè)時(shí)間單位就應(yīng)被激活D對(duì)象需要等待14(3

19、+2+5+4)個(gè)時(shí)間單位就應(yīng)被激活7E差分(ch fn)鏈由于7-3-2=2,而7-3-2-5=-3,因此E對(duì)象需要插入到差分鏈中介于對(duì)象B和對(duì)象C之間的位置。共三十六頁時(shí)間(shjin)管理對(duì)于差分時(shí)間鏈,系統(tǒng)每接收到一個(gè)tick,就修訂鏈?zhǔn)讓?duì)象的時(shí)間值。如果鏈表對(duì)象的時(shí)間單位為tick,則每發(fā)生一個(gè)tick,鏈?zhǔn)讓?duì)象的時(shí)間值就減1,當(dāng)減到0時(shí),鏈?zhǔn)讓?duì)象就被激活(j hu),并從差分時(shí)間鏈中取下來,下一個(gè)對(duì)象又成為鏈?zhǔn)讓?duì)象。 共三十六頁時(shí)間(shjin)管理為實(shí)現(xiàn)定時(shí)功能,實(shí)時(shí)內(nèi)核需要提供軟件定時(shí)器管理(gunl)功能,應(yīng)用程序可根據(jù)需要?jiǎng)?chuàng)建、使用軟件定時(shí)器。軟件定時(shí)器在創(chuàng)建時(shí),由用戶提供定

20、時(shí)值,當(dāng)軟件定時(shí)器的定時(shí)值減法計(jì)數(shù)為0時(shí),觸發(fā)定時(shí)器服務(wù)例程。用戶可在此例程中完成自己需要的操作。在tick處理程序中需要對(duì)軟件定時(shí)器的定時(shí)值進(jìn)行減1操作,并在定時(shí)值為0時(shí),觸發(fā)掛接在該定時(shí)器上的服務(wù)例程。 共三十六頁時(shí)間(shjin)管理軟件定時(shí)器可用于實(shí)現(xiàn)“看門狗”(watchdog)。在應(yīng)用的某個(gè)地方進(jìn)行軟件定時(shí)器的停止計(jì)時(shí)操作,確保定時(shí)器在系統(tǒng)正常運(yùn)行的情況下不會(huì)到期,即不會(huì)觸發(fā)定時(shí)器服務(wù)例程;如果某個(gè)時(shí)候系統(tǒng)進(jìn)入了定時(shí)器服務(wù)例程,就表示(biosh)使用停止計(jì)時(shí)操作的地方?jīng)]有執(zhí)行到,系統(tǒng)出現(xiàn)了錯(cuò)誤。 如果需要進(jìn)行任務(wù)的重調(diào)度,tick處理程序還需要調(diào)用調(diào)度程序進(jìn)行任務(wù)調(diào)度處理,使需要

21、執(zhí)行的下一個(gè)任務(wù)獲得對(duì)CPU的控制。 共三十六頁時(shí)間(shjin)管理在時(shí)間方面,內(nèi)核通常提供以下(yxi)功能: 設(shè)置系統(tǒng)時(shí)間。使應(yīng)用能夠設(shè)置當(dāng)前系統(tǒng)的日期和時(shí)間。 獲得系統(tǒng)時(shí)間。以日歷時(shí)間、系統(tǒng)啟動(dòng)以來所經(jīng)歷的tick數(shù)等形式獲得當(dāng)前的系統(tǒng)時(shí)間。 維護(hù)系統(tǒng)時(shí)基、處理定時(shí)事件。通過時(shí)鐘中斷,維持系統(tǒng)日志時(shí)間、任務(wù)延遲時(shí)間、超時(shí)、單調(diào)速率周期、實(shí)現(xiàn)時(shí)間片等內(nèi)容。 共三十六頁typedef struct unsigned32 year; /* year*/ unsigned32 month; /* month,1-12 */ unsigned32 day; /* day,1-31 */ unsi

22、gned32 hour; /* hour,0-23 */ unsigned32 minute; /* minute,0-59 */ unsigned32 second; /* second,0-59 */ unsigned32 ticks; /* elapsed ticks between secs */ TOD; /*Time Of Day*/日歷時(shí)間(shjin)數(shù)據(jù)結(jié)構(gòu)共三十六頁INT32U OSTimeGet (void) INT32U ticks; OS_ENTER_CRITICAL(); ticks = OSTime; OS_EXIT_CRITICAL(); return (tic

23、ks);void OSTimeSet (INT32U ticks) OS_ENTER_CRITICAL(); OSTime = ticks; OS_EXIT_CRITICAL();OSTimeGet and OSTimeSet Under uC/OS-II共三十六頁時(shí)間(shjin)管理在定時(shí)方面,內(nèi)核通常提供以下功能: 創(chuàng)建軟件定時(shí)器。分配(fnpi)一個(gè)定時(shí)器數(shù)據(jù)結(jié)構(gòu),創(chuàng)建一個(gè)軟件定時(shí)器,并為這個(gè)定時(shí)器分配(fnpi)用戶指定的名字。新創(chuàng)建的定時(shí)器沒有被激活,且沒有相應(yīng)的定時(shí)器服務(wù)例程。軟件定時(shí)器創(chuàng)建成功后,將為該定時(shí)器分配(fnpi)一個(gè)ID標(biāo)識(shí)。共三十六頁typedef struct

24、timer_class class; timer_state state; timer_time initial; timer_time timeRemain; timer_time startTime; timer_service_routine_entry handler; void *usrData; attribute type; unsigned32 repeatCount; unsigned32 repeatRemain; timerInformation;軟件定時(shí)器數(shù)據(jù)結(jié)構(gòu)(sh j ji u)class表示所創(chuàng)建定時(shí)器的觸發(fā)時(shí)間類型,可以是相對(duì)時(shí)間觸發(fā),也可以是絕對(duì)時(shí)間觸發(fā)。state表示定時(shí)器的當(dāng)前狀態(tài),可以是活動(dòng)狀態(tài)、非活動(dòng)狀態(tài)或是中間狀態(tài)(如正在進(jìn)行計(jì)時(shí)鏈表的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論