![第三章 中斷與時(shí)鐘_第1頁](http://file4.renrendoc.com/view/eff726e7bbefa3a5a465f11a676d9f54/eff726e7bbefa3a5a465f11a676d9f541.gif)
![第三章 中斷與時(shí)鐘_第2頁](http://file4.renrendoc.com/view/eff726e7bbefa3a5a465f11a676d9f54/eff726e7bbefa3a5a465f11a676d9f542.gif)
![第三章 中斷與時(shí)鐘_第3頁](http://file4.renrendoc.com/view/eff726e7bbefa3a5a465f11a676d9f54/eff726e7bbefa3a5a465f11a676d9f543.gif)
![第三章 中斷與時(shí)鐘_第4頁](http://file4.renrendoc.com/view/eff726e7bbefa3a5a465f11a676d9f54/eff726e7bbefa3a5a465f11a676d9f544.gif)
![第三章 中斷與時(shí)鐘_第5頁](http://file4.renrendoc.com/view/eff726e7bbefa3a5a465f11a676d9f54/eff726e7bbefa3a5a465f11a676d9f545.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式系統(tǒng)
EmbeddedSystem教師:白華郵箱:baihua2000@電話公室:4A-4092.2.4任務(wù)的其他管理函數(shù)堆棧檢驗(yàn):OSTaskStkChk()確定任務(wù)實(shí)際需要的堆??臻g大小刪除任務(wù):OSTaskDel()任務(wù)休眠,任務(wù)代碼并未刪除,只是不再被調(diào)用請(qǐng)求刪除任務(wù):OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級(jí):OSTaskChangePrio()掛起任務(wù):OSTaskSuspend()空閑任務(wù)不能被掛起恢復(fù)任務(wù):OSTaskResume()被掛起的任務(wù)只能通過該函數(shù)恢復(fù)獲得任務(wù)信息:OSTaskQuery()獲得指定任務(wù)的OS_TCB中內(nèi)容的拷貝2.3例程解析共有10個(gè)任務(wù)在屏幕隨機(jī)的位置上顯示一個(gè)0~9的數(shù)字。每個(gè)任務(wù)只顯示同一個(gè)數(shù)字,也就是其中一個(gè)任務(wù)在隨機(jī)位置顯示0,另一個(gè)顯示1,等等。該例程目的在于演示mC/OS-II的多任務(wù)處理能力。#include"includes.h"includes.h是主控頭文件,包含所有相關(guān)的頭文件,從此可使用系統(tǒng)提供的數(shù)據(jù)類型、系統(tǒng)函數(shù)和全局變量等。#defineTASK_STK_SIZE512#defineN_TASKS10定義兩個(gè)常數(shù):TASK_STK_SIZE表示堆棧可容納的指針元數(shù)目;N_TASKS表示需要建立的任務(wù)數(shù)。OS_STKTaskStk[N_TASKS][TASK_STK_SIZE];OS_STKTaskStartStk[TASK_STK_SIZE];charTaskData[N_TASKS];OS_EVENT*RandomSem;定義不同類型的變量(或數(shù)組)voidTask(void*data);voidTaskStart(void*data);staticvoidTaskStartCreateTasks(void);staticvoidTaskStartDispInit(void);staticvoidTaskStartDisp(void);自定義函數(shù)聲明前往第17頁voidmain(void){
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSInit();PC_DOSSaveReturn();PC_VectSet(uCOS,OSCtxSw);RandomSem=OSSemCreate(1);OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);OSStart();}PC_DispClrScr()為系統(tǒng)函數(shù),具有清屏功能。()中的參數(shù)表示前景色為白色,背景色為黑色。voidmain(void){PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);
OSInit();
PC_DOSSaveReturn();PC_VectSet(uCOS,OSCtxSw);RandomSem=OSSemCreate(1);OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);OSStart();}非常重要的系統(tǒng)函數(shù),執(zhí)行μC/OS-II的初始化。在使用μC/OS-II的所有服務(wù)之前,必須要調(diào)用μC/OS-II的初始化函數(shù)OSInit()對(duì)μC/OS-II自身的運(yùn)行環(huán)境進(jìn)行初始化。函數(shù)OSInit()將對(duì)μC/OS-II的所有的全局變量和數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化,同時(shí)創(chuàng)建空閑任務(wù)OSTaskIdle,并賦之以最低的優(yōu)先級(jí)別和永遠(yuǎn)的就緒狀態(tài)。如果用戶應(yīng)用程序還要使用統(tǒng)計(jì)任務(wù)的話(常數(shù)OS_TASK_STAT_EN=1),則OSInit()還要以優(yōu)先級(jí)別為OS_LOWEST_PRIO-1來創(chuàng)建統(tǒng)計(jì)任務(wù)。初始化函數(shù)OSInit()對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化時(shí),主要要?jiǎng)?chuàng)建5個(gè)空數(shù)據(jù)緩沖區(qū)(任務(wù)控制塊、事件控制塊、消息隊(duì)列控制塊、標(biāo)志控制塊、存儲(chǔ)控制塊)。為了可以快速地查詢?nèi)蝿?wù)控制塊鏈表中的各個(gè)元素,初始化函數(shù)OSInit()還要?jiǎng)?chuàng)建一個(gè)數(shù)組OSTCBPrioTbl[OS_LOWEST_PRIO+1],在這個(gè)數(shù)組中,按任務(wù)的優(yōu)先級(jí)別的順序把任務(wù)控制塊的指針存放在了對(duì)應(yīng)的元素中。2.3.1μC/OS-II的初始化(OSInit()函數(shù))voidmain(void){PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);OSInit();PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);RandomSem=OSSemCreate(1);OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);OSStart();}PC_DOSSaveReturn();/*返回到?jīng)]有運(yùn)行mCOS-II之前的DOS環(huán)境*/PC_VectSet(uCOS,OSCtxSw);/*指定任務(wù)切換處理函數(shù)*/RandomSem=OSSemCreate(1);/*建立一個(gè)信號(hào)量*/信號(hào)量是由mC/OS-II提供的一種機(jī)制,用于防止多個(gè)任務(wù)同時(shí)訪問同一資源(如產(chǎn)生隨機(jī)數(shù)的函數(shù))。這里信號(hào)量初值設(shè)置為1,通知mC/OS-II在某一時(shí)刻只有一個(gè)任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù)。該信號(hào)量建立函數(shù)返回一個(gè)指向信號(hào)量的指針。OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);/*在開始多任務(wù)之前,必須建立至少一個(gè)任務(wù)。這里建立了一個(gè)叫做TaskStart()的任務(wù)*/OSStart();/*將控制權(quán)交給mC/OS-II內(nèi)核,開始運(yùn)行多任務(wù)*/2.3.2μC/OS-II的啟動(dòng)(OSStart()函數(shù))多任務(wù)的啟動(dòng)是通過OSStart()實(shí)現(xiàn)的。在啟動(dòng)mC/OS-II之前,至少須建立一個(gè)應(yīng)用任務(wù)。OSStart()函數(shù)完成以下兩個(gè)工作:從任務(wù)就緒表中找出用戶建立的優(yōu)先級(jí)最高的任務(wù)的任務(wù)控制塊,將該任務(wù)設(shè)為當(dāng)前任務(wù)。將上述任務(wù)的堆棧中保存的值彈回到CPU寄存器中,然后執(zhí)行一條中斷返回指令,強(qiáng)制執(zhí)行該任務(wù)代碼。當(dāng)OSStart()執(zhí)行后,即多任務(wù)啟動(dòng)以后,系統(tǒng)將在用戶任務(wù)之間,或用戶任務(wù)與系統(tǒng)任務(wù)之間切換,不再返回到主函數(shù)main()。voidTaskStart(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifchars[100];INT16Skey;pdata=pdata;TaskStartDispInit();OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();TaskStartCreateTasks();與進(jìn)入臨界段代碼的方式有關(guān)定義16位變量key,用于按鍵輸入本任務(wù)無參數(shù)傳遞,未使用pdata,但為了避免編譯器警告,故執(zhí)行該語句初始化屏幕顯示,作者自定義的函數(shù),詳見光盤中的源程序代碼處理臨界段代碼1)處理臨界段代碼——關(guān)中斷處理完成后——開中斷
注:開/關(guān)中斷的方法與編譯器相關(guān)。2)μC/OS-II定義了兩個(gè)宏(macros)來開中斷和關(guān)中斷:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()這兩個(gè)宏的定義取決于微處理器,在文件OS_CPU.H中可以找到相應(yīng)的宏定義,而每種微處理器都有自己的OS_CPU.H2.3.3臨界段代碼(criticalsections)代碼的臨界段也稱為臨界區(qū),指處理時(shí)不可分割的代碼。一旦這部分代碼開始執(zhí)行,則不允許任何中斷打入,因此在進(jìn)入臨界段之前必須關(guān)中斷,而臨界段代碼執(zhí)行完后,要立即開中斷。OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()具體實(shí)現(xiàn)方法有3種1)OS_CRITICAL_MATHOD=1用處理器的關(guān)中斷指令完成OS_ENTER_CRITICAL()用處理器的開中斷指令完成OS_EXIT_CRITICAL()2)OS_CRITICAL_MATHOD=2在堆棧中保存中斷的開/關(guān)狀態(tài),然后再關(guān)中斷,實(shí)現(xiàn)OS_ENTER_CRITICAL()從堆棧中彈出原來的中斷開/關(guān)狀態(tài),實(shí)現(xiàn)OS_EXIT_CRITICAL()#defineOS_ENTER_CRITICAL()\asm(“pushpsw”)asm(“DI”)#defineOS_EXIT_CRITICAL()\asm(“poppsw”)
3)OS_CRITICAL_MATHOD=3一些編譯器提供了擴(kuò)展功能,用戶可以得到當(dāng)前處理器狀態(tài)字的值,并保存在C函數(shù)的局部變量中,這個(gè)變量可以恢復(fù)PSW。#defineOS_ENTER_CRITICAL()\cpu_sr=get_processor_psw();\disable_interrupts();#defineOS_EXIT_CRITICAL()\set_processor_psw(cpu_sr);如果使用這種方式保護(hù)臨界段代碼,則須在應(yīng)用程序的相關(guān)函數(shù)中多定義一個(gè)局部變量cpu_sr。voidTaskStart(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifchars[100];INT16Skey;pdata=pdata;TaskStartDispInit();OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();TaskStartCreateTasks();把計(jì)算機(jī)本來為時(shí)鐘節(jié)拍提供的中斷服務(wù)程序替換成mC/OS-II需要用到的時(shí)鐘節(jié)拍中斷服務(wù)程序設(shè)置時(shí)鐘節(jié)拍的頻率為200HzOS_TICKS_PER_SEC=200通過該函數(shù)得知處理器在運(yùn)行所有應(yīng)用任務(wù)時(shí)實(shí)際的CPU使用率這是作者自定義的一個(gè)函數(shù),其作用是建立更多的任務(wù)接上頁程序……for(;;){TaskStartDisp();if(PC_GetKey(&key)==TRUE){if(key==0x1B){PC_DOSReturn();}}OSCtxSwCtr=0;OSTimeDlyHMSM(0,0,1,0);}}無限循環(huán)作者自定義的顯示函數(shù),在DOS窗口底部顯示任務(wù)數(shù)、CPU利用率等相關(guān)信息判斷是否有按鍵輸入如果按下鍵為Esc返回DOS環(huán)境如果沒有按下Esc鍵,記錄任務(wù)切換次數(shù)的全局變量OSCtxSwCtr清零,以便記錄下一秒內(nèi)發(fā)生的任務(wù)切換次數(shù)延時(shí)函數(shù),()中從左到右分別表示時(shí)、分、秒、毫秒。任務(wù)調(diào)用該函數(shù)將自身掛起1秒,交出CPU使用權(quán),內(nèi)核開始調(diào)度,找到下一個(gè)最高優(yōu)先級(jí)的就緒任務(wù)staticvoidTaskStartCreateTasks(void){INT8Ui;for(i=0;i<N_TASKS;i++){TaskData[i]='0'+i;OSTaskCreate(Task,(void*)&TaskData[i],&TaskStk[i][TASK_STK_SIZE-1],i+1);}}定義一個(gè)局部變量i返回第4頁給數(shù)組TaskData[]賦值,包含0~9的ASCII字符創(chuàng)建10個(gè)任務(wù),任務(wù)代碼完全相同,每個(gè)任務(wù)接受一個(gè)指向字符數(shù)組中不同元素的指針,即每個(gè)任務(wù)接受了一個(gè)不同的字符(0~9)。每個(gè)任務(wù)需分配自己的堆??臻g,且擁有一個(gè)獨(dú)一無二的優(yōu)先級(jí)voidTask(void*pdata){INT8Ux,y,err;
for(;;){OSSemPend(RandomSem,0,&err);x=random(80);y=random(16);OSSemPost(RandomSem);PC_DispChar(x,y+5,*(char*)pdata,DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);OSTimeDly(1);}}無限循環(huán)定義三個(gè)局部變量查詢信號(hào)量RandomSem,若該信號(hào)量正被其他任務(wù)占用,該任務(wù)被掛起,內(nèi)核開始調(diào)度。括號(hào)中第二個(gè)參數(shù)表示超時(shí)時(shí)限,這個(gè)值為0表示無限等待調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù),返回一個(gè)0~79的數(shù)值調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù),返回一個(gè)0~15的數(shù)值釋放信號(hào)量RandomSem在坐標(biāo)為(x,y+5)的位置顯示字符,前景色黑色,背景色淺灰色延遲一個(gè)時(shí)鐘節(jié)拍,延時(shí)期間該任務(wù)被掛起,內(nèi)核開始調(diào)度第三章μC/OS-II中斷和時(shí)鐘主要內(nèi)容μC/OS-II的中斷管理和中斷服務(wù)程序μC/OS-II的系統(tǒng)時(shí)鐘μC/OS-II的時(shí)間管理3.1μC/OS-II的中斷3.1.1、基本概念
中斷任務(wù)在運(yùn)行過程中,應(yīng)內(nèi)部或外部異步事件的請(qǐng)求中止當(dāng)前任務(wù),而去處理異步事件所要求的任務(wù)的過程
中斷服務(wù)子程序(InterruptServiceRoutines,ISR)應(yīng)中斷請(qǐng)求而運(yùn)行的程序
中斷向量中斷服務(wù)子程序的入口地址3.1.2
mC/OS-II的中斷
中斷的優(yōu)先級(jí)高于任務(wù);中斷嵌套可以多達(dá)255層;當(dāng)系統(tǒng)處于開中斷時(shí),中斷才會(huì)響應(yīng);只有所有中斷都完成后,才能返回到任務(wù);進(jìn)入中斷時(shí),中斷服務(wù)子程序必須調(diào)用OSIntEnter();退出中斷時(shí),中斷服務(wù)子程序必須調(diào)用OSIntExit()。用戶中斷服務(wù)子程序流程保存全部CPU寄存器;調(diào)用OSIntEnter()或OSIntNesting直接加1;If(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}清中斷源;重新開中斷;執(zhí)行用戶代碼做中斷服務(wù);調(diào)用OSIntExit();恢復(fù)所有CPU寄存器;執(zhí)行中斷返回指令;進(jìn)入中斷函數(shù)OSIntEnter()voidOSIntEnter(void){if(OSRunning==TRUE{if(OSIntNesting<255){OSIntNesting++;
}}}voidOSIntExit(void){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifOS_ENTER_CRITICAL();if(OSRunning==TRUE){if(OSIntNesting>0){OSIntNesting--;}if((OSIntNesting||OSLockNesting)==0){OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;
OSIntCtxSw();/*調(diào)用中斷切換函數(shù),而非任務(wù)切換函數(shù)*/}}}OS_EXIT_CRITICAL();}退出中斷函數(shù)OSIntExit()時(shí)鐘:任何操作系統(tǒng)都要提供一個(gè)周期性的信號(hào)源,以提供系統(tǒng)處理諸如延時(shí)、超時(shí)等與時(shí)間有關(guān)的事
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鐵路機(jī)車項(xiàng)目安全風(fēng)險(xiǎn)評(píng)價(jià)報(bào)告
- 2025年中國睡眠呼吸治療系統(tǒng)行業(yè)市場深度分析及發(fā)展趨勢預(yù)測報(bào)告
- 2025年石油加工及核燃料加工項(xiàng)目可行性研究報(bào)告
- 中國頭孢原料藥行業(yè)市場全景分析及投資規(guī)劃建議報(bào)告
- 現(xiàn)代與傳統(tǒng)元素的融合在高端酒店空間設(shè)計(jì)中的實(shí)踐探索
- 二零二五年度甲級(jí)商務(wù)辦公租賃免責(zé)協(xié)議書
- 電機(jī)系統(tǒng)項(xiàng)目可行性研究報(bào)告
- 2025年中國動(dòng)物醫(yī)療器械市場競爭格局及投資戰(zhàn)略規(guī)劃報(bào)告
- 山東省固體廢物處理項(xiàng)目可行性研究報(bào)告申請(qǐng)報(bào)告編制案例
- 電力設(shè)施日常維護(hù)保養(yǎng)計(jì)劃概覽
- 酒店春節(jié)營銷方案
- 營銷管理方案中的定價(jià)策略與盈利模式
- 2024年西寧城市職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 2024年臨沂市高三一模(學(xué)業(yè)水平等級(jí)考試模擬試題)物理試卷
- 廣州獵德大橋三維曲面塔清水混凝土施工技術(shù)
- 我國糖尿病視網(wǎng)膜病變臨床診療指南2022解讀
- Python數(shù)據(jù)挖掘?qū)崙?zhàn)全套教學(xué)課件
- 高級(jí)茶藝師技能鑒定(協(xié)會(huì)版)備考題庫-下(多選、判斷題匯總)
- 特種設(shè)備作業(yè)人員體檢表(叉車)
- c30混凝土路面施工方案
- 加強(qiáng)師德師風(fēng)建設(shè)學(xué)校師德師風(fēng)警示教育講座培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論