![第三章 中斷及時鐘_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/6bafc2b4-930a-4932-a7e7-9a6321140f08/6bafc2b4-930a-4932-a7e7-9a6321140f081.gif)
![第三章 中斷及時鐘_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/6bafc2b4-930a-4932-a7e7-9a6321140f08/6bafc2b4-930a-4932-a7e7-9a6321140f082.gif)
![第三章 中斷及時鐘_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/6bafc2b4-930a-4932-a7e7-9a6321140f08/6bafc2b4-930a-4932-a7e7-9a6321140f083.gif)
![第三章 中斷及時鐘_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/6bafc2b4-930a-4932-a7e7-9a6321140f08/6bafc2b4-930a-4932-a7e7-9a6321140f084.gif)
![第三章 中斷及時鐘_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/6bafc2b4-930a-4932-a7e7-9a6321140f08/6bafc2b4-930a-4932-a7e7-9a6321140f085.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)嵌入式系統(tǒng) Embedded System教師:白華教師:白華郵箱:郵箱:電話:電話公室:辦公室:4A-4092.2.4 任務的其他管理函數(shù)任務的其他管理函數(shù)堆棧檢驗:堆棧檢驗:OSTaskStkChk() 確定任務實際需要的堆??臻g大小確定任務實際需要的堆棧空間大小刪除任務:刪除任務:OSTaskDel() 任務休眠,任務代碼并未刪除,只是不再被調(diào)用任務休眠,任務代碼并未刪除,只是不再被調(diào)用請求刪除任務:請求刪除任務:OSTaskDelReq()改變?nèi)蝿盏膬?yōu)先級:改變?nèi)蝿盏膬?yōu)先級:OSTaskChangePrio()掛起任務:掛起任務:OSTaskSusp
2、end() 空閑任務不能被掛起空閑任務不能被掛起恢復任務:恢復任務:OSTaskResume() 被掛起的任務只能通過該函數(shù)恢復被掛起的任務只能通過該函數(shù)恢復獲得任務信息:獲得任務信息:OSTaskQuery() 獲得指定任務的獲得指定任務的OS_TCB中內(nèi)容的拷貝中內(nèi)容的拷貝2.3 例程解析例程解析共有共有10個任務在屏幕隨機的位置上顯示一個個任務在屏幕隨機的位置上顯示一個09的數(shù)字。的數(shù)字。每個任務只顯示同一個數(shù)字,也就是其中一個任務在隨每個任務只顯示同一個數(shù)字,也就是其中一個任務在隨機位置顯示機位置顯示0,另一個顯示,另一個顯示1,等等。,等等。該例程目的在于演示該例程目的在于演示m m
3、C/OS-II的多任務處理能力。的多任務處理能力。#include includes.hincludes.h是主控頭文件,包含所有相關(guān)的頭文是主控頭文件,包含所有相關(guān)的頭文件,從此可使用系統(tǒng)提供的數(shù)據(jù)類型、系統(tǒng)函數(shù)件,從此可使用系統(tǒng)提供的數(shù)據(jù)類型、系統(tǒng)函數(shù)和全局變量等。和全局變量等。#define TASK_STK_SIZE 512 #define N_TASKS 10定義兩個常數(shù):定義兩個常數(shù):TASK_STK_SIZE表示堆??扇菁{的表示堆棧可容納的指針元數(shù)目;指針元數(shù)目;N_TASKS表示需要建立的任務數(shù)。表示需要建立的任務數(shù)。OS_STK TaskStk N_TASKS TASK_ST
4、K_SIZE; OS_STK TaskStartStk TASK_STK_SIZE;char TaskData N_TASKS; OS_EVENT *RandomSem;定義不同類型的變量(或數(shù)組)定義不同類型的變量(或數(shù)組)void Task(void *data); void TaskStart(void *data); static void TaskStartCreateTasks(void);static void TaskStartDispInit(void);static void TaskStartDisp(void);自定義函數(shù)聲明自定義函數(shù)聲明前往第17頁void main
5、 (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();PC_DispClrScr()為系統(tǒng)函數(shù),具有為系統(tǒng)函數(shù),具有清屏功能。()中的參數(shù)表示前景色清屏功能。()中的參數(shù)表示前景色為白色,背景色為黑
6、色。為白色,背景色為黑色。void main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();非常重要的系統(tǒng)函數(shù),執(zhí)行非常重要的系統(tǒng)函數(shù),執(zhí)行C/OS-II的初始化。的初始化。l在使用在使用C/
7、OS-IIC/OS-II的所有服務之前,必須要調(diào)用的所有服務之前,必須要調(diào)用C/OS-IIC/OS-II的初始化的初始化函數(shù)函數(shù)OSInit( )OSInit( )對對C/OS-IIC/OS-II自身的運行環(huán)境進行初始化。自身的運行環(huán)境進行初始化。l函數(shù)函數(shù)OSInit( )OSInit( )將對將對C/OS-IIC/OS-II的所有的全局變量和數(shù)據(jù)結(jié)構(gòu)進行初的所有的全局變量和數(shù)據(jù)結(jié)構(gòu)進行初始化,同時創(chuàng)建空閑任務始化,同時創(chuàng)建空閑任務OSTaskIdleOSTaskIdle,并賦之以最低的優(yōu)先級別和,并賦之以最低的優(yōu)先級別和永遠的就緒狀態(tài)。如果用戶應用程序還要使用統(tǒng)計任務的話(常數(shù)永遠的就緒狀
8、態(tài)。如果用戶應用程序還要使用統(tǒng)計任務的話(常數(shù)OS_TASK_STAT_EN=1OS_TASK_STAT_EN=1),則),則OSInit( )OSInit( )還要以優(yōu)先級別為還要以優(yōu)先級別為OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1來創(chuàng)建統(tǒng)計任務。來創(chuàng)建統(tǒng)計任務。 l初始化函數(shù)初始化函數(shù)OSInit( )OSInit( )對數(shù)據(jù)結(jié)構(gòu)進行初始化時,主要要創(chuàng)建對數(shù)據(jù)結(jié)構(gòu)進行初始化時,主要要創(chuàng)建5 5個空個空數(shù)據(jù)緩沖區(qū)(任務控制塊、事件控制塊、消息隊列控制塊、標志控數(shù)據(jù)緩沖區(qū)(任務控制塊、事件控制塊、消息隊列控制塊、標志控制塊、存儲控制塊)。制塊、存儲控制塊)。l為了可以快
9、速地查詢?nèi)蝿湛刂茐K鏈表中的各個元素,初始化函數(shù)為了可以快速地查詢?nèi)蝿湛刂茐K鏈表中的各個元素,初始化函數(shù)OSInit( )OSInit( )還要創(chuàng)建一個數(shù)組還要創(chuàng)建一個數(shù)組OSTCBPrioTblOS_LOWEST_PRIO + 1OSTCBPrioTblOS_LOWEST_PRIO + 1,在這個數(shù)組中,按任務的優(yōu)先級別的順序把任務控制塊的指針存放在這個數(shù)組中,按任務的優(yōu)先級別的順序把任務控制塊的指針存放在了對應的元素中。在了對應的元素中。2.3.1 C/OS-IIC/OS-II的初始化(的初始化(OSInit()OSInit()函數(shù))函數(shù))void main (void) PC_DispCl
10、rScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();PC_DOSSaveReturn(); /* 返回到?jīng)]有運行返回到?jīng)]有運行mCOS-II之前的之前的DOS環(huán)境環(huán)境 */PC_VectSet(uCOS, OSCtxSw); /*
11、 指定任務切換處理函數(shù)指定任務切換處理函數(shù) */RandomSem = OSSemCreate(1); /* 建立一個信號量建立一個信號量 */信號量是由信號量是由m mC/OS-II提供的一種機制,用于防止多提供的一種機制,用于防止多個任務同時訪問同一資源(如產(chǎn)生隨機數(shù)的函數(shù))。個任務同時訪問同一資源(如產(chǎn)生隨機數(shù)的函數(shù))。這里信號量初值設(shè)置為這里信號量初值設(shè)置為1,通知,通知m mC/OS-II在某一時在某一時刻只有一個任務可以調(diào)用隨機數(shù)產(chǎn)生函數(shù)。該信號刻只有一個任務可以調(diào)用隨機數(shù)產(chǎn)生函數(shù)。該信號量建立函數(shù)返回一個指向信號量的指針。量建立函數(shù)返回一個指向信號量的指針。OSTaskCreat
12、e(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0);/* 在開始多任務之前,必須建立至少一個任務。這里建立了一個叫做在開始多任務之前,必須建立至少一個任務。這里建立了一個叫做TaskStart()的任務的任務 */OSStart(); /* 將控制權(quán)交給將控制權(quán)交給m mC/OS-II內(nèi)核,開始運行多任務內(nèi)核,開始運行多任務 */2.3.2 C/OS-IIC/OS-II的啟動(的啟動(OSStart()OSStart()函數(shù))函數(shù))多任務的啟動是通過多任務的啟動是通過OSStart()實現(xiàn)的。實現(xiàn)的。在啟動在啟動m mC
13、/OS-II之前,至少須建立一個應用任務。之前,至少須建立一個應用任務。OSStart()函數(shù)完成以下兩個工作:函數(shù)完成以下兩個工作:從任務就緒表中找出用戶建立的優(yōu)先級最高的任務的任務控制塊,從任務就緒表中找出用戶建立的優(yōu)先級最高的任務的任務控制塊,將該任務設(shè)為當前任務。將該任務設(shè)為當前任務。將上述任務的堆棧中保存的值彈回到將上述任務的堆棧中保存的值彈回到CPUCPU寄存器中,然后執(zhí)行一寄存器中,然后執(zhí)行一條中斷返回指令,強制執(zhí)行該任務代碼。條中斷返回指令,強制執(zhí)行該任務代碼。當當OSStart()執(zhí)行后,即多任務啟動以后,系統(tǒng)將在用戶任執(zhí)行后,即多任務啟動以后,系統(tǒng)將在用戶任務之間,或用戶任
14、務與系統(tǒng)任務之間切換,不再返回到主函務之間,或用戶任務與系統(tǒng)任務之間切換,不再返回到主函數(shù)數(shù)main()。void TaskStart (void *pdata) #if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr; #endif char s100; INT16S key; pdata = pdata; TaskStartDispInit(); OS_ENTER_CRITICAL(); PC_VectSet(0 x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OS
15、StatInit(); TaskStartCreateTasks(); 與進入臨界段代碼的方式有與進入臨界段代碼的方式有關(guān)關(guān)定義定義16位變量位變量key,用于按鍵輸入,用于按鍵輸入本任務無參數(shù)傳遞,未使用本任務無參數(shù)傳遞,未使用pdata,但為,但為了避免編譯器警告,故執(zhí)行該語句了避免編譯器警告,故執(zhí)行該語句初始化屏幕顯示,作者自定義的函數(shù),初始化屏幕顯示,作者自定義的函數(shù),詳見光盤中的源程序代碼詳見光盤中的源程序代碼處理臨界段代碼處理臨界段代碼1)處理臨界段代碼)處理臨界段代碼關(guān)中斷關(guān)中斷 處理完成后處理完成后開中斷開中斷 注:開注:開/關(guān)中斷的方法與編譯器相關(guān)。關(guān)中斷的方法與編譯器相關(guān)。
16、2)C/OS-II定義了兩個宏(定義了兩個宏(macros)來開中斷和關(guān)中斷:)來開中斷和關(guān)中斷: OS_ENTER_CRITICAL( ) OS_EXIT_CRITICAL( ) 這兩個宏的定義取決于微處理器,在文件這兩個宏的定義取決于微處理器,在文件OS_CPU.H中可以找到相應的中可以找到相應的宏定義,而每種微處理器都有自己的宏定義,而每種微處理器都有自己的OS_CPU.H2.3.3 臨界段代碼(臨界段代碼(critical sectionscritical sections)代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。一旦這部分代
17、碼開始執(zhí)行,則一旦這部分代碼開始執(zhí)行,則不允許任何中斷打入不允許任何中斷打入,因此在進,因此在進入臨界段之前必須關(guān)中斷,而臨界段代碼執(zhí)行完后,要立即開入臨界段之前必須關(guān)中斷,而臨界段代碼執(zhí)行完后,要立即開中斷。中斷。OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( )、 OS_EXIT_CRITICAL( )OS_EXIT_CRITICAL( )具體實現(xiàn)具體實現(xiàn)方法有方法有3 3種種1 1)OS_CRITICAL_MATHODOS_CRITICAL_MATHOD1 1 用處理器的關(guān)中斷指令完成用處理器的關(guān)中斷指令完成OS_ENTER_CRITICAL( )OS_EN
18、TER_CRITICAL( ) 用處理器的開中斷指令完成用處理器的開中斷指令完成OS_EXIT_CRITICAL( )OS_EXIT_CRITICAL( )2 2)OS_CRITICAL_MATHODOS_CRITICAL_MATHOD2 2 在堆棧中保存中斷的開在堆棧中保存中斷的開/ /關(guān)狀態(tài),然后再關(guān)中斷,實現(xiàn)關(guān)狀態(tài),然后再關(guān)中斷,實現(xiàn)OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( ) 從堆棧中彈出原來的中斷開從堆棧中彈出原來的中斷開/ /關(guān)狀態(tài),實現(xiàn)關(guān)狀態(tài),實現(xiàn)OS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) define OS
19、_ENTER_CRITICAL( ) asm(“push psw”) asm(“DI”)define OS_EXIT_CRITICAL( ) asm(“pop psw”) 3) OS_CRITICAL_MATHOD3 一些編譯器提供了擴展功能,用戶可以得到當前處理一些編譯器提供了擴展功能,用戶可以得到當前處理器狀態(tài)字的值,并保存在器狀態(tài)字的值,并保存在C函數(shù)的局部變量中,這個函數(shù)的局部變量中,這個變量可以恢復變量可以恢復PSW。 #define OS_ENTER_CRITICAL() cpu_sr = get_processor_psw(); disable_interrupts(); #de
20、fine OS_EXIT_CRITICAL() set_processor_psw(cpu_sr);如果使用這種方式保護臨界段代碼,則須在應用程序的相關(guān)如果使用這種方式保護臨界段代碼,則須在應用程序的相關(guān)函數(shù)中多定義一個局部變量函數(shù)中多定義一個局部變量cpu_srcpu_sr。void TaskStart (void *pdata) #if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr; #endif char s100; INT16S key; pdata = pdata; TaskStartDispInit(); OS_ENTER_CRITICAL();
21、PC_VectSet(0 x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); TaskStartCreateTasks(); 把計算機本來為時鐘節(jié)拍提供的中斷把計算機本來為時鐘節(jié)拍提供的中斷服務程序替換成服務程序替換成m mC/OS-II需要用到的需要用到的時鐘節(jié)拍中斷服務程序時鐘節(jié)拍中斷服務程序設(shè)置時鐘節(jié)拍的頻率為設(shè)置時鐘節(jié)拍的頻率為200HzOS_TICKS_PER_SEC = 200通過該函數(shù)得知處理器在運行所有應用任務通過該函數(shù)得知處理器在運行所有應用任務時實際的時實際
22、的CPU使用率使用率這是作者自定義的一個函數(shù),其作用是建立更多這是作者自定義的一個函數(shù),其作用是建立更多的任務的任務接上頁程序接上頁程序 for (;) TaskStartDisp(); if (PC_GetKey(&key) = TRUE) if (key = 0 x1B) PC_DOSReturn(); OSCtxSwCtr = 0; OSTimeDlyHMSM(0, 0, 1, 0); 無限循環(huán)無限循環(huán)作者自定義的顯示函數(shù),在作者自定義的顯示函數(shù),在DOS窗口底部顯窗口底部顯示任務數(shù)、示任務數(shù)、CPU利用率等相關(guān)信息利用率等相關(guān)信息判斷是否有按鍵輸入判斷是否有按鍵輸入如果按下鍵為
23、如果按下鍵為Esc返回返回DOS環(huán)境環(huán)境如果沒有按下如果沒有按下Esc鍵,記錄任務切換次數(shù)的鍵,記錄任務切換次數(shù)的全局變量全局變量OSCtxSwCtr清零,以便記錄下一清零,以便記錄下一秒內(nèi)發(fā)生的任務切換次數(shù)秒內(nèi)發(fā)生的任務切換次數(shù)延時函數(shù),()中從左到右分別表示時、分、秒、毫秒。任延時函數(shù),()中從左到右分別表示時、分、秒、毫秒。任務調(diào)用該函數(shù)將自身掛起務調(diào)用該函數(shù)將自身掛起1秒,交出秒,交出CPU使用權(quán),內(nèi)核開始使用權(quán),內(nèi)核開始調(diào)度,找到下一個最高優(yōu)先級的就緒任務調(diào)度,找到下一個最高優(yōu)先級的就緒任務static void TaskStartCreateTasks (void) INT8U i
24、; for (i = 0; i OSTCBStkPtr = SP;清中斷源;清中斷源;重新開中斷;重新開中斷;執(zhí)行用戶代碼做中斷服務;執(zhí)行用戶代碼做中斷服務;調(diào)用調(diào)用OSIntExit( );恢復所有恢復所有CPU寄存器;寄存器;執(zhí)行中斷返回指令;執(zhí)行中斷返回指令;進入中斷函數(shù)進入中斷函數(shù) OSIntEnter()void OSIntEnter (void) if (OSRunning = TRUE if ( OSIntNesting 0 ) OSIntNesting-; if (OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTb
25、lOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); /* 調(diào)用中斷切換函數(shù),而非任務切換函數(shù)調(diào)用中斷切換函數(shù),而非任務切換函數(shù) */ OS_EXIT_CRITICAL();退出中斷函數(shù)退出中斷函數(shù) OSIntExit()l時鐘:任何操作系統(tǒng)都要提供一個周期性的信號源,以提供系統(tǒng)處理諸如
26、時鐘:任何操作系統(tǒng)都要提供一個周期性的信號源,以提供系統(tǒng)處理諸如延時、超時等與時間有關(guān)的事件,這個周期性的信號源稱之為時鐘。延時、超時等與時間有關(guān)的事件,這個周期性的信號源稱之為時鐘。l時鐘節(jié)拍:最小的時鐘單位稱之為時鐘節(jié)拍(時鐘節(jié)拍:最小的時鐘單位稱之為時鐘節(jié)拍(Time Tick)。)。l硬件定時器以時鐘節(jié)拍為周期定時產(chǎn)生中斷,其服務子程序稱為硬件定時器以時鐘節(jié)拍為周期定時產(chǎn)生中斷,其服務子程序稱為OSTickISR()。()。l中斷服務程序調(diào)用中斷服務程序調(diào)用OSTimeTick()來完成系統(tǒng)在每個時鐘節(jié)拍需要做的()來完成系統(tǒng)在每個時鐘節(jié)拍需要做的工作如下:工作如下: (1)給計數(shù)器)給計數(shù)器OSTime1 (2)遍歷任務控制塊鏈表中的所有任務控制塊,把各個任務塊中用來存放任務延)遍歷任務控制塊鏈表中的所有任務控制塊,把各個任務塊中用來存放任
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字化營銷在零售行業(yè)中的應用
- 2025年全球及中國虛擬購物平臺行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球長焊頸法蘭行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球碳纖維管狀編織物行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球集成存儲解決方案行業(yè)調(diào)研及趨勢分析報告
- 思想道德修養(yǎng)與法律基礎(chǔ)
- 羅湖區(qū)政府投資項目代建合同范本
- 水電專業(yè)承包合同
- 政府采購項目的采購合同
- 大型高炮廣告牌制作合同
- pcn培訓培訓課件
- 山西省晉中市2023-2024學年高一上學期期末考試 數(shù)學 含解析
- 過錯方財產(chǎn)自愿轉(zhuǎn)讓協(xié)議書(2篇)
- 監(jiān)理專題安全例會紀要(3篇)
- 牧場物語-礦石鎮(zhèn)的伙伴們-完全攻略
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理體系 審核與認證機構(gòu)要求》中文版(機翻)
- 護理部工作總結(jié)
- 農(nóng)業(yè)生產(chǎn)質(zhì)量安全風險評估與監(jiān)控方案
- 人教版六年級上冊解方程練習300道及答案
- 2017年湖北省黃岡市中考語文(有解析)
- 2024年廣東省高考地理真題(解析版)
評論
0/150
提交評論