版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第6章 時間管理l 時鐘l 時鐘中斷服務(wù)程序l C/OS-II的時鐘l C/OS-II的時間管理函數(shù)時鐘:操作系統(tǒng)需要一個周期性的信號源,以供處理時鐘:操作系統(tǒng)需要一個周期性的信號源,以供處理與時間有關(guān)的事件與時間有關(guān)的事件 大多數(shù)嵌入式系統(tǒng)有兩種時鐘源: 實時時鐘(real time clock,RTC) 定時器/計數(shù)器實時時鐘:實時時鐘: 一般靠電池供電,即使系統(tǒng)斷電,也可以維持一般靠電池供電,即使系統(tǒng)斷電,也可以維持日期和時間。日期和時間。 靠電壓周期產(chǎn)生中斷來計時靠電壓周期產(chǎn)生中斷來計時 實時時鐘獨立于操作系統(tǒng),所以也被稱為實時時鐘獨立于操作系統(tǒng),所以也被稱為硬件硬件時鐘時鐘,為整個系
2、統(tǒng)提供一個,為整個系統(tǒng)提供一個計時標準計時標準。 大多數(shù)嵌入式系統(tǒng)有兩種時鐘源: 實時時鐘(real time clock,RTC) 定時器/計數(shù)器(可編程時鐘)系統(tǒng)(系統(tǒng)(OSOS)時鐘)時鐘 系統(tǒng)時鐘是指操作系統(tǒng)中的內(nèi)部計數(shù)器,是一個可編程系統(tǒng)時鐘是指操作系統(tǒng)中的內(nèi)部計數(shù)器,是一個可編程時鐘時鐘 系統(tǒng)時鐘的系統(tǒng)時鐘的粒度粒度是是時鐘中斷到來的頻率,就是時鐘中斷到來的頻率,就是2個時鐘個時鐘中斷之間的時間間隔,是中斷之間的時間間隔,是OS時鐘的計時單位時鐘的計時單位 時鐘粒度的大小決定了操作系統(tǒng)的時間精度以及對外界時鐘粒度的大小決定了操作系統(tǒng)的時間精度以及對外界的響應(yīng)速度的響應(yīng)速度第6章 時
3、間管理l 時鐘l 時鐘中斷服務(wù)程序l C/OS-II的時鐘l C/OS-II的時間管理及應(yīng)用實例時鐘硬件根據(jù)已知時間間隔產(chǎn)生中斷。時鐘中斷程序完成時鐘硬件根據(jù)已知時間間隔產(chǎn)生中斷。時鐘中斷程序完成相應(yīng)功能相應(yīng)功能時鐘中斷程序一般做:維護日時間防止進程超時運行對CPU的使用情況記賬處理用戶進程提出的報警系統(tǒng)調(diào)用為系統(tǒng)本身的各個部分提供監(jiān)視定時器完成概要剖析、監(jiān)視和統(tǒng)計信息收集第6章 時間管理l 時鐘l 時鐘中斷服務(wù)程序l C/OS-II的時鐘l C/OS-II的時間管理及應(yīng)用實例6.3 C/OS-II的時鐘 用硬件定時器產(chǎn)生一個周期為毫秒(ms)級的周期性中斷來實現(xiàn)系統(tǒng)時鐘。 最小的時鐘單位就是
4、兩次中斷之間間隔的時間,叫時鐘節(jié)拍(time tick) 硬件定時器以時鐘節(jié)拍為周期定時產(chǎn)生中斷,該中斷的中斷服務(wù)程序叫做OSTickISR()。 這個中斷服務(wù)程序通過調(diào)用函數(shù)OSTimeTick()來完成系統(tǒng)在每個時鐘節(jié)拍時需要做的工作。C/OS-II的中斷服務(wù)子程序ISROSTickISR()()OSTimeTick()()時鐘節(jié)拍函數(shù)OSTimeTick()void OSTimeTick (void)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif OS_TCB *ptcb; OSTimeTickHook(); #if OS_TIME_GE
5、T_SET_EN0 OS_ENTER_CRITICAL(); OSTime+; OS_EXIT_CRITICAL();#endif時鐘節(jié)拍數(shù)時鐘節(jié)拍數(shù) If(OSRunning=TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTb
6、lptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); 允許任務(wù)等待時的最多節(jié)拍數(shù)允許任務(wù)等待時的最多節(jié)拍數(shù)時鐘節(jié)拍函數(shù)OSTimeTick()做兩件事: 節(jié)拍數(shù)加1 沿著OS_TCB鏈表,直到空閑任務(wù),把各個任務(wù)的時間延遲項OSTCBDly減1,當(dāng)該項為0時,如果該任務(wù)沒有被掛起,該任務(wù)進入就緒狀態(tài)OSTimeTick()擴展void OSTimeTick (void)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;
7、#endif OS_TCB *ptcb; OSTimeTickHook(); #if OS_TIME_GET_SET_EN0 OS_ENTER_CRITICAL(); OSTime+; OS_EXIT_CRITICAL();#endif如果想對節(jié)拍函數(shù)功能擴展,可如果想對節(jié)拍函數(shù)功能擴展,可以寫以寫在OSTimeTickHook()中,中,放入放入OS_CPU.C中斷服務(wù)子程序OSTickISR()還可以分解 將中斷服務(wù)功能分成2 2部分: 中斷服務(wù)程序通常都只處理一些必要的操作,其他操作則通過任務(wù)通過任務(wù)的方式來進行。 用來配合中斷服務(wù)程序的另外的任務(wù)通常被稱為DSR(deferred se
8、rvice routine)。 為什么要分解?為什么要分解?由于中斷服務(wù)程序中通常都對中斷進行了屏蔽,要求中斷服務(wù)程序應(yīng)該由于中斷服務(wù)程序中通常都對中斷進行了屏蔽,要求中斷服務(wù)程序應(yīng)該盡可能盡可能比較短比較短,保證其他中斷和系統(tǒng)中的任務(wù)能夠得到及時處理,保證其他中斷和系統(tǒng)中的任務(wù)能夠得到及時處理時鐘中斷服務(wù)可以分解為ISR+DSRvoid TickTask (void *pdata) pdata = pdata; for (;) OSMboxPend(.); /* 等待從時鐘節(jié)拍中斷服務(wù)程序發(fā)來的信號 */ OSTimeTick(); OSTickISR()如下:void OSTickISR(
9、void) 保存處理器寄存器的值; 調(diào)用OSIntEnter()或是將OSIntNesting加1; 發(fā)送一個空消息(例如, (void *)1)到時鐘節(jié)拍任務(wù)的郵箱; 調(diào)用OSIntExit(); 恢復(fù)處理器寄存器的值; 執(zhí)行中斷返回指令;第6章 時間管理l 時鐘l 時鐘中斷服務(wù)程序l C/OS-II的時鐘l C/OS-II的時間管理函數(shù)C/OS-II的時間管理函數(shù) 任務(wù)延時函數(shù)OSTimeDly() 按時分秒延時函數(shù) OSTimeDlyHMSM() 取消任務(wù)的延時函數(shù),OSTimeDlyResume() 設(shè)置系統(tǒng)時間OSTimeSet() 獲取系統(tǒng)時間OSTimeGet()任務(wù)延時函數(shù)OS
10、TimeDly()函數(shù)OSTimeDly()的原型如下:void OSTimeDly (INT16U ticks); 參數(shù):ticks表示要延時的時鐘節(jié)拍數(shù)。 返回值:無作用:讓出作用:讓出cpu的控制權(quán)!每個任務(wù)都要調(diào)用!的控制權(quán)!每個任務(wù)都要調(diào)用! ticks的值會存放在TCB中的INT16U OSTCBDly; 會引發(fā)調(diào)度!會引發(fā)調(diào)度! 按時分秒延時函數(shù) OSTimeDlyHMSM()函數(shù)OSTimeDlyHMSM()的原型如下:OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT8U milli);參數(shù):hours:延
11、時小時數(shù),范圍從0-255。minutes:延時分鐘數(shù),范圍從0-59。seconds:延時秒數(shù),范圍從0-59milli:延時毫秒數(shù),范圍從0-999。返回值:OS_NO_ERR:函數(shù)調(diào)用成功。OS_TIME_INVALID_MINUTES:參數(shù)錯誤,分鐘數(shù)大于59。OS_TIME_INVALID_SECONDS:參數(shù)錯誤,秒數(shù)大于59。OS_TIME_INVALID_MILLI:參數(shù)錯誤,毫秒數(shù)大于999。OS_TIME_ZERO_DLY:四個參數(shù)全為0。調(diào)用了函數(shù)OSTimeDly( )或OSTimeDlyHMSM( )的任務(wù),當(dāng)規(guī)定的延時時間期滿,或有其他任務(wù)通過調(diào)用函數(shù)OSTimeD
12、lyResume( )取消了延時時,它會立即進入就緒狀態(tài)。取消任務(wù)的延時函數(shù)OSTimeDlyResume()函數(shù)OSTimeDlyResume()的原型如下:OSTimeDlyResume(INT8U prio) 參數(shù):prio:指定要喚醒任務(wù)的優(yōu)先級。返回值:返回值:OS_NO_ERR:函數(shù)調(diào)用成功。:函數(shù)調(diào)用成功。OS_PRIO_INVALID:參數(shù)指定的優(yōu)先級大于:參數(shù)指定的優(yōu)先級大于OS_LOWEST_PRIO。OS_TIME_NOT_DLY:要喚醒的任務(wù)不在延時狀態(tài)。:要喚醒的任務(wù)不在延時狀態(tài)。OS_TASK_NOT_EXIST:指定的任務(wù)不存在。:指定的任務(wù)不存在。任務(wù)的基本狀態(tài)
13、圖3-2 任務(wù)的狀態(tài)轉(zhuǎn)換圖舉例1、創(chuàng)建三個函數(shù):main、 MyTask、 YouTask。2、 MyTask輸出M, YouTask輸出Y3、 YouTask調(diào)用延時函數(shù)OSTimeDly( )進行延時。在任務(wù)MyTask中還調(diào)用了函數(shù)OSTimeDlyResume(prio)取消了任務(wù)YouTask的延時。應(yīng)用程序代碼如下:/*TEST*/#include “includes.h”#define TASK_STK_SIZE 512 /任務(wù)堆棧長度OS_STK MyTaskStkTASK_STK_SIZE; /定義任務(wù)堆棧區(qū)OS_STK YouTaskStkTASK_STK_SIZE; /定
14、義任務(wù)堆棧區(qū)INT16S key; /用于退出c/os-II的鍵INT8U x=0,y=0; /字符顯示位置void MyTask(void *data); /聲明任務(wù)void YouTask(void *data); /聲明任務(wù)/*主函數(shù)*/void main(void) char * s_M=“M”; /定義要顯示的字符 OSInit( ); /初始化c/os-II PC_DOSSaveReturn( ); /保存DOS環(huán)境 PC_VectSet(uCOS,OSCtxSw); /安裝c/os-II中斷 OSTaskCreate(MyTask, /創(chuàng)建任務(wù)MyTask s_M, /給任務(wù)傳遞
15、參數(shù) &MyTaskStkTASK_STK_SIZE-1, /設(shè)置任務(wù)堆棧棧頂指針 0); /使任務(wù)的優(yōu)先級別為0 OSStart( ); /啟動c/os-II的多任務(wù)管理/*任務(wù)MyTask*/void MyTask(void *pdata) char * s_Y=“Y”; /定義要顯示的字符#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL( ); PC_VectSet(0 x08,OSTickISR); /安裝c/os-II時鐘中斷向量 PC_SetTickRate(OS_
16、TICKS_PER_SEC); /設(shè)置c/os-II時鐘頻率 OS_EXIT_CRITICAL( ); OSStatInit( ); /初始化c/os-II的統(tǒng)計任務(wù) OSTaskCreate(YouTask, s_Y, &YouTaskStkTASK_STK_SIZE-1, 2); for( ; ; ) if(x50) x=0; y+=2; if(y1) OSTimeDlyResume(2); /取消YouTask任務(wù)的延時 PC_DispChar(x,y, /顯示字符的位置 *(char *)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE); x+=1
17、; /如果按下ESC鍵,則退出c/os-II if(PC_GetKey(&key)=TRUE) if(key=0 x1B) PC_DOSReturn( ); OSTimeDly(100); /延時100個時鐘節(jié)拍 /*任務(wù)youtask*/void YouTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata;for( ; ; ) if(x50) x=0; y+=2; PC_DispChar(x,y, /顯示字符的位置 *(char *)pdata, DISP_BGND_BLACK+DI
18、SP_FGND_WHITE); x+=1; OSTimeDly(500); /延時500個時鐘節(jié)拍 設(shè)置與獲取系統(tǒng)時間OSTimeSet()設(shè)置系統(tǒng)時間原型如下:Void OSTimeSet(INT32U ticks); 參數(shù):Ticks:要設(shè)置的時鐘數(shù),單位是時鐘節(jié)拍數(shù)。INT32u OSTime獲取系統(tǒng)時間原型如下:INT32U OSTimeGet(Void); 返回值:時鐘節(jié)拍數(shù)。舉例設(shè)計一個應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)設(shè)計一個應(yīng)用程序,在任務(wù)中調(diào)用函數(shù)OSTimeGet()獲得獲得并顯示系統(tǒng)的時鐘節(jié)拍數(shù)并顯示系統(tǒng)的時鐘節(jié)拍數(shù)OSTime。當(dāng)任務(wù)運行。當(dāng)任務(wù)運行10s時,調(diào)用時,調(diào)用函數(shù)函
19、數(shù)OSTimeSet()將將OSTime設(shè)置為設(shè)置為10應(yīng)用程序的代碼如下:/*TEST*/#include “includes.h”#define TASK_STK_SIZE 512 /任務(wù)堆棧長度OS_STK TaskStartStkTASK_STK_SIZE; /定義任務(wù)堆棧區(qū)INT16S key; /用于退出c/os-II的鍵INT32U stime; /存放節(jié)拍的變量INT8U x=0; void MyTask(void *data); /聲明任務(wù)/*主函數(shù)*/void main(void) OSInit( ); /初始化c/os-II PC_DOSSaveReturn( ); /保
20、存DOS環(huán)境 PC_VectSet(uCOS,OSCtxSw); /安裝c/os-II中斷 OSTaskCreate( MyTask, /創(chuàng)建任務(wù)MyTask (void*)0, /給任務(wù)傳遞參數(shù) &TaskStartStkTASK_STK_SIZE-1, /設(shè)置任務(wù)堆棧棧頂指針 0); /使任務(wù)的優(yōu)先級別為0 OSStart( ); /啟動c/os-II的多任務(wù)管理/*任務(wù)MyTask*/void MyTask(void *pdata) char s5 #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL( ); PC_Ve
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030葡萄酒釀造行業(yè)市場供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030葡萄牙葡萄酒產(chǎn)業(yè)發(fā)展現(xiàn)狀分析及市場推廣策略研究
- 2025規(guī)程試題及答案
- 安全員A證考試綜合檢測模擬卷【培優(yōu)】附答案詳解
- 安全員A證考試考前沖刺訓(xùn)練試卷及參考答案詳解【模擬題】
- 山東2025年山東石油化工學(xué)院招聘10人筆試歷年參考題庫附帶答案詳解
- 山東2025年山東博興縣事業(yè)單位第二次招聘16人筆試歷年參考題庫附帶答案詳解
- 宜昌2025年湖北宜昌市教育系統(tǒng)事業(yè)單位校園專項招聘4人筆試歷年參考題庫附帶答案詳解
- 2025年安全員A證考試預(yù)測試題(有一套)附答案詳解
- 寧波浙江寧波市江北區(qū)面向2025屆高校畢業(yè)生招聘高層次緊缺人才25人筆試歷年參考題庫附帶答案詳解
- 2026年上海理工大學(xué)單招職業(yè)適應(yīng)性測試題庫附答案
- TCEC電力行業(yè)數(shù)據(jù)分類分級規(guī)范-2024
- 駱駝的養(yǎng)殖技術(shù)與常見病防治
- 基層醫(yī)療資源下沉的實踐困境與解決路徑實踐研究
- 2025及未來5-10年高壓管匯項目投資價值市場數(shù)據(jù)分析報告
- 2025年衛(wèi)生人才評價考試(臨床醫(yī)學(xué)工程技術(shù)中級)歷年參考題庫含答案
- 高溫熔融金屬冶煉安全知識培訓(xùn)課
- 遼寧中考數(shù)學(xué)三年(2023-2025)真題分類匯編:專題06 幾何與二次函數(shù)壓軸題 解析版
- 湖南省5年(2021-2025)高考物理真題分類匯編:專題11 近代物理(原卷版)
- 保密協(xié)議書 部隊
- 螺桿泵知識點培訓(xùn)課件
評論
0/150
提交評論