互斥信号量的等待与通知
生活随笔
收集整理的這篇文章主要介紹了
互斥信号量的等待与通知
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 互斥信號量的等待與通知
- 1.1 設(shè)計原理
- 1.2 設(shè)計實現(xiàn)
1 互斥信號量的等待與通知
1.1 設(shè)計原理
等待互斥信號量:
- 信號量未被占有:
- 標(biāo)記為已占有。
- 鎖定次數(shù)+1。
- 信號量被自己占有:
- 鎖定次數(shù)加1。
- 信號量被高優(yōu)先級任務(wù)占有:
- 當(dāng)前任務(wù)進(jìn)入等待列表。
- 信號量被低優(yōu)先級任務(wù)占有:
- 將占有信號量的優(yōu)先級提升到當(dāng)前任務(wù)的優(yōu)先級。
- 當(dāng)前任務(wù)進(jìn)入等待。
釋放信號量:
- 發(fā)生優(yōu)先級翻轉(zhuǎn)。
- 未發(fā)生優(yōu)先級翻轉(zhuǎn)。
1.2 設(shè)計實現(xiàn)
/*************************************** Copyright (c)****************************************************** ** File name : tMutex.c ** Latest modified Date : 2016-06-01 ** Latest Version : 0.1 ** Descriptions : tinyOS的互斥信號量實現(xiàn) ** **-------------------------------------------------------------------------------------------------------- ** Created by : 01課堂 lishutong ** Created date : 2016-06-01 ** Version : 1.0 ** Descriptions : The original version ** **-------------------------------------------------------------------------------------------------------- ** Copyright : 版權(quán)所有,禁止用于商業(yè)用途 ** Author Blog : http://ilishutong.com **********************************************************************************************************/ #include "tMutex.h" #include "tinyOS.h"/********************************************************************************************************** ** Function name : tMutexInit ** Descriptions : 初始化互斥信號量 ** parameters : mutex 等待初始化的互斥信號量 ** Returned value : 無 ***********************************************************************************************************/ void tMutexInit (tMutex * mutex) {tEventInit(&mutex->event, tEventTypeMutex);mutex->lockedCount = 0;mutex->owner = (tTask *)0;mutex->ownerOriginalPrio = TINYOS_PRO_COUNT; }/********************************************************************************************************** ** Function name : tMutexWait ** Descriptions : 等待信號量 ** parameters : mutex 等待的信號量 ** parameters : waitTicks 最大等待的ticks數(shù),為0表示無限等待 ** Returned value : 等待結(jié)果,tErrorResourceUnavaliable.tErrorNoError,tErrorTimeout ***********************************************************************************************************/ uint32_t tMutexWait (tMutex * mutex, uint32_t waitTicks) {uint32_t status = tTaskEnterCritical();if (mutex->lockedCount <= 0){// 如果沒有鎖定,則使用當(dāng)前任務(wù)鎖定mutex->owner = currentTask;mutex->ownerOriginalPrio = currentTask->prio;mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;}else{// 信號量已經(jīng)被鎖定if (mutex->owner == currentTask){// 如果是信號量的擁有者再次wait,簡單增加計數(shù)mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;}else{// 如果是信號量擁有者之外的任務(wù)wait,則要檢查下是否需要使用// 優(yōu)先級繼承方式處理if (currentTask->prio < mutex->owner->prio){tTask * owner = mutex->owner;// 如果當(dāng)前任務(wù)的優(yōu)先級比擁有者優(yōu)先級更高,則使用優(yōu)先級繼承// 提升原擁有者的優(yōu)先if (owner->state == TINYOS_TASK_STATE_RDY){// 任務(wù)處于就緒狀態(tài)時,更改任務(wù)在就緒表中的位置tTaskSchedUnRdy(owner);owner->prio = currentTask->prio;tTaskSchedRdy(owner);}else{// 其它狀態(tài),只需要修改優(yōu)先級owner->prio = currentTask->prio;}}// 當(dāng)前任務(wù)進(jìn)入等待隊列中tEventWait(&mutex->event, currentTask, (void *)0, tEventTypeMutex, waitTicks);tTaskExitCritical(status);// 執(zhí)行調(diào)度, 切換至其它任務(wù)tTaskSched();return currentTask->waitEventResult;}} }/********************************************************************************************************** ** Function name : tMutexNoWaitGet ** Descriptions : 獲取信號量,如果已經(jīng)被鎖定,立即返回 ** parameters : tMutex 獲取的信號量 ** Returned value : 獲取結(jié)果, tErrorResourceUnavaliable.tErrorNoError ***********************************************************************************************************/ uint32_t tMutexNoWaitGet (tMutex * mutex) {uint32_t status = tTaskEnterCritical();if (mutex->lockedCount <= 0){// 如果沒有鎖定,則使用當(dāng)前任務(wù)鎖定mutex->owner = currentTask;mutex->ownerOriginalPrio = currentTask->prio;mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;}else{// 信號量已經(jīng)被鎖定if (mutex->owner == currentTask){// 如果是信號量的擁有者再次wait,簡單增加計數(shù)mutex->lockedCount++;tTaskExitCritical(status);return tErrorNoError;}tTaskExitCritical(status);return tErrorResourceUnavaliable;} }/********************************************************************************************************** ** Function name : tMutexNotify ** Descriptions : 通知互斥信號量可用 ** parameters : mbox 操作的信號量 ** parameters : msg 發(fā)送的消息 ** parameters : notifyOption 發(fā)送的選項 ** Returned value : tErrorResourceFull ***********************************************************************************************************/ uint32_t tMutexNotify (tMutex * mutex) {uint32_t status = tTaskEnterCritical();if (mutex->lockedCount <= 0){// 鎖定計數(shù)為0,信號量未被鎖定,直接退出tTaskExitCritical(status);return tErrorNoError;}if (mutex->owner != currentTask){// 不是擁有者釋放,認(rèn)為是非法tTaskExitCritical(status);return tErrorOwner;}if (--mutex->lockedCount > 0){// 減1后計數(shù)仍不為0, 直接退出,不需要喚醒等待的任務(wù)tTaskExitCritical(status);return tErrorNoError;}// 是否有發(fā)生優(yōu)先級繼承if (mutex->ownerOriginalPrio != mutex->owner->prio){// 有發(fā)生優(yōu)先級繼承,恢復(fù)擁有者的優(yōu)先級if (mutex->owner->state == TINYOS_TASK_STATE_RDY){// 任務(wù)處于就緒狀態(tài)時,更改任務(wù)在就緒表中的位置tTaskSchedUnRdy(mutex->owner);currentTask->prio = mutex->ownerOriginalPrio;tTaskSchedRdy(mutex->owner);}else{// 其它狀態(tài),只需要修改優(yōu)先級currentTask->prio = mutex->ownerOriginalPrio;}}// 檢查是否有任務(wù)等待if (tEventWaitCount(&mutex->event) > 0){// 如果有的話,則直接喚醒位于隊列首部(最先等待)的任務(wù)tTask * task = tEventWakeUp(&mutex->event, (void *)0, tErrorNoError);mutex->owner = task;mutex->ownerOriginalPrio = task->prio;mutex->lockedCount++;// 如果這個任務(wù)的優(yōu)先級更高,就執(zhí)行調(diào)度,切換過去if (task->prio < currentTask->prio){tTaskSched();}}tTaskExitCritical(status);return tErrorNoError; }參考資料:
總結(jié)
以上是生活随笔為你收集整理的互斥信号量的等待与通知的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双程2在线观看高清未删减版(双程2未删减
- 下一篇: STL中的迭代器