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

正文內(nèi)容

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

2025-03-27 20:14 本頁(yè)面
 

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