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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、通常來說,實時內(nèi)核提供以下(yxi)主要與時間相關(guān)的管理: 維持相對時間(時間單位為tick)和日歷時間;任務(wù)有限等待的計時;定時功能;時間片輪轉(zhuǎn)調(diào)度的計時。 共三十六頁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. 共三十六頁時間(shjin)管理管理功能是通過tick處理程序來實現(xiàn)的。定時器發(fā)生中斷后,執(zhí)行系統(tǒng)時鐘中斷處理程序,并在中斷處理程序中調(diào)用tick處理程序,實現(xiàn)系統(tǒng)中與時間和定時相關(guān)的操作(cozu)。tick處理程序作為實時內(nèi)核的一部分,與具體的定時器/計數(shù)器硬件無關(guān),由系統(tǒng)時鐘中斷處理程序調(diào)用,使實時內(nèi)核具有對不同定時器/計數(shù)器硬件的適應(yīng)性。 共三十六頁tick處理程序相對時間處理(chl)任務(wù)時間片處理時間等待鏈處理軟件定時器處

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

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

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

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

21、執(zhí)行的下一個任務(wù)獲得對CPU的控制。 共三十六頁時間(shjin)管理在時間方面,內(nèi)核通常提供以下(yxi)功能: 設(shè)置系統(tǒng)時間。使應(yīng)用能夠設(shè)置當(dāng)前系統(tǒng)的日期和時間。 獲得系統(tǒng)時間。以日歷時間、系統(tǒng)啟動以來所經(jīng)歷的tick數(shù)等形式獲得當(dāng)前的系統(tǒng)時間。 維護系統(tǒng)時基、處理定時事件。通過時鐘中斷,維持系統(tǒng)日志時間、任務(wù)延遲時間、超時、單調(diào)速率周期、實現(xiàn)時間片等內(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*/日歷時間(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共三十六頁時間(shjin)管理在定時方面,內(nèi)核通常提供以下功能: 創(chuàng)建軟件定時器。分配(fnpi)一個定時器數(shù)據(jù)結(jié)構(gòu),創(chuàng)建一個軟件定時器,并為這個定時器分配(fnpi)用戶指定的名字。新創(chuàng)建的定時器沒有被激活,且沒有相應(yīng)的定時器服務(wù)例程。軟件定時器創(chuàng)建成功后,將為該定時器分配(fnpi)一個ID標識。共三十六頁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ù)據(jù)結(jié)構(gòu)(sh j ji u)class表示所創(chuàng)建定時器的觸發(fā)時間類型,可以是相對時間觸發(fā),也可以是絕對時間觸發(fā)。state表示定時器的當(dāng)前狀態(tài),可以是活動狀態(tài)、非活動狀態(tài)或是中間狀態(tài)(如正在進行計時鏈表的

溫馨提示

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

評論

0/150

提交評論