嵌入式系統(tǒng)開發(fā)-Chapter6-同步、互斥 與通信.ppt_第1頁
嵌入式系統(tǒng)開發(fā)-Chapter6-同步、互斥 與通信.ppt_第2頁
嵌入式系統(tǒng)開發(fā)-Chapter6-同步、互斥 與通信.ppt_第3頁
嵌入式系統(tǒng)開發(fā)-Chapter6-同步、互斥 與通信.ppt_第4頁
嵌入式系統(tǒng)開發(fā)-Chapter6-同步、互斥 與通信.ppt_第5頁
已閱讀5頁,還剩123頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式系統(tǒng)開發(fā) 第六章同步 互斥與通信 主要內(nèi)容 概述信號量郵箱和消息隊列事件異步信號 管道 概述 多任務(wù)系統(tǒng)中任務(wù)之間 任務(wù)與ISR的關(guān)系相互獨立僅競爭CPU資源競爭除CPU外的其他資源 互斥 同步協(xié)調(diào)彼此運行的步調(diào) 保證協(xié)同運行的各個任務(wù)具有正確的執(zhí)行次序通信彼此間傳遞數(shù)據(jù)或信息 以協(xié)同完成某項工作 任務(wù)能以以下方式與中斷處理程序或其他任務(wù)進行同步或通信 單向同步或通信 一個任務(wù)與另一個任務(wù)或一個ISR同步或通信 雙向同步或通信 兩個任務(wù)相互同步或通信 雙向同步不能在任務(wù)與ISR之間進行 因為ISR不能等待 概述 ISRx Tasky POST PEND 任務(wù)與ISR之間的同步 單向 Taskx Tasky POST PEND POST PEND 任務(wù)與任務(wù)之間的同步 雙向 任務(wù)與任務(wù)之間的同步 單向 Taskx Tasky POST PEND 在嵌入式多任務(wù)系統(tǒng)中 任務(wù)間的耦合程度是不一樣的 耦合程度較高 任務(wù)之間需要進行大量的通信 相應(yīng)的系統(tǒng)開銷較大 耦合程度較低 任務(wù)之間不存在通信需求 其間的同步關(guān)系很弱甚至不需要同步或互斥 系統(tǒng)開銷較小 研究任務(wù)間耦合程度的高低對于合理地設(shè)計應(yīng)用系統(tǒng) 劃分任務(wù)有很重要的作用 概述 在單處理器平臺上 嵌入式操作系統(tǒng)內(nèi)核提供的同步 互斥與通信機制主要包括 信號量 semaphore 用于互斥與同步事件 組 eventgroup 用于同步異步信號 asynchronoussignal 用于同步郵箱 mailbox 消息隊列 messagequeue 用于消息通信管道 pipe 提供非結(jié)構(gòu)化數(shù)據(jù)交換和實現(xiàn)同步 概述 以下一些機制也可用于同步與通信 在單處理器或多處理器系統(tǒng)中 全局變量共享內(nèi)存Sockets遠程過程調(diào)用 RemoteProcedureCall 概述 第一節(jié)信號量 信號量的種類及用途互斥信號量二值信號量計數(shù)信號量信號量機制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號量操作 信號量用于實現(xiàn)任務(wù)與任務(wù)之間 任務(wù)與中斷處理程序之間的同步與互斥 信號量一般分為三種 信號量的種類及用途 用于解決互斥問題 它比較特殊 可能會引起優(yōu)先級反轉(zhuǎn)問題 用于解決同步問題 用于解決資源計數(shù)問題 將信號量進行種類細分 可以根據(jù)其用途 在具體實現(xiàn)時做專門處理 提高執(zhí)行效率和可靠性 互斥信號量 計數(shù)信號量 二值信號量 用互斥信號量保護的代碼區(qū)稱作 臨界區(qū) 臨界區(qū)代碼通常用于對共享資源的訪問 互斥信號量的值被初始化成1 表明目前沒有任務(wù)進入 臨界區(qū) 但最多只有一個任務(wù)可以進入 臨界區(qū) 第一個試圖進入 臨界區(qū) 的任務(wù)將成功獲得互斥信號量 而隨后試圖進入用同一信號量保護的臨界區(qū)的所有其他任務(wù)就必須等待 當任務(wù)離開 臨界區(qū) 時 它將釋放信號量并允許正在等待該信號量的任務(wù)進入 臨界區(qū) 互斥信號量 互斥信號量 共享資源可能是一段存儲器空間 一個數(shù)據(jù)結(jié)構(gòu)或I O設(shè)備 也可能是被兩個或多個并發(fā)任務(wù)共享的任何內(nèi)容 使用互斥信號量可以實現(xiàn)對共享資源的串行訪問 保證只有成功地獲取互斥信號量的任務(wù)才能夠釋放它 互斥信號量是一種特殊的二值信號量 一般它支持所有權(quán) 遞歸訪問 任務(wù)刪除安全和一些避免優(yōu)先級反轉(zhuǎn) 饑餓 死鎖等互斥所固有問題的協(xié)議 互斥信號量狀態(tài)圖 互斥信號量狀態(tài)圖 開啟 鎖定 初始化值為1 申請并獲得值為0 釋放值為1 申請 遞歸 并獲得鎖定數(shù)加1 釋放 遞歸 鎖定數(shù)減1 互斥信號量 所有權(quán) 當一個任務(wù)通過獲取互斥信號量而將其鎖定時 得到該互斥信號量的所有權(quán) 相反 當一個任務(wù)釋放信號量時 失去對其的所有權(quán) 當一個任務(wù)擁有互斥信號量時 其他的任務(wù)不能再鎖定或釋放它 即任務(wù)要釋放互斥信號量 必須事前先獲取該信號量 Task1 RoutineA RoutineB 互斥信號量 嵌套 遞歸 資源訪問如果Task1調(diào)用RoutineA 而RoutineA又調(diào)用RoutineB 并且三者訪問相同的共享資源 就發(fā)生了遞歸共享資源的訪問同步問題 一個遞歸的互斥信號量允許嵌套鎖定互斥信號量 而不引起死鎖 互斥信號量 嵌套 遞歸 資源訪問每個獲取信號量的調(diào)用必須與釋放信號量的調(diào)用相匹配 當最外層的獲取信號量的調(diào)用與釋放信號量的調(diào)用匹配時 該信號量才允許被其它任務(wù)訪問 用于同步的信號量不支持嵌套訪問 任務(wù)如果對同步信號量使用上述操作是錯誤的 任務(wù)會被永久阻塞 并且阻塞條件永遠不會解除 互斥信號量 刪除安全 在一個受信號量保護的臨界區(qū) 經(jīng)常需要保護在臨界區(qū)執(zhí)行的任務(wù)不會被意外地刪除 刪除一個在臨界區(qū)執(zhí)行的任務(wù)可能引起意想不到的后果 造成保護資源的信號量不可用 可能導(dǎo)致資源處于破壞狀態(tài) 也就導(dǎo)致了其它所有要訪問該資源的任務(wù)無法得到滿足 互斥信號量 刪除安全 為避免任務(wù)在臨界區(qū)執(zhí)行時不被意外刪除 提供 任務(wù)保護 和 解除任務(wù)保護 原語對同時 為互斥信號量提供 刪除安全 選項 在創(chuàng)建信號量的時候使用這個選項 當應(yīng)用每次獲取信號量時隱含地使能 任務(wù)保護 功能 當每次釋放信號量時隱含地使用 解除任務(wù)保護 功能 各種互斥機制比較 二值信號量 二值信號量主要用于任務(wù)與任務(wù)之間 任務(wù)與中斷服務(wù)程序之間的同步用于同步的二值信號量初始值為0 表示同步事件尚未產(chǎn)生 任務(wù)申請信號量以等待該同步事件的發(fā)生 另一個任務(wù)或ISR到達同步點時 釋放信號量 將其值設(shè)置為1 表示同步事件已發(fā)生 以喚醒等待的任務(wù) 二值信號量 二值信號量狀態(tài)圖 可獲得 不可獲得 申請并獲得 值為0 釋放 值為1 初始化值為0 Task1 執(zhí)行一些操作 將信號量sem1置1 申請信號量sem2 Task2 申請信號量sem1 執(zhí)行一些操作 將信號量sem2置1 Task2申請信號量sem1失敗 系統(tǒng)切換到Task1 sem1被置1后 Task2得到sem1并搶占Task1 Task2運行到某處時因某種原因被阻塞 系統(tǒng)切換到Task1 用二值信號量實現(xiàn)兩個任務(wù)之間的雙向同步Task2優(yōu)先級高于Task1sem1和sem2的初始值均為0 計數(shù)信號量 計數(shù)信號量用于控制系統(tǒng)中共享資源的多個實例的使用 允許多個任務(wù)同時訪問同一種資源的多個實例計數(shù)信號量被初始化為n 非負整數(shù) n為該種共享資源的數(shù)目 計數(shù)信號量 計數(shù)信號量狀態(tài)圖 可獲得 不可獲得 初始化值大于0 申請并獲得值為0 釋放值為1 申請并獲得值減1 釋放值加1 計數(shù)信號量 計數(shù)信號量使用實例 有界緩沖問題 生產(chǎn)者任務(wù)do 產(chǎn)生一個數(shù)據(jù)項 申請empty申請mutex 將新生成的數(shù)據(jù)項添加到緩沖中 釋放mutex釋放full while 1 消費者任務(wù)do 申請full申請mutex 從緩沖中移出一個數(shù)據(jù)項的內(nèi)容 釋放mutex釋放empty 消費新獲得的數(shù)據(jù)項內(nèi)容 while 1 計數(shù)信號量full 已被填充的數(shù)據(jù)項數(shù)目 取值范圍0 n 初始值為0計數(shù)信號量empty 空閑數(shù)據(jù)項數(shù)目 取值范圍為0 n 初始值為n 互斥信號量mutex 控制生產(chǎn)者任務(wù)和消費者任務(wù)對有界緩沖的訪問 初始值為1 信號量機制的主要數(shù)據(jù)結(jié)構(gòu) 信號量機制的主要數(shù)據(jù)結(jié)構(gòu) 信號量控制塊 管理所有創(chuàng)建的信號量 內(nèi)核在系統(tǒng)運行時動態(tài)分配和回收信號量控制塊互斥和二值信號量控制塊結(jié)構(gòu) Binary Semaphore Control Block wait queue任務(wù)等待隊列attributes信號量屬性lock nesting behavior試圖嵌套獲得時的規(guī)則wait discipline任務(wù)等待信號量的方式priority ceiling優(yōu)先級天花板值lock是否被占有holder擁有者nest count嵌套層數(shù) 計數(shù)信號量控制結(jié)構(gòu)Counting Semaphore Control Blockwait queue任務(wù)等待隊列attributes計數(shù)信號量屬性maximum count最大計數(shù)值wait discipline任務(wù)等待信號量的方式count當前計數(shù)值 信號量機制的主要數(shù)據(jù)結(jié)構(gòu) 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 事件控制塊ECB 同步與通信機制的基本數(shù)據(jù)結(jié)構(gòu)typedefstruct INT8UOSEventType 事件類型INT8UOSEventGrp 等待任務(wù)所在的組INT16UOSEventCnt 計數(shù)器 信號量 void OSEventPtr 指向消息或消息隊列的指針I(yè)NT8UOSEventTbl OS EVENT TBL SIZE 等待任務(wù)列表 OS EVENT 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 當一個事件發(fā)生后 等待事件列表中優(yōu)先級最高的任務(wù) 即在 OSEventTbl OSEventGrp中所有被置1的位中優(yōu)先級數(shù)值最小的任務(wù) 得到該事件 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 當 OSEventTbl n 中的任何一位為1時 OSEventGrp中的第n位為1 與任務(wù)就緒列表類似 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 將一個任務(wù)插入到等待事件的任務(wù)列表中 pevent OSEventGrp OSMapTbl prio 3 pevent OSEventTbl prio 3 OSMapTbl prio與將一個任務(wù)插入到就緒列表中的操作類似 IndexBitmask Binary 000000001100000010200000100300001000400010000500100000601000000710000000 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 從等待事件的任務(wù)列表中使任務(wù)脫離等待狀態(tài)if pevent OSEventTbl prio 3 與將任務(wù)從就緒列表中清除的操作類似 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 在等待事件的任務(wù)列表中查找優(yōu)先級最高的任務(wù)y OSUnMapTbl pevent OSEventGrp x OSUnMapTbl pevent OSEventTbl y prio y 3 x 與查找優(yōu)先級最高的就緒任務(wù)的操作類似 信號量內(nèi)部實現(xiàn)機制實例說明 C OS II 空閑事件控制塊鏈表 典型的信號量操作 創(chuàng)建信號量獲取 申請 信號量釋放信號量刪除信號量清除信號量的任務(wù)等待列表獲取有關(guān)信號量的各種信息 創(chuàng)建信號量 功能 根據(jù)應(yīng)用傳遞的參數(shù)創(chuàng)建一個信號量參數(shù) 信號量的名字 屬性和初始值等 內(nèi)核動作 從空閑信號量控制塊鏈中分配一個信號量控制塊 并初始化信號量屬性 創(chuàng)建成功時 為其分配唯一的ID號返回給應(yīng)用 如果已創(chuàng)建信號量數(shù)量已達到用戶配置的最大數(shù)量 就返回錯誤 創(chuàng)建信號量 信號量的屬性包括 類型任務(wù)等待信號量的方式 即排列的順序 與任務(wù)刪除安全 遞歸訪問以及解決優(yōu)先級反轉(zhuǎn)的策略相關(guān)的參數(shù) 只針對互斥信號量 創(chuàng)建信號量 信號量的屬性 信號量的類型 互斥信號量 MUTEX SEMAPHORE 計數(shù)信號量 COUNTING SEMAPHORE 二值信號量 BINARY SEMAPHORE 任務(wù)等待信號量的方式 先進先出 FIFO 順序 優(yōu)先級 PRIORITY 順序 優(yōu)先級反轉(zhuǎn)問題的解決方法 只適用于互斥信號量 優(yōu)先級繼承算法 INHERIT PRIORITY 優(yōu)先級天花板算法 PRIORITY CEILING 需給出所有可能獲得此信號量的任務(wù)中優(yōu)先級最高的任務(wù)的優(yōu)先級 創(chuàng)建一個信號量OSSemCreate OS EVENT OSSemCreate INT16Ucnt OS EVENT pevent pevent OSEventFreeList 從空閑事件控制塊鏈中取得一個ECBif OSEventFreeList OS EVENT 0 OSEventFreeList OS EVENT OSEventFreeList OSEventPtr if pevent OS EVENT 0 初始化ECB的各個域pevent OSEventType OS EVENT TYPE SEM 事件類型為信號量pevent OSEventCnt cnt 信號量的初始計數(shù)值pevent OSEventPtr void 0 OS EventWaitListInit pevent 初始化等待任務(wù)列表 return pevent 調(diào)用者需檢查返回值 如果為NULL則表示建立失敗 獲取 申請 信號量 功能 試圖獲得應(yīng)用指定的信號量 if信號量的值大于0then將信號量的值減1else根據(jù)接收信號量的選項 將任務(wù)放到等待隊列中 或是直接返回 獲取 申請 信號量 當所申請的信號量不能被立即獲得時 可以有以下幾種選擇 永遠等待不等待 立即返回 并返回一個錯誤狀態(tài)碼指定等待時限 可有效避免死鎖 注意 不允許在ISR中選擇等待當任務(wù)選擇等待時 將被按FIFO或優(yōu)先級順序放置在等待隊列中 獲取 申請 信號量 如果任務(wù)等待一個使用優(yōu)先級繼承算法的互斥信號量 且它的優(yōu)先級高于當前正占有此信號量的任務(wù)的優(yōu)先級 那么占有信號量的任務(wù)將繼承這個被阻塞的任務(wù)的優(yōu)先級 如果任務(wù)成功地獲得一個采用優(yōu)先級天花板算法的互斥信號量 它的優(yōu)先級又低于優(yōu)先級天花板 那么它的優(yōu)先級將被抬升至天花板 獲取 等待 一個信號量OSSemPend voidOSSemPend OS EVENT pevent INT16Utimeout INT8U err if pevent OSEventCnt 0 信號量值大于0 成功獲得信號量并返回pevent OSEventCnt err OS NO ERR return OSTCBCur OSTCBStat OS STAT SEM 設(shè)置任務(wù)狀態(tài)為等待信號量OSTCBCur OSTCBDly timeout 設(shè)置等待時限OS EventTaskWait pevent 將任務(wù)放置到信號量的等待列表中OS Sched 內(nèi)核實施任務(wù)調(diào)度 系統(tǒng)切換到另一就緒任務(wù)執(zhí)行if OSTCBCur OSTCBStat 任務(wù)由于獲得信號量而恢復(fù)執(zhí)行 本調(diào)用成功返回 獲取 無等待地請求 一個信號量OSSemAccept INT16UOSSemAccept OS EVENT pevent INT16Ucnt cnt pevent OSEventCnt if cnt 0 pevent OSEventCnt return cnt 注意 即使不能成功獲得信號量 返回值為0 調(diào)用者也不會被阻塞 此函數(shù)可以在中斷處理程序中使用 釋放信號量 功能 釋放一個應(yīng)用指定的信號量 if沒有任務(wù)等待這個信號量then信號量的值加1else將信號量分配給一個等待任務(wù) 將相應(yīng)的任務(wù)移出等待隊列 使其就緒 如果使用了優(yōu)先級繼承或優(yōu)先級天花板算法 那么執(zhí)行該功能 系統(tǒng)調(diào)用 的任務(wù)的優(yōu)先級將恢復(fù)到原來的高度 釋放一個信號量OSSemPost INT8UOSSemPost OS EVENT pevent if pevent OSEventGrp 0 x00 如果有任務(wù)在等待該信號量OS EventTaskRdy pevent void 0 OS STAT SEM 使等待任務(wù)列表中優(yōu)先級最高的任務(wù)就緒OS Sched 內(nèi)核實施任務(wù)調(diào)度return OS NO ERR 成功返回 if pevent OSEventCntOSEventCnt 信號量的值加1return OS NO ERR 成功返回 return OS SEM OVF 信號量溢出 刪除信號量 功能 從系統(tǒng)中刪除應(yīng)用指定的一個信號量內(nèi)核動作 將信號量控制塊返還給系統(tǒng)刪除信號量的不一定是創(chuàng)建信號量的任務(wù)如果有任務(wù)正在等待獲得該信號量 執(zhí)行此功能將使所有等待這個信號量的任務(wù)回到就緒隊列中 且返回一個狀態(tài)碼指示該信號量已被刪除 刪除信號量 企圖獲取已刪除的信號量將返回一個錯誤 在互斥信號量正被使用時 已經(jīng)被某任務(wù)獲取 不能刪除它 因為該信號量正在保護一個共享資源或臨界代碼段 該動作可能造成數(shù)據(jù)崩潰或其他嚴重問題 刪除一個信號量OSSemDel OS EVENT OSSemDel OS EVENT pevent INT8Uopt INT8U err BOOLEANtasks waiting if pevent OSEventGrp 0 x00 根據(jù)是否有任務(wù)在等待信號量設(shè)置等待標志tasks waiting TRUE else tasks waiting FALSE switch opt caseOS DEL NO PEND 如果有任務(wù)等待信號量則不刪除信號量if task waiting FALSE 沒有任務(wù)等待 釋放ECB回空閑鏈pevent OSEventType OS EVENT TYPE UNUSED pevent OSEventPtr OSEventFreeList OSEventFreeList pevent 調(diào)整空閑ECB鏈頭指針 err OS NO ERR return OS EVENT 0 else err OS ERR TASK WAITING 有任務(wù)等待 刪除信號量失敗return pevent 刪除一個信號量OSSemDel caseOS DEL ALWAYS 無論有無任務(wù)等待都刪除信號量 將等待列表中的每個任務(wù)都設(shè)置成就緒while pevent OSEventGrp 0 x00 OS EventTaskRdy pevent void 0 OS STAT SEM 釋放該信號量的ECB回空閑控制塊鏈pevent OSEventType OS EVENT TYPE UNUSED pevent OSEventFreeList OSEventFreeList pevent 如果之前有任務(wù)等待信號量 內(nèi)核實施任務(wù)調(diào)度if tasks waiting TRUE OS Sched err OS NO ERR return OS EVENT 0 default err OS ERR INVALID OPT return pevent 清除信號量的任務(wù)等待列表 為了清除等待一個信號量的所有任務(wù) 某些內(nèi)核支持Flush操作 以便釋放信號量等待任務(wù)列表中的所有任務(wù) 當多個任務(wù)的執(zhí)行必須在某些點相遇時 需要這樣的機制 第二節(jié)郵箱和消息隊列 通信方式概述消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu)典型的消息隊列操作消息隊列的其他典型使用 任務(wù)間的通信方式直接通信 在通信過程中雙方必須明確地知道 命名 彼此 Send P message 發(fā)送一個消息到任務(wù)PReceive Q message 從任務(wù)Q接收一個消息間接通信 通信雙方不需要指出消息的來源或去向 而通過中間機制來通信 如 send A message 發(fā)送一個消息給郵箱Areceive A message 從郵箱A接收一個消息 通信方式概述 消息隊列 屬于間接通信方式消息 內(nèi)存空間中一段長度可變的緩沖區(qū) 其長度和內(nèi)容均可以由用戶定義 其內(nèi)容可以是實際的數(shù)據(jù) 數(shù)據(jù)塊的指針或空 對消息內(nèi)容的解釋由應(yīng)用完成 從操作系統(tǒng)觀點看 消息沒有定義的格式 所有的消息都是字節(jié)流 沒有特定的含義 從應(yīng)用觀點看 根據(jù)應(yīng)用定義的消息格式 消息被解釋成特定的含義 應(yīng)用可以只把消息當成一個標志 這時消息機制用于實現(xiàn)同步 概述 一些操作系統(tǒng)內(nèi)核把消息進一步分為 郵箱和消息隊列郵箱僅能存放單條消息 它提供了一種低開銷的機制來傳送信息 每個郵箱可以保存一條大小為若干個字節(jié)的消息 消息隊列可存放若干消息 提供了一種任務(wù)間緩沖通信的方法 消息機制可支持定長與可變長度兩種模式的消息 可變長度的消息隊列需要對隊列中的每一條消息增加額外的存儲開銷 概述 消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu) 消息隊列及其相關(guān)的參數(shù)和支持數(shù)據(jù)結(jié)構(gòu) 消息隊列狀態(tài)圖 非空 滿 隊列創(chuàng)建消息數(shù)為0 消息隊列狀態(tài)圖 消息發(fā)送消息數(shù)加1 空 消息發(fā)送消息數(shù)為1 消息接收消息數(shù)為0 消息接收消息數(shù)減1 消息接收消息數(shù)減1 消息發(fā)送消息數(shù)等于隊列長度 消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu) 消息隊列控制塊管理所有創(chuàng)建的消息隊列 系統(tǒng)運行時動態(tài)分配和回收消息隊列控制塊消息隊列緩沖區(qū)存放發(fā)送到該隊列的消息 接收者從緩沖區(qū)中取出消息 消息的發(fā)送或接收有兩種方法 影響消息緩沖區(qū)結(jié)構(gòu) 將數(shù)據(jù)從發(fā)送任務(wù)的空間完全拷貝到接收任務(wù)的空間中 效率較低 執(zhí)行時間與消息大小有關(guān) 只傳遞指向數(shù)據(jù)存儲空間的指針 提高系統(tǒng)性能 發(fā)送和接收消息的消息拷貝和內(nèi)存使用這種消息傳遞方法效率低 占用空間大一種效率更高的方式是傳遞消息指針 number of message max message count 消息隊列控制塊 消息隊列緩沖區(qū) 消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu) 消息隊列的環(huán)形緩沖 消息隊列機制的主要數(shù)據(jù)結(jié)構(gòu) max message count queue end queue start queue out number of message queue in 消息指針 典型的消息隊列操作 創(chuàng)建消息隊列發(fā)送普通消息發(fā)送緊急消息發(fā)送廣播消息接收消息刪除消息隊列獲取有關(guān)消息隊列的各種信息 創(chuàng)建消息隊列 創(chuàng)建消息隊列時 調(diào)用者可以指定如下參數(shù) 消息的最大長度每個消息隊列中最多的消息數(shù)消息隊列的屬性任務(wù)等待消息時的排隊方式 FIFO或PRIORITY系統(tǒng)為新創(chuàng)建的消息隊列分配唯一的ID 發(fā)送消息 根據(jù)緊急程度的不同 消息通常可分為普通消息與緊急消息 如果有任務(wù)正在等待消息 即消息隊列為空 則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的 任務(wù)從等待隊列移到就緒隊列中 消息被拷貝到任務(wù)提供的緩沖區(qū)中 或者由接收任務(wù)得到指向消息的指針 如果沒有任務(wù)等待 發(fā)送普通消息將消息放在隊列尾 而發(fā)送緊急消息將消息放在隊列頭 發(fā)送消息 發(fā)送消息 如果發(fā)送消息時隊列已被填滿 則不同的操作系統(tǒng)可能采取不同的處理辦法 掛起試圖向已滿的消息隊列中發(fā)送消息的任務(wù) 不適用于中斷服務(wù)程序 簡單地丟棄該條消息并向調(diào)用者返回錯誤信息廣播消息 在此之前所有試圖從隊列中接收消息的任務(wù)此時都將獲得相同的消息 該功能拷貝消息到各任務(wù)的消息緩沖中 或者讓所有的等待任務(wù)得到指向消息的指針 并喚醒所有的等待任務(wù) 接收消息 如果指定的消息隊列中有消息 則將其中的第一條消息拷貝到調(diào)用者的緩沖區(qū) 或者將第一條消息指針傳遞給調(diào)用者 并從消息隊列中刪除它 如果此時消息隊列中沒有消息 則可能出現(xiàn)以下幾種情況 永遠等待消息的到達 等待消息的任務(wù)按FIFO或優(yōu)先級高低順序排列在等待隊列中等待消息且指定等待時限 等待消息的任務(wù)按FIFO或優(yōu)先級高低順序排列在等待隊列中不等待 強制立即返回 接收消息 限時等待可有效預(yù)防死鎖中斷服務(wù)程序接收消息時必須選擇不等待 因為中斷服務(wù)程序是不能被阻塞的 如果消息隊列被應(yīng)用刪除 則所有等待該消息隊列的任務(wù)都被返回一個錯誤信息 并回復(fù)到就緒狀態(tài) 接收消息 刪除消息隊列 從系統(tǒng)中刪除指定的消息隊列 釋放消息隊列控制塊及消息隊列緩沖區(qū) 任何知道此消息隊列ID號的代碼都可以刪除它 消息隊列被刪除后 所有等待從這個消息隊列接收消息的任務(wù)都回到就緒態(tài) 并得到一個錯誤信息表明消息隊列已被刪除 消息隊列的其他典型使用 緊耦合的單向數(shù)據(jù)通信 發(fā)送任務(wù)發(fā)送消息后要求一個響應(yīng)信號 表明接收任務(wù)已經(jīng)成功接收到消息 消息隊列的其他典型使用 緊耦合的雙向數(shù)據(jù)通信 如果數(shù)據(jù)需要在任務(wù)之間雙向流動 則可以采用緊耦合的雙向數(shù)據(jù)通信模式 也稱為全雙工通信 第三節(jié)事件 概述事件機制的主要數(shù)據(jù)結(jié)構(gòu)典型的事件操作事件機制的典型應(yīng)用 在嵌入式實時內(nèi)核中 事件是指一種表明預(yù)先定義的系統(tǒng)事件已經(jīng)發(fā)生的機制 事件機制用于任務(wù)與任務(wù)之間 任務(wù)與ISR之間的同步 其主要的特點是可實現(xiàn)一對多的同步 一個事件就是一個標志 不具備其它信息 一個或多個事件構(gòu)成一個事件集 事件集可以用一個指定長度的變量 比如一個8bit 16bit或32bit的無符號整型變量 不同的操作系統(tǒng)其具體實現(xiàn)不一樣 來表示 而每個事件由在事件集變量中的某一位來代表 概述 事件及事件集有以下特點 事件間相互獨立事件僅用于同步 不提供數(shù)據(jù)傳輸功能事件無隊列 即多次發(fā)送同一事件 在未經(jīng)過任何處理的情況下 其效果等同于只發(fā)送一次 提供事件機制的意義在于 當某任務(wù)要與多個任務(wù)或中斷服務(wù)同步時 就需要使用事件機制 若任務(wù)需要與一組事件中的任意一個發(fā)生同步 可稱為獨立型同步 邏輯 或 關(guān)系 任務(wù)也可以等待若干事件都發(fā)生時才同步 稱為關(guān)聯(lián)型同步 邏輯 與 關(guān)系 概述 或 同步和 與 同步 概述 任務(wù) 任務(wù) 任務(wù) 任務(wù) ISR ISR OR AND 與 型同步 或 型同步 事件集 事件集 POST POST PEND PEND 用多個事件的組合發(fā)信號給多個任務(wù) 概述 任務(wù) 任務(wù) 任務(wù) ISR OR AND 事件集 事件集 事件集 8 16或32位 POST PEND PEND 術(shù)語 發(fā)送事件集 指在一次發(fā)送過程中發(fā)往接收者 比如任務(wù) 的一個或多個事件的組合 待處理事件集 指已被發(fā)送到一個接收者但還沒有被接收 即正在等待處理 的所有事件的集合 事件條件 指事件接收者在一次接收過程中期待接收的一個或多個事件的集合 或 同步 待處理事件集只要包括事件條件中的任一事件即可滿足要求 與 同步 其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求 概述 事件機制的主要數(shù)據(jù)結(jié)構(gòu) 事件集控制塊 管理所有創(chuàng)建的事件集或者事件集附屬于任務(wù) 不需創(chuàng)建 其相關(guān)參數(shù)成為任務(wù)控制塊的一部分 事件的內(nèi)部實現(xiàn)機制實例說明 C OS II 事件標志組數(shù)據(jù)結(jié)構(gòu)OS FLAG GRPtypedefstruct INT8UOSFlagType 指示本數(shù)據(jù)結(jié)構(gòu)的類型void OSFlagWaitList 等待事件標志的任務(wù)鏈表OS FLAGSOSFlagFlags 各事件標志的當前狀態(tài) OS FLAG GRP 事件標志節(jié)點數(shù)據(jù)結(jié)構(gòu)OS FLAG NODEtypedefstruct void OSFlagNodeNext 后驅(qū)指針void OSFlagNodePrev 前驅(qū)指針void OSFlagNodeTCB 任務(wù)控制塊指針void OSFlagNodeFlagGrp 指回OS FLAG GRP結(jié)構(gòu)OS FLAGSOSFlagNodeFlags 所等待的事件標志組合INT8UOSFlagNodeWaitType 等待類型 與 或 OS FLAG NODE 事件標志組 事件標志節(jié)點及任務(wù)控制塊之間的關(guān)系 OS FLAG GRP OS FLAG NODE OSTCBFlagNode OSFlagNodeFlags OSFlagNodeWaitType OSFlagNodeNext OSFlagNodePrev OSFlagNodeTCB OSFlagWaitList OSFlagFlags OSFlagType ANDorOR ANDorOR ANDorOR OS EVENT TYPE FLAG 0 0 OSTCBFlagNode OS TCB 典型的事件操作 創(chuàng)建事件集刪除事件集發(fā)送事件 集 接收事件 集 獲取有關(guān)事件集的各種信息 創(chuàng)建事件集 申請空閑事件集控制塊 設(shè)置事件集屬性 初始化控制塊中的域 分配ID號 創(chuàng)建一個事件標志組OSFlagCreate OS FLAG GRP OSFlagCreate OS FLAGSflags INT8U err OS FLAG GRP pgrp pgrp OSFlagFreeList 獲取一個空閑事件標志組結(jié)構(gòu)if pgrp OS FLAG GRP 0 獲取成功 初始化該結(jié)構(gòu)中的域OSFlagFreeList OS FLAG GRP OSFlagFreeList OSFlagWaitList 調(diào)整空閑結(jié)構(gòu)鏈頭指針pgrp OSFlagType OS EVENT TYPE FLAG pgrp OSFlagFlags flags 初始化當前各事件標志的狀態(tài)pgrp OSFlagWaitList void 0 尚無任務(wù)等待事件標志 err OS NO ERR else err OS FLAG GRP DEPLETED return pgrp 接收事件 集 在接收事件 集 時可以有如下選項 接收 等待 事件標志組的事件標志位OSFlagPend OS FLAGSOSFlagPend OS FLAG GRP pgrp OS FLAGSflags INT8Uwait type INT16Utimeout INT8U err OS FLAG NODEnode OS FLAG NODE作為局部變量存在于調(diào)用該函數(shù)的任務(wù)堆棧中OS FLAGSflags cur OS FLAGSflags rdy switch wait type caseOS FLAG WAIT SET ALL 任務(wù)以 與 方式等待事件標志flags rdy pgrp OSFlagFlags 接收 等待 事件標志組的事件標志位OSFlagPend caseOS FLAG WAIT SET ANY 任務(wù)以 或 方式等待事件標志flags rdy pgrp OSFlagFlags OS Sched 當前任務(wù)被放到事件標志等待鏈后 內(nèi)核實施任務(wù)調(diào)度if OSTCBCur OSTCBStat 接收 等待 事件標志組的事件標志位OSFlagPend 添加一個任務(wù)到事件標志組等待任務(wù)鏈表中OS FlagBlock OS FLAG GRP OS EVENT TYPE FLAG ANDorOR ANDorOR 0 0 OS TCB OS TCB OSTCBCur OS FLAG NODE 0 接收 無等待地獲取 事件標志OSFlagAccept OS FLAGSOSFlagAccept OS FLAG GRP pgrp OS FLAGSflags INT8Uwait type INT8U err OS FLAGSflags cur flags rdy err OS NO ERR switch wait type 判斷等待事件標志的方式caseOS FLAG WAIT SET ALL 與 方式等待flags rdy pgrp OSFlagFlags 接收 無等待地獲取 事件標志OSFlagAccept caseOS FLAG WAIT SET ANY 或 方式等待flags rdy pgrp OSFlagFlags 發(fā)送事件 集 調(diào)用者 任務(wù)或中斷 構(gòu)造一個事件 集 將其發(fā)往接收者 比如目標任務(wù) 可能會出現(xiàn)以下幾種情況之一 目標任務(wù)正在等待的事件條件得到滿足 任務(wù)就緒 目標任務(wù)正在等待的事件條件沒有得到滿足 該事件 集 被按 或 操作 保存到目標任務(wù)的待處理事件集中 目標任務(wù)繼續(xù)等待 目標任務(wù)未等待事件 集 該事件 集 被按 或 操作 保存到目標任務(wù)的待處理事件集中 發(fā)送 置位 事件標志組中的事件標志OSFlagPost OS FLAGSOSFlagPost OS FLAG GRP pgrp OS FLAGSflags INT8U err OS FLAG NODE pnode BOOLEANsched FALSE 初始化調(diào)度標志OS FLAGSflags cur flags rdy pgrp OSFlagFlags flags 置位事件標志pnode OS FLAG NODE pgrp OSFlagWaitList 獲取任務(wù)等待鏈頭節(jié)點while pnode OS FLAG NODE 0 如果有任務(wù)等待 遍歷等待鏈switch pnode OSFlagNodeWaitType caseOS FLAG WAIT SET ALL 與 方式等待flags rdy pgrp OSFlagFlags caseOS FLAG WAIT SET ANY 或 方式等待flags rdy pgrp OSFlagFlags 發(fā)送 置位 事件標志組中的事件標志OSFlagPost 刪除事件集 回收事件集控制塊到空閑鏈中 等待接收該事件集的任務(wù)被恢復(fù)就緒 刪除事件標志組OSFlagDel OS FLAG GRP OSFlagDel OS FLAG GRP pgrp INT8Uopt INT8U err BOOLEANtasks waiting OS FLAG NODE pnode if pgrp OSFlagWaitList void 0 tasks waiting TRUE 有任務(wù)等待elsetasks waiting FALSE 無任務(wù)等待switch opt caseOS DEL NO PEND 在無任務(wù)等待時才刪除事件標志組if tasks waiting FALSE 無任務(wù)等待 釋放控制塊到空閑鏈中pgrp OSFlagType OS EVENT TYPE UNUSED pgrp OSFlagWaitList void OSFlagFreeList OSFlagFreeList pgrp err OS NO ERR return OS FLAG GRP 0 else 有任務(wù)等待 刪除失敗 err OS ERR TASK WAITING return pgrp 刪除事件標志組OSFlagDel caseOS DEL ALWAYS 無論是否有任務(wù)等待 都刪除事件標志組pnode OS FLAG NODE pgrp OSFlagWaitList 獲取等待頭節(jié)點while pnode OS FLAG NODE 0 遍歷整個等待任務(wù)鏈 使每個等待任務(wù)就緒OS FlagTaskRdy pnode OS FLAGS 0 pnode OS FLAG NODE pnode OSFlagNodeNext pgrp OSFlagType OS EVENT TYPE UNUSED pgrp OSFlagWaitList void OSFlagFreeList OSFlagFreeList pgrp 釋放控制塊回空閑鏈if tasks waiting TRUE OS Sched 如果之前有任務(wù)等待 err OS NO ERR 內(nèi)核實施調(diào)度return OS FLAG GRP 0 default err OS ERR INVALID OPT return pgrp 設(shè)置事件 設(shè)置事件 Task1 ISR 來自某設(shè)備的中斷 Task2 消息隊列Q 事件標志集 信號量S 0 1 0 0 0 1 0 0 發(fā)送消息 釋放信號量 接收消息 獲取信號量 事件機制的典型應(yīng)用 解決復(fù)雜的應(yīng)用設(shè)計問題 發(fā)送方 Task1或ISR 發(fā)送信息 消息或信號量 發(fā)送方 Task1或ISR 設(shè)置相應(yīng)的事件標志 指示消息或信號量的發(fā)送 接收方 Task2 檢測事件標志集 判斷是否滿足其接收條件 與 條件接收或 或 條件接收 接收方 Task2 根據(jù)事件標志集的指示定向接收信息 消息或信號量 達到和不同發(fā)送方 Task1或ISR 同步或通信的目的 第四節(jié)異步信號 概述異步信號機制與中斷機制的比較異步信號機制與事件機制的比較異步信號機制的主要數(shù)據(jù)結(jié)構(gòu)典型的異步信號操作 異步信號機制用于任務(wù)與任務(wù)之間 任務(wù)與ISR之間的異步操作 它被任務(wù) 或ISR 用來通知其它任務(wù)某個事件的出現(xiàn) 異步信號標志可以依附于任務(wù) 需要處理異步信號的任務(wù)由兩部分組成 一個是與異步信號無關(guān)的任務(wù)主體 另一個是ASR 異步信號服務(wù)例程 一個ASR對應(yīng)于一個任務(wù) 當向任務(wù)發(fā)送一個異步信號 如果該任務(wù)正在運行則中止其自身代碼的運行 轉(zhuǎn)而運行與該異步信號相關(guān)的服務(wù)例程 或者當該任務(wù)被激活時 在投入運行前執(zhí)行ASR 異步信號機制也可以稱作軟中斷機制 異步信號又被稱為軟中斷信號 概述 概述 異步信號機制與中斷機制的比較 相同點具有中斷性 對中斷的處理和對異步信號的處理都要先暫時地中斷當前任務(wù)的運行 有相應(yīng)的服務(wù)程序根據(jù)中斷向量 有一段與中斷信號對應(yīng)的服務(wù)程序 稱為ISR InterruptServiceRoutine 根據(jù)異步信號的編號 有一段與之對應(yīng)的服務(wù)程序 稱為ASR AsynchroniousServiceRoutine 可以屏蔽其響應(yīng)外部硬件中斷可以通過相應(yīng)的寄存器操作被屏蔽任務(wù)也可屏蔽對異步信號的響應(yīng) 異步信號機制與中斷機制的比較 不同點實質(zhì)不同中斷由硬件或者特定的指令產(chǎn)生 不受任務(wù)調(diào)度的控制異步信號由系統(tǒng)調(diào)用 使用發(fā)送異步信號功能 產(chǎn)生 受到任務(wù)調(diào)度的控制 處理時機 或響應(yīng)時間 不同中斷觸發(fā)后 硬件根據(jù)中斷向量找到相應(yīng)的服務(wù)程序執(zhí)行 在退出中斷服務(wù)程序之前會進行重調(diào)度 所以中斷結(jié)束后運行的任務(wù)不一定是先前被中斷的任務(wù) 異步信號通過發(fā)送異步信號的系統(tǒng)調(diào)用觸發(fā) 但是系統(tǒng)不一定馬上開始對它的處理 如果接收異步信號的不是當前任務(wù) 則ASR要等到接收任務(wù)被調(diào)度 完成上下文切換后才能執(zhí)行 之后再執(zhí)行任務(wù)自身的代碼 任務(wù)也可以給自己發(fā)送異步信號 在這種情況下 其ASR將馬上執(zhí)行 執(zhí)行的環(huán)境不同一般地 ISR在獨立的上下文中運行 操作系統(tǒng)為之提供專門的堆??臻g ASR在相關(guān)任務(wù)的上下文中運行 所以ASR也是任務(wù)的一個組成部分 異步信號機制與事件機制的比較 同樣是標志著某個事件的發(fā)生 事件機制的使用是同步的 而異步信號機制是異步的 對一個任務(wù)來說 什么時候會接收到事件是已知的 因為接收事件的功能是它自己在運行過程中調(diào)用的 任務(wù)不能預(yù)知何時會收到一個異步信號 并且一旦接收到了異步信號 在允許響應(yīng)的情況下 它會中斷正在運行的代碼而去執(zhí)行異步信號處理程序 異步信號機制的主要數(shù)據(jù)結(jié)構(gòu) 一種異步信號控制結(jié)構(gòu)Asynchronous Signal Control Blockenabled是否使能對異步信號的響應(yīng)handler處理例程attribute setASR的執(zhí)行屬性signals posted使能響應(yīng)時 已發(fā)送但尚未處理的信號signals pending屏蔽響應(yīng)時 已發(fā)送但尚未處理的信號nest levelASR中異步信號的嵌套層數(shù) 異步信號機制的主要數(shù)據(jù)結(jié)構(gòu) ASR的執(zhí)行屬性是否允許任務(wù)在執(zhí)行ASR過程中被搶占是否允許時間片切換是否支持ASR嵌套是否允許在執(zhí)行ASR過程中響應(yīng)中斷 典型的異步信號

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論