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