freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ucos-ii入門教程好好學(編輯修改稿)

2025-03-27 20:14 本頁面
 

【文章內(nèi)容簡介】 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }。 舉例: 如 OSRdyGrp的值為00101000B,即 0X28,則查得OSUnMapTbl[OSRdyGrp]的值是 3,它相應(yīng)于 OSRdyGrp中的第 3位置 1; 如 OSRdyTbl[3]的值是11100100B,即 0XE4,則查OSUnMapTbl[OSRdyTbl[3]]的值是 2,則進入就緒態(tài)的最高任務(wù)優(yōu)先級 Prio=3*8+2=26 小結(jié) 系統(tǒng)通過查找任務(wù)就緒表來 獲取待運行任務(wù)的優(yōu)先級 優(yōu)先級 任務(wù)切換過程 獲得待運行任務(wù)的任務(wù)控制塊 恢復待運行任務(wù)的運行環(huán)境 處理器的 PC=任務(wù)堆棧中的斷點地址 處理器的 SP=任務(wù)塊中保存的 SP 如何獲得待運行任務(wù)的任務(wù)控制塊? 根據(jù) 就緒表 獲得待運行任務(wù)的 任務(wù)控制塊指針其實,調(diào)度器在進行調(diào)度時,在這個位置還要進行一下判斷:究竟是待運行任務(wù)是否為當前任務(wù),如果是,則不切換;如果不是才切換,而且還要保存被中止任務(wù)的運行環(huán)境。 1. 任務(wù)切換宏 OS_TASK_SW( ) 任務(wù)切換就是中止正在運行的任務(wù)(當前任務(wù)),轉(zhuǎn)而去運行另外一個任務(wù)的操作,當然這個任務(wù)應(yīng)該是就緒任務(wù)中優(yōu)先級別最高的那個任務(wù) 先保護被中止任務(wù)的斷點數(shù)據(jù) 后恢復待運行任務(wù)的斷點數(shù)據(jù) 不要企圖用 PUSH和 POP指令來使程序計數(shù)器 PC壓棧和出棧,因為沒有這樣的指令。 只好變通一下了。 中斷動作和過程調(diào)用指令可以使 PC壓棧; 中斷返回指令可以使 PC出棧。 因此任務(wù)切換 OSCtxSw( )必定是一個中斷服務(wù)程序。 需要由宏 OS_TASK_SW( ) 來引發(fā)一次中斷或者一次調(diào)用來使 OSCtxSw( ) 執(zhí)行任務(wù)切換工作 調(diào)度時機 很容易想到的調(diào)度時機就 是定時調(diào)度。 對于實時系統(tǒng)來說,應(yīng)該盡 可能地實現(xiàn)即時調(diào)度。 用函數(shù) OSTaskCreate( ) 創(chuàng)建任務(wù) 應(yīng)用程序通過調(diào)用 OSTaskCreate( ) 函數(shù)來創(chuàng)建一個任務(wù) , OSTaskCreate( )函數(shù)的原型如下: INT8U OSTaskCreate ( void (*task)(void *pd),//指向任務(wù)的指針 void *pdata, //傳遞給任務(wù)的參數(shù) OS_STK *ptos, //指向任務(wù)堆棧棧頂?shù)闹羔? INT8U prio //任務(wù)的優(yōu)先級 ) 創(chuàng)建任務(wù) 的一般方法 一般來說 , 任務(wù)可以在調(diào)用函數(shù) OSStart( )啟動任務(wù)調(diào)度之前來創(chuàng)建 , 也可以在任務(wù)中來創(chuàng)建 。 但是 , μ C/OSII有一個規(guī)定:在調(diào)用啟動任務(wù)函數(shù) OSStart( )之前 , 必須已經(jīng)創(chuàng)建了至少一個任務(wù) 。 因此 , 人們習慣上在調(diào)用函數(shù)OSStart( )之前先創(chuàng)建一個任務(wù) , 并賦予它最高的優(yōu)先級別 , 從而使它成為起始任務(wù) 。 然后在這個起始任務(wù)中 , 再創(chuàng)建其他各任務(wù) 。 如果要使用系統(tǒng)提供的統(tǒng)計任務(wù),則統(tǒng)計任務(wù)的初始化函數(shù)也必須在這個起始任務(wù)中來調(diào)用 void main(void) { …… OSInit( )。 //對 μC/OSII進行初始化 …… OSTaskCreate (TaskStart,…… )。//創(chuàng)建任務(wù) TaskStart OSStart( )。 //開始多任務(wù)調(diào)度 } void TaskStart(void*pdata) { …… //在這個位置安裝并啟動 μC/OSII的時鐘 OSStatInit( )。 //初始化統(tǒng)計任務(wù) …… //在這個位置創(chuàng)建其他任務(wù) for(。) { 起始任務(wù) TaskStart的代碼 } } 在使用 μC/OSII的所有服務(wù)之前,必須要調(diào)用 μC/OSII的初始化函數(shù) OSInit( )對 μC/OSII自身的運行環(huán)境進行初始化 。 函數(shù) OSInit( )將對 μ C/OSII的所有的全局變量和數(shù)據(jù)結(jié)構(gòu)進行初始化,同時創(chuàng)建空閑任務(wù) OSTaskIdle,并賦之以最低的優(yōu)先級別和永遠的就緒狀態(tài)。如果用戶應(yīng)用程序還要使用統(tǒng)計任務(wù)的話(常數(shù) OS_TASK_STAT_EN=1),則OSInit( )還要以優(yōu)先級別為OS_LOWEST_PRIO1來創(chuàng)建統(tǒng)計任務(wù) 初始化函數(shù) OSInit( )對數(shù)據(jù)結(jié)構(gòu)進行初始化時,主要要創(chuàng)建包括空任務(wù)控制塊鏈表在內(nèi)的 5個空數(shù)據(jù)緩沖區(qū)。同時,為了可以快速地查詢?nèi)蝿?wù)控制塊鏈表中的各個元素,初始化函數(shù) OSInit( )還要創(chuàng)建一個數(shù)組OSTCBPrioTbl[OS_LOWEST_PRIO + 1],在這個數(shù)組中,按任務(wù)的優(yōu)先級別的順序把任務(wù)控制塊的指針存放在了對應(yīng)的元素中 μ C/OSII進行任務(wù)的管理是從調(diào)用啟動函數(shù) OSStart( )開始的,當然其前提條件是在調(diào)用該函數(shù)之前至少創(chuàng)建了一個用戶任務(wù) 第 3章 μ C/OSⅡ 的中斷和時鐘 本章主要內(nèi)容: μ C/OSII系統(tǒng) 響應(yīng)中斷的過程 μC/OSII系統(tǒng)響應(yīng)中斷的過程為:系統(tǒng)接收到中斷請求后 , 這時如果CPU處于中斷允許狀態(tài) ( 即中斷是開放的 ) , 系統(tǒng)就會中止正在運行的當前任務(wù) , 而按照中斷向量的指向轉(zhuǎn)而去運行中斷服務(wù)子程序;當中斷服務(wù)子程序的運行結(jié)束后 , 系統(tǒng)將會根據(jù)情況返回到被中止的任務(wù)繼續(xù)運行或者轉(zhuǎn)向運行另一個具有更高優(yōu)先級別的就緒任務(wù) 。 注意 ! 中斷服務(wù)子程序運行結(jié)束之后 , 系統(tǒng)將會根據(jù)情況進行一次任務(wù)調(diào)度去運行優(yōu)先級別最高的就緒任務(wù) , 而并不是一定要接續(xù)運行被中斷的任務(wù)的 。 中斷請求 關(guān)閉中斷 轉(zhuǎn)到中斷向量 保存 CPU寄存器 通知內(nèi)核退出ISR ISR給任務(wù)發(fā)信號 中斷返回 恢復 CPU寄存器 中斷響應(yīng) 中斷恢復 中斷恢復 任務(wù)響應(yīng)時間 任務(wù)響應(yīng)時間 中斷的響應(yīng)過程 無新高級任務(wù)則返回原任務(wù) 通知內(nèi)核退出ISR 恢復 CPU寄存器 中斷返回 有新高級任務(wù)則運行高級任務(wù) 通知內(nèi)核進入ISR void OSIntEnter (void) { if (OSRunning == TRUE) { if (OSIntNesting 255) { OSIntNesting++。 //中斷嵌套層數(shù)計數(shù)器加一 } } } void OSIntExit (void) { if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr。 endif if (OSRunning == TRUE) { OS_ENTER_CRITICAL( )。 if (OSIntNesting 0) { OSIntNesting。 //中斷嵌套層數(shù)計數(shù)器減一 } if ((OSIntNesting == 0) (OSLockNesting == 0)) { OSIntExitY = OSUnMapTbl[OSRdyGrp]。 OSPrioHighRdy = (INT8U)((OSIntExitY 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]])。 if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]。 OSCtxSwCtr++。 OSIntCtxSw( )。 } } OS_EXIT_CRITICAL( )。 } } 在中斷服務(wù)程序中調(diào)用的負責任務(wù)切換工作的函數(shù)OSIntCtxSw( )叫做中斷級任務(wù)切換函數(shù) OSIntCtxSw( ) { OSTCBCur = OSTCBHighRdy。 //任務(wù)控制塊的切換 OSPrioCur=OSPrioHighRdy。 SP = OSTCBHighRdyOSTCBStkPtr。 //SP指向待運行任務(wù)堆棧 用出棧指令把 R1,R2,…… 彈入 CPU的通用寄存器; RETI。 //中斷返回,使 PC指向待運行任務(wù) } 應(yīng)用程序中的 臨界段 在應(yīng)用程序中經(jīng)常有一些代碼段必須不受任何干擾地連續(xù)運行,這樣的代碼段叫做臨界段。因此,為了使臨界段在運行時不受中斷所打斷,在臨界段代碼前必須用關(guān)中斷指令使 CPU屏蔽中斷請求,而在臨界段代碼后必須用開中斷指令解除屏蔽使得 CPU可以響應(yīng)中斷請求 由于各廠商生產(chǎn)的 CPU和 C編譯器的關(guān)中斷和開中斷的方法和指令不盡相同 , 為增強μ C/OSII的可移植性 ( 即在 μ C/OSII的各個 C函數(shù)中盡可能地不出現(xiàn)匯編語言代碼 ) , μ C/OSII用兩個宏來實現(xiàn)中斷的開放和關(guān)閉 , 而把與系統(tǒng)的硬件相關(guān)的關(guān)中斷和開中斷的指令分別封裝在這兩個宏中: OS_ENTER_CRITICAL( ) OS_EXIT_CRITICAL( ) 第一種方法最簡單,即直接使用處理器的開中斷和關(guān)中斷指令來實現(xiàn)宏,這時需要令常數(shù) OS_CRITICAL_METHOD=1。其示意性代碼為: define OS_ENTER_CRITICAL( )\ asm(“ DI” ) \\關(guān)中斷 define OS_EXIT_CRITICAL( )\ asm(“ EI” ) \\開中斷 第二種方法稍微復雜一些 , 但可以使 CPU中斷允許標志的狀態(tài) , 在臨界段前和臨界段后不發(fā)生改變 。 在宏OS_ENTER_CRITICAL( )中 , 把 CPU的允許中斷標志保持到堆棧中 , 然后再關(guān)閉中斷 , 這樣在臨界段結(jié)束時 , 即在調(diào)用宏 OS_EXIT_CRITICAL( )時只要把堆棧中保存的CPU允許中斷狀態(tài)恢復就可以了 。 這兩個宏的示意性代碼如下 : define OS_ENTER_CRITICAL( ) \ asm(“ PUSH PSW” ) \ /*通過保存程序狀態(tài)字來保存中 斷允許標志 */ asm(“ DI” ) //關(guān)中斷 define OS_EXIT_CRITICAL( ) asm(“ POP PSW” ) //恢復
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1