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

正文內(nèi)容

ucos-ii入門教程好好學(xué)-資料下載頁

2025-03-09 20:14本頁面
  

【正文】 Del ( OS_EVENT *pevent, //信號量的指針 INT8U opt, //刪除條件選項 INT8U *err //錯誤信息 ); 在可剝奪型內(nèi)核中,當任務(wù)以獨占方式使用共享資源時,會出現(xiàn)低優(yōu)先級任務(wù)先于高優(yōu)先級任務(wù)而被運行的現(xiàn)象,這種現(xiàn)象叫做任務(wù)優(yōu)先級反轉(zhuǎn) 。在一般情況下是不允許出現(xiàn)這種任務(wù)優(yōu)先級反轉(zhuǎn)現(xiàn)象的,下面就對優(yōu)先級的反轉(zhuǎn)現(xiàn)象做一個詳細的分析,以期找出原因及解決方法。 圖 415描述了 A、 B、 C三個任務(wù)的運行情況。其中,任務(wù) A的優(yōu)先級別高于任務(wù) B,任務(wù) B的優(yōu)先級別高于任務(wù) C。任務(wù) A和任務(wù) C都要使用同一個共享資源 S,而用于保護該資源的信號量在同一時間只能允許一個任務(wù)以獨占的方式對該資源進行訪問,即這個信號量是一個互斥型信號量。 通過例子可以發(fā)現(xiàn),使用信號量的任務(wù)是否能夠運行是受任務(wù)的優(yōu)先級別和是否占用信號量兩個條件約束的,而信號量的約束高于優(yōu)先級別的約束。于是當出現(xiàn)低優(yōu)先級別的任務(wù)與高優(yōu)先級別的任務(wù)使用同一個信號量,而系統(tǒng)中還存有別的中等優(yōu)先級別的任務(wù)時,如果低優(yōu)先級別的任務(wù)先獲得了信號量,就會使高級別的任務(wù)處于等待狀態(tài),而那些不使用該信號量的中等級別的任務(wù)卻可以剝奪低優(yōu)先級別的任務(wù)的 CPU使用權(quán)而先于高優(yōu)先級別的任務(wù)而運行了。 解決問題的辦法之一,是使獲得信號量任務(wù)的優(yōu)先級別在使用共享資源期間暫時提升到所有任務(wù)最高優(yōu)先級的高一個級別上,以使該任務(wù)不被其他的任務(wù)所打斷,從而能盡快地使用完共享資源并釋放信號量,然后在釋放了信號量之后再恢復(fù)該任務(wù)原來的優(yōu)先級別。 在描述互斥型信號量的事件控制塊中,除了成員 OSEventType要賦以常數(shù)OS_EVENT_TYPE_MUTEX以表明這是一個互斥型信號量和仍然沒有使用成員OSEventPtr之外,成員 OSEventCnt被分成了低8位和高8位兩部分:低8位用來存放信號值(該值為 0xFF時,信號為有效,否則信號為無效),高8位用來存放為了避免出現(xiàn)優(yōu)先級反轉(zhuǎn)現(xiàn)象而要提升的優(yōu)先級別 prio。 創(chuàng)建互斥型信號量需要調(diào)用函數(shù) OSMutexCreate( )。 函數(shù)OSMutexCreate( )的原型如下: OS_EVENT *OSMutexCreate ( INT8U prio, //優(yōu)先級別 INT8U *err //錯誤信息 ); 函數(shù) OSMutexCreate( )從空事件控制塊鏈表獲取一個事件控制塊 , 把成員 OSEventType賦以常數(shù) OS_EVENT_TYPE_MUTEX以表明這是一個互斥型信號量 , 然后再把成員 OSEventCnt的高8 位賦以 p r i o ( 欲提升的優(yōu)先級別 ) , 低 8 位賦以常數(shù)OS_MUTEX_AVAILABLE( 該常數(shù)值為 0xFFFF) 的低 8位( 0xFF) 以表明信號量尚未被任何任務(wù)所占用 , 處于有效狀態(tài) 。 當任務(wù)需要訪問一個獨占式共享資源時 , 就要調(diào)用函數(shù) OSMutexPend( )來請求管理這個資源的互斥型信號量 , 如果信號量有信號 ( OSEventCnt的低 8位為 0xFF) ,則意味著目前尚無任務(wù)占用資源 , 于是任務(wù)可以繼續(xù)運行并對該資源進行訪問 , 否則就進入等待狀態(tài) , 直至占用這個資源的其他任務(wù)釋放了該信號量 。 函數(shù) OSMutexPend( )的原型為: void OSMutexPend ( OS_EVENT *pevent, //互斥型信號量指針 INT16U timeout, //等待時限 INT8U *err //錯誤信息 ); 任務(wù)可以通過調(diào)用函數(shù) OSMutexPost( )發(fā)送一個互斥型信號量,這個函數(shù)的原型為: INT8U OSMutexPost ( OS_EVENT *pevent //互斥型信號量指針 ); 如果把數(shù)據(jù)緩沖區(qū)的指針賦給一個事件控制塊的成員 OSEventPrt,同時使事件控制塊的成員 OSEventType為常數(shù)OS_EVENT_TYPE_MBOX,則該事件控制塊就叫做消息郵箱,消息郵箱是在兩個需要通信的任務(wù)之間通過傳遞數(shù)據(jù)緩沖區(qū)指針的方法來通信的。 創(chuàng)建郵箱需要調(diào)用函數(shù) OSMboxCreate ( ), 這個函數(shù)的原型為: OS_EVENT *OSMboxCreate ( void *msg //消息指針 ); 函數(shù)中的參數(shù) msg為消息的指針 , 函數(shù)的返回值為消息郵箱的指針 。 調(diào)用函數(shù) OSMboxCreate ( )需先定義 msg的初始值。在一般的情況下,這個初始值為 NULL;但也可以事先定義一個郵箱,然后把這個郵箱的指針作為參數(shù)傳遞到函數(shù) OSMboxCreate ( )中,使之一開始就指向一個郵箱。 任務(wù)可以通過調(diào)用函數(shù) OSMboxPost ( )向消息郵箱發(fā)送消息 , 這個函數(shù)的原型為: INT8U OSMboxPost ( OS_EVENT *pevent, //消息郵箱指針 void *msg //消息指針 ); 當一個任務(wù)請求郵箱時需要調(diào)用函數(shù) OSMboxPend( ), 這個函數(shù)的主要作用就是查看郵箱指針 OSEventPtr是否為NULL, 如果不是 NULL就把郵箱中的消息指針返回給調(diào)用函數(shù)的任務(wù) , 同時用 OS_NO_ERR通過函數(shù)的參數(shù) err通知任務(wù)獲取消息成功;如果郵箱指針 OSEventPtr是 NULL,則使任務(wù)進入等待狀態(tài) , 并引發(fā)一次任務(wù)調(diào)度 。 函數(shù) OSMboxPend( )的原型為: void *OSMboxPend ( OS_EVENT *pevent, //請求消息郵箱指針 INT16U timeout, //等待時限 INT8U *err //錯誤信息 ); 使用消息隊列可以在任務(wù)之間傳遞多條消息 。 消息隊列由三個部分組成:事件控制塊 、 消息隊列和消息 。 當把事件控制塊成員 O S E v e n t T y p e的值置為OS_EVENT_TYPE_Q時 , 該事件控制塊描述的就是一個消息隊列 。 消息隊列的數(shù)據(jù)結(jié)構(gòu)如圖 421所示。從圖中可以看到,消息隊列相當于一個共用一個任務(wù)等待列表的消息郵箱數(shù)組,事件控制塊成員 OSEventPtr指向了一個叫做隊列控制塊( OS_Q)的結(jié)構(gòu),該結(jié)構(gòu)管理了一個數(shù)組 MsgTbl[ ],該數(shù)組中的元素都是一些指向消息的指針。 其中,可以移動的指針為 OSQIn和 OSQOut,而指針OSQStart和 OSQEnd只是一個標志(常指針)。當可移動的指針 OSQIn或 OSQOut移動到數(shù)組末尾,也就是與 OSQEnd相等時,可移動的指針將會被調(diào)整到數(shù)組的起始位置OSQStart。也就是說,從效果上來看,指針 OSQEnd與OSQStart等值。于是,這個由消息指針構(gòu)成的數(shù)組就頭尾銜接起來形成了一個如圖所示的循環(huán)的隊列。 為了對圖所示的消息指針數(shù)組進行有效的管理 ,μC/OSII把消息指針數(shù)組的基本參數(shù)都記錄在一個叫做隊列控制塊的結(jié)構(gòu)中 , 隊列控制塊的結(jié)構(gòu)如下: typedef struct os_q { struct os_q *OSQPtr。 void **OSQStart。 void **OSQEnd。 void **OSQIn。 void **OSQOut。 INT16U OSQSize。 INT16U OSQEntries。 } OS_Q。 在 μC/OSII初始化時,系統(tǒng)將按文件 OS_MAX_QS定義 OS_MAX_QS個隊列控制塊,并用隊列控制塊中的指針 OSQPtr將所有隊列控制塊鏈接為鏈表。由于這時還沒有使用它們,故這個鏈表叫做空隊列控制塊鏈表 創(chuàng)建一個消息隊列首先需要定義一指針數(shù)組 , 然后把各個消息數(shù)據(jù)緩沖區(qū)的首地址存入這個數(shù)組中 , 然后再調(diào)用函數(shù) OSQCreate( )來創(chuàng)建消息隊列 。 創(chuàng)建消息隊列函數(shù)OSQCreate( )的原型為: OS_EVENT OSQCreate( void**start, //指針數(shù)組的地址 INT16U size //數(shù)組長度 )。 請求消息隊列的目的是為了從消息隊列中獲取消息 。 任務(wù)請求消息隊列需要調(diào)用函數(shù) OSQPend( ), 該函數(shù)的原型為: void*OSQPend( OS_EVENT*pevent, //所請求的消息隊列的指針 INT16U timeout, //等待時限 INT8U*err //錯誤信息 )。 任務(wù)需要通過調(diào)用函數(shù) OSQPost( )或 OSQPostFront( )來向消息隊列發(fā)送消息 。 函數(shù) OSQPost( )以 FIFO( 先進先出 ) 的方式組織消息隊列 , 函數(shù) OSQPostFront( )以 LIFO( 后進先出 ) 的方式組織消息隊列 。 這兩個函數(shù)的原型分別為: INT8U OSQPost( OS_EVENT*pevent, //消息隊列的指針 void*msg //消息指針 )。 和 INT8U OSQPost( OS_EVENT*pevent, //消息隊列的指針 void*msg //消息指針 )。 函數(shù)中的參數(shù) msg為待發(fā)消息的指針。 在實際應(yīng)用中 , 任務(wù)常常需要與多個事件同步 ,即要根據(jù)多個信號量組合作用的結(jié)果來決定任務(wù)的運行方式 。 μC/OSII為了實現(xiàn)多個信號量組合的功能定義了一種特殊的數(shù)據(jù)結(jié)構(gòu) —— 信號量集 。 信號量集所能管理的信號量都是一些二值信號,所有信號量集實質(zhì)上是一種可以對多個輸入的邏輯信號進行基本邏輯運算的組合邏輯,其示意圖如圖 51所示 不同于信號量 、 消息郵箱 、 消息隊列等事件 , μC/OSII不使用事件控制塊來描述信號量集 , 而使用了一個叫做標志組的結(jié)構(gòu) OS_FLAG_GRP。 OS_FLAG_GRP結(jié)構(gòu)如下: typedef struct{ INT8U OSFlagType。 //識別是否為信號量集的標志 void *OSFlagWaitList。//指向等待任務(wù)鏈表的指針 OS_FLAGS OSFlagFlags。 //所有信號列表 }OS_FLAG_GRP。 成員 OSFlagWaitList是一個指針,當一個信號量集被創(chuàng)建后,這個指針指向了這個信號量集的等待任務(wù)鏈表。 等待任務(wù)鏈表 與其他前面介紹過的事件不同 , 信號量集用一個雙向鏈表來組織等待任務(wù) , 每一個等待任務(wù)都是該鏈表中的一個節(jié)點( Node) 。 標志組 OS_FLAG_GRP的成員 OSFlagWaitList就指向了信號量集的這個等待任務(wù)鏈表 。 等待任務(wù)鏈表節(jié)點 OS_FLAG_NODE的結(jié)構(gòu)如下: typedef struct { void *OSFlagNodeNext。 //指向下一個節(jié)點的指針 void *OSFlagNodePrev。 //指向前一個節(jié)點的指針 void *OSFlagNodeTCB。 //指向?qū)?yīng)任務(wù)控制塊的指針 void *OSFlagNodeFlagGrp。 //反向指向信號量集的指針 OS_FLAGS OSFlagNodeFlags。 //信號過濾器 INT8U OSFlagNodeWaitType。//定義邏輯運算關(guān)系的數(shù)據(jù) } OS_FLAG_NODE。 給等待任務(wù)鏈表添加節(jié)點的函數(shù)為 OS_FlagBlock( ), 這個函數(shù)的原型為: static void OS_FlagBlock ( OS_FLAG_GRP *pgrp, //信號量集指針 OS_FLAG_NODE *pnode, //待添加的等待任務(wù)節(jié)點指針 OS_FLAGS flags, //指定等待信號的數(shù)據(jù) INT8U wait_type, //信號與等待任務(wù)之間的邏輯 INT16U timeout //等待時限 ); 這個函數(shù)將在請求信號量集函數(shù) OSFlagPend ( )中被調(diào)用 。 從 等 待 任 務(wù) 鏈 表 中 刪 除 一 個 節(jié) 點 的 函 數(shù) 為OS_FlagUnlink( ), 這個函數(shù)的原型為: void OS_FlagUnlink (OS_FLAG_NODE *pnode); 這個函數(shù)將在發(fā)送信號量集函數(shù) OSFlagPost( )中被調(diào)用。 任務(wù)可以通過調(diào)用函數(shù) OSFlagCreate ( )來創(chuàng)建一個信號量集 。 OSFlagCreate ( )的函數(shù)原型為: OS_FLAG_GRP *OSFlagCreate ( OS_FLAGS flags, //信號的初始值 INT8U *err
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1