第三章 中斷與時鐘_第1頁
第三章 中斷與時鐘_第2頁
第三章 中斷與時鐘_第3頁
第三章 中斷與時鐘_第4頁
第三章 中斷與時鐘_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(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)用請求刪除任務(wù):OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級:OSTaskChangePrio()掛起任務(wù):OSTaskSuspend()空閑任務(wù)不能被掛起恢復(fù)任務(wù):OSTaskResume()被掛起的任務(wù)只能通過該函數(shù)恢復(fù)獲得任務(wù)信息:OSTaskQuery()獲得指定任務(wù)的OS_TCB中內(nèi)容的拷貝2.3例程解析共有10個任務(wù)在屏幕隨機(jī)的位置上顯示一個0~9的數(shù)字。每個任務(wù)只顯示同一個數(shù)字,也就是其中一個任務(wù)在隨機(jī)位置顯示0,另一個顯示1,等等。該例程目的在于演示mC/OS-II的多任務(wù)處理能力。#include"includes.h"includes.h是主控頭文件,包含所有相關(guān)的頭文件,從此可使用系統(tǒng)提供的數(shù)據(jù)類型、系統(tǒng)函數(shù)和全局變量等。#defineTASK_STK_SIZE512#defineN_TASKS10定義兩個常數(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()對μC/OS-II自身的運(yùn)行環(huán)境進(jìn)行初始化。函數(shù)OSInit()將對μC/OS-II的所有的全局變量和數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化,同時創(chuàng)建空閑任務(wù)OSTaskIdle,并賦之以最低的優(yōu)先級別和永遠(yuǎn)的就緒狀態(tài)。如果用戶應(yīng)用程序還要使用統(tǒng)計(jì)任務(wù)的話(常數(shù)OS_TASK_STAT_EN=1),則OSInit()還要以優(yōu)先級別為OS_LOWEST_PRIO-1來創(chuàng)建統(tǒng)計(jì)任務(wù)。初始化函數(shù)OSInit()對數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化時,主要要創(chuàng)建5個空數(shù)據(jù)緩沖區(qū)(任務(wù)控制塊、事件控制塊、消息隊(duì)列控制塊、標(biāo)志控制塊、存儲控制塊)。為了可以快速地查詢?nèi)蝿?wù)控制塊鏈表中的各個元素,初始化函數(shù)OSInit()還要創(chuàng)建一個數(shù)組OSTCBPrioTbl[OS_LOWEST_PRIO+1],在這個數(shù)組中,按任務(wù)的優(yōu)先級別的順序把任務(wù)控制塊的指針存放在了對應(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);/*建立一個信號量*/信號量是由mC/OS-II提供的一種機(jī)制,用于防止多個任務(wù)同時訪問同一資源(如產(chǎn)生隨機(jī)數(shù)的函數(shù))。這里信號量初值設(shè)置為1,通知mC/OS-II在某一時刻只有一個任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù)。該信號量建立函數(shù)返回一個指向信號量的指針。OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);/*在開始多任務(wù)之前,必須建立至少一個任務(wù)。這里建立了一個叫做TaskStart()的任務(wù)*/OSStart();/*將控制權(quán)交給mC/OS-II內(nèi)核,開始運(yùn)行多任務(wù)*/2.3.2μC/OS-II的啟動(OSStart()函數(shù))多任務(wù)的啟動是通過OSStart()實(shí)現(xiàn)的。在啟動mC/OS-II之前,至少須建立一個應(yīng)用任務(wù)。OSStart()函數(shù)完成以下兩個工作:從任務(wù)就緒表中找出用戶建立的優(yōu)先級最高的任務(wù)的任務(wù)控制塊,將該任務(wù)設(shè)為當(dāng)前任務(wù)。將上述任務(wù)的堆棧中保存的值彈回到CPU寄存器中,然后執(zhí)行一條中斷返回指令,強(qiáng)制執(zhí)行該任務(wù)代碼。當(dāng)OSStart()執(zhí)行后,即多任務(wù)啟動以后,系統(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定義了兩個宏(macros)來開中斷和關(guān)中斷:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()這兩個宏的定義取決于微處理器,在文件OS_CPU.H中可以找到相應(yīng)的宏定義,而每種微處理器都有自己的OS_CPU.H2.3.3臨界段代碼(criticalsections)代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。一旦這部分代碼開始執(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ù)的局部變量中,這個變量可以恢復(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ù)中多定義一個局部變量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ī)本來為時鐘節(jié)拍提供的中斷服務(wù)程序替換成mC/OS-II需要用到的時鐘節(jié)拍中斷服務(wù)程序設(shè)置時鐘節(jié)拍的頻率為200HzOS_TICKS_PER_SEC=200通過該函數(shù)得知處理器在運(yùn)行所有應(yīng)用任務(wù)時實(shí)際的CPU使用率這是作者自定義的一個函數(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ù),()中從左到右分別表示時、分、秒、毫秒。任務(wù)調(diào)用該函數(shù)將自身掛起1秒,交出CPU使用權(quán),內(nèi)核開始調(diào)度,找到下一個最高優(yōu)先級的就緒任務(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);}}定義一個局部變量i返回第4頁給數(shù)組TaskData[]賦值,包含0~9的ASCII字符創(chuàng)建10個任務(wù),任務(wù)代碼完全相同,每個任務(wù)接受一個指向字符數(shù)組中不同元素的指針,即每個任務(wù)接受了一個不同的字符(0~9)。每個任務(wù)需分配自己的堆??臻g,且擁有一個獨(dú)一無二的優(yōu)先級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)定義三個局部變量查詢信號量RandomSem,若該信號量正被其他任務(wù)占用,該任務(wù)被掛起,內(nèi)核開始調(diào)度。括號中第二個參數(shù)表示超時時限,這個值為0表示無限等待調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù),返回一個0~79的數(shù)值調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù),返回一個0~15的數(shù)值釋放信號量RandomSem在坐標(biāo)為(x,y+5)的位置顯示字符,前景色黑色,背景色淺灰色延遲一個時鐘節(jié)拍,延時期間該任務(wù)被掛起,內(nèi)核開始調(diào)度第三章μC/OS-II中斷和時鐘主要內(nèi)容μC/OS-II的中斷管理和中斷服務(wù)程序μC/OS-II的系統(tǒng)時鐘μC/OS-II的時間管理3.1μC/OS-II的中斷3.1.1、基本概念

中斷任務(wù)在運(yùn)行過程中,應(yīng)內(nèi)部或外部異步事件的請求中止當(dāng)前任務(wù),而去處理異步事件所要求的任務(wù)的過程

中斷服務(wù)子程序(InterruptServiceRoutines,ISR)應(yīng)中斷請求而運(yùn)行的程序

中斷向量中斷服務(wù)子程序的入口地址3.1.2

mC/OS-II的中斷

中斷的優(yōu)先級高于任務(wù);中斷嵌套可以多達(dá)255層;當(dāng)系統(tǒng)處于開中斷時,中斷才會響應(yīng);只有所有中斷都完成后,才能返回到任務(wù);進(jìn)入中斷時,中斷服務(wù)子程序必須調(diào)用OSIntEnter();退出中斷時,中斷服務(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()時鐘:任何操作系統(tǒng)都要提供一個周期性的信號源,以提供系統(tǒng)處理諸如延時、超時等與時間有關(guān)的事

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論