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

正文內(nèi)容

ucos-ii入門教程好好學(xué)(更新版)

2025-04-04 20:14上一頁面

下一頁面
  

【正文】 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。 OSCtxSwCtr++。 注意 ! 中斷服務(wù)子程序運行結(jié)束之后 , 系統(tǒng)將會根據(jù)情況進(jìn)行一次任務(wù)調(diào)度去運行優(yōu)先級別最高的就緒任務(wù) , 而并不是一定要接續(xù)運行被中斷的任務(wù)的 。 //對 μC/OSII進(jìn)行初始化 …… OSTaskCreate (TaskStart,…… )。 因此任務(wù)切換 OSCtxSw( )必定是一個中斷服務(wù)程序。 //D D D0位 prio = (y3)+x。 OSRdyTbl[prio3] | = OSMapTbl[prio0x07]。 由于這些任務(wù)控制塊還沒有對應(yīng)的任務(wù),故這個鏈表叫做空任務(wù)塊鏈表。 //指向任務(wù)堆棧棧頂?shù)闹羔? …… struct os_tcb *OSTCBNext。該常數(shù)一旦被定義,則意味著系統(tǒng)中可供使用的優(yōu)先級別為: 0, 1, 2, …… ,OS_LOWEST_PRIO,共 OS_LOWEST_PRIO+1個 固定地,系統(tǒng)總是把最低優(yōu)先級別OS_LOWEST_PRIO自動賦給空閑任務(wù)。 endif pdata = pdata。 任務(wù)控制塊結(jié)構(gòu)的主要成員 typedef struct os_tcb { OS_STK *OSTCBStkPtr。 處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)度器判斷獲得了CPU的使用權(quán),則任務(wù)就進(jìn)入運行狀態(tài) 一個正在運行的任務(wù)一旦響應(yīng)中斷申請就會中止運行而去執(zhí)行中斷服務(wù)程序,這時任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài) 前面談到,一個任務(wù)的任務(wù)控制塊 的主要作用就是保存該任務(wù)的虛擬 處理器的堆棧指針寄存器 SP。 程序代碼、私有堆棧、任 務(wù)控制塊 是任務(wù)的三要件。 這些內(nèi)容通常保存在任務(wù)堆棧中,這些內(nèi)容也常叫做任務(wù)的上下文。 所謂切換就是: PC 目標(biāo)地址 如何操作 PC 指令: 不同的計算機類型的指令是不同的。檢索速度 慢, 且耗費的 時間不固定 ; 應(yīng)用: 存放大量的較大 的表,類似檔案柜 操作系統(tǒng)中經(jīng)常使用 的數(shù)據(jù)結(jié)構(gòu)(隊列) 按照 先進(jìn)先出 的規(guī)則組織的數(shù)據(jù)結(jié)構(gòu) 可以用 數(shù)組 也可以用 鏈 表 來實現(xiàn) 主要用于對象的排隊 操作系統(tǒng)中經(jīng)常使用 的數(shù)據(jù)結(jié)構(gòu)(堆棧) 按照 先進(jìn)后出 規(guī)則組織的數(shù)據(jù)結(jié)構(gòu) 主要用數(shù)組來實現(xiàn) 主要用于 程序模塊的嵌套運行 什么是多任務(wù)系統(tǒng) 簡單地說,就是能用一個處理器 并發(fā)(注意,不是同時! ) 地運行多個程序的計算機管理系統(tǒng)。 char*name。不同數(shù)據(jù)類型數(shù)據(jù)的集合; 2。同一數(shù)據(jù)類型數(shù)據(jù)的集合; 2。 。 二 .對于初學(xué)者,從 μC/OSII開始是個明智的選擇。所以也把它叫做應(yīng)用軟件的運行 平臺 。元素名去掉編號(下標(biāo)),得到的是數(shù)組名,數(shù)組名是個指針。 char sex。 1。 且在占用這個資源期間,并不一 定能夠把程序運行完畢。程序的斷點地址( PC) 2。 //指向任務(wù)堆棧棧頂?shù)闹羔? …… INT8U OSTCBStat。 在 μ C/OSII中,與上述那些小任務(wù)對應(yīng)的程序?qū)嶓w就叫做“任務(wù)”(實質(zhì)上是一個線程), μ C/OSII就是一個能對這些小任務(wù)的運行進(jìn)行管理和調(diào)度的多任務(wù)操作系統(tǒng)。識別一個任務(wù) 的最直接的辦法是為每一個任務(wù)起一 個名稱。 //任務(wù)的優(yōu)先級別 …… } OS_TCB。//關(guān)閉中斷 OSdleCtr++。 typedef unsigned int OS_STK。 //任務(wù)等待的時限 ( 節(jié)拍數(shù) ) INT8U OSTCBStat。 所謂調(diào)度 , 就是通過一個算法在多個任務(wù)中確定該運行的任務(wù) , 做這項工作的函數(shù)就叫做調(diào)度器 。 如果要使一個優(yōu)先級別為 prio的任務(wù)脫離就緒狀態(tài)則可使用如下類似代碼: if((OSRdyTbl[prio3]=~OSMapTbl[prio0x07])==0) OSRdyGrp=~OSMapTbl[prio3]。 優(yōu)先級判定表 OSUnMapTbl[256] ( ) INT8U const OSUnMapTbl[] = { 0, 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, 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 }。 用函數(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)建 。 //初始化統(tǒng)計任務(wù) …… //在這個位置創(chuàng)建其他任務(wù) for(。 endif if (OSRunning == TRUE) { OS_ENTER_CRITICAL( )。 } } 在中斷服務(wù)程序中調(diào)用的負(fù)責(zé)任務(wù)切換工作的函數(shù)OSIntCtxSw( )叫做中斷級任務(wù)切換函數(shù) OSIntCtxSw( ) { OSTCBCur = OSTCBHighRdy。 這兩個宏的示意性代碼如下 : define OS_ENTER_CRITICAL( ) \ asm(“ PUSH PSW” ) \ /*通過保存程序狀態(tài)字來保存中 斷允許標(biāo)志 */ asm(“ DI” ) //關(guān)中斷 define OS_EXIT_CRITICAL( ) asm(“ POP PSW” ) //恢復(fù)中斷允許標(biāo)志 μC/OSII的 系統(tǒng)時鐘 μC/OSII與大多數(shù)計算機系統(tǒng)一樣 , 用硬件定時器產(chǎn)生 一個周期為 ms級的周期性中斷來實現(xiàn)系統(tǒng)時鐘 , 最小 的 時鐘單位就是兩次中斷之間相間隔的時間 , 這個最小時鐘單位叫做 時鐘節(jié)拍 ( Time Tick) 。 //中斷嵌套層數(shù)減一 恢復(fù) CPU寄存器; 中斷返回; } 這是系統(tǒng)時鐘中斷服務(wù)程序 void OSTimeTick (void) { …… OSTimeTickHook( )。 OS_EXIT_CRITICAL( )。 OS_Sched( )。顯然,當(dāng)任務(wù) A還未向緩沖區(qū)寫入數(shù)據(jù)時(緩沖區(qū)為空時),任務(wù) B因不能從緩沖區(qū)得到有效數(shù)據(jù)而應(yīng)該處于等待狀態(tài),只有等任務(wù) A向緩沖區(qū)寫入了數(shù)據(jù)之后,才應(yīng)該通知任務(wù) B去取數(shù)據(jù)。 //事件的類型 INT16U OSEventCnt。 這時要調(diào)用 OS_EventTaskRdy( )函數(shù) 。而當(dāng)應(yīng)用程序刪除一個事件時,就會將該事件的控制塊歸還給空事件控制塊鏈表 信號量及其操作 在使用信號量之前 , 應(yīng)用程序必須調(diào)用函數(shù)OSSemCreate( )來創(chuàng)建一個信號量 ,OSSemCreate( )的原型為: OS_EVENT *OSSemCreate ( INT16U t //信號量計數(shù)器初值 ); 函數(shù)的返回值為已創(chuàng)建的信號量的指針 。 應(yīng)用程序如果不需要某個信號量了 , 那么可以調(diào)用函數(shù)OSSemDel( )來刪除該信號量 , 這個函數(shù)的原型為: OS_EVENT *OSSemDel ( OS_EVENT *pevent, //信號量的指針 INT8U opt, //刪除條件選項 INT8U *err //錯誤信息 ); 在可剝奪型內(nèi)核中,當(dāng)任務(wù)以獨占方式使用共享資源時,會出現(xiàn)低優(yōu)先級任務(wù)先于高優(yōu)先級任務(wù)而被運行的現(xiàn)象,這種現(xiàn)象叫做任務(wù)優(yōu)先級反轉(zhuǎn) 。 在描述互斥型信號量的事件控制塊中,除了成員 OSEventType要賦以常數(shù)OS_EVENT_TYPE_MUTEX以表明這是一個互斥型信號量和仍然沒有使用成員OSEventPtr之外,成員 OSEventCnt被分成了低8位和高8位兩部分:低8位用來存放信號值(該值為 0xFF時,信號為有效,否則信號為無效),高8位用來存放為了避免出現(xiàn)優(yōu)先級反轉(zhuǎn)現(xiàn)象而要提升的優(yōu)先級別 prio。 任務(wù)可以通過調(diào)用函數(shù) OSMboxPost ( )向消息郵箱發(fā)送消息 , 這個函數(shù)的原型為: INT8U OSMboxPost ( OS_EVENT *pevent, //消息郵箱指針 void *msg //消息指針 ); 當(dāng)一個任務(wù)請求郵箱時需要調(diào)用函數(shù) OSMboxPend( ), 這個函數(shù)的主要作用就是查看郵箱指針 OSEventPtr是否為NULL, 如果不是 NULL就把郵箱中的消息指針返回給調(diào)用函數(shù)的任務(wù) , 同時用 OS_NO_ERR通過函數(shù)的參數(shù) err通知任務(wù)獲取消息成功;如果郵箱指針 OSEventPtr是 NULL,則使任務(wù)進(jìn)入等待狀態(tài) , 并引發(fā)一次任務(wù)調(diào)度 。也就是說,從效果上來看,指針 OSQEnd與OSQStart等值。 INT16U OSQEntries。 函數(shù) OSQPost( )以 FIFO( 先進(jìn)先出 ) 的方式組織消息隊列 , 函數(shù) OSQPostFront( )以 LIFO( 后進(jìn)先出 ) 的方式組織消息隊列 。 //識別是否為信號量集的標(biāo)志 void *OSFlagWaitList。 //指向前一個節(jié)點的指針 void *OSFlagNodeTCB。 OSFlagCreate ( )的函數(shù)原型為: OS_FLAG_GRP *OSFlagCreate ( OS_FLAGS flags, //信號的初始值 INT8U *err
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1