生活随笔
收集整理的這篇文章主要介紹了
邮箱的获取与释放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1 郵箱的獲取與釋放
1.1 設計實現
獲取消息:
釋放消息:
代碼如下:
uint32_t tMboxWait
(tMbox
* mbox
, void **msg
, uint32_t waitTicks
)
{uint32_t status
= tTaskEnterCritical();if (mbox
->count
> 0){--mbox
->count
;*msg
= mbox
->msgBuffer
[mbox
->read
++];if (mbox
->read
>= mbox
->maxCount
) {mbox
->read
= 0;}tTaskExitCritical(status
); return tErrorNoError
;}else { tEventWait(&mbox
->event
, currentTask
, (void *)0, tEventTypeMbox
, waitTicks
);tTaskExitCritical(status
);tTaskSched();*msg
= currentTask
->eventMsg
;return currentTask
->waitEventResult
;}
}
uint32_t tMboxNoWaitGet
(tMbox
* mbox
, void **msg
)
{uint32_t status
= tTaskEnterCritical();if (mbox
->count
> 0){--mbox
->count
;*msg
= mbox
->msgBuffer
[mbox
->read
++];if (mbox
->read
>= mbox
->maxCount
) {mbox
->read
= 0;}tTaskExitCritical(status
); return tErrorNoError
;}else {tTaskExitCritical(status
);return tErrorResourceUnavaliable
;}
}
uint32_t tMboxNotify
(tMbox
* mbox
, void * msg
, uint32_t notifyOption
)
{uint32_t status
= tTaskEnterCritical(); if (tEventWaitCount(&mbox
->event
) > 0){tTask
* task
= tEventWakeUp(&mbox
->event
, (void *)msg
, tErrorNoError
);if (task
->prio
< currentTask
->prio
){tTaskSched(); }}else{if (mbox
->count
>= mbox
->maxCount
) {tTaskExitCritical(status
);return tErrorResourceFull
;}if (notifyOption
& tMBOXSendFront
){if (mbox
->read
<= 0) {mbox
->read
= mbox
->maxCount
- 1;} else {--mbox
->read
;}mbox
->msgBuffer
[mbox
->read
] = msg
;}else {mbox
->msgBuffer
[mbox
->write
++] = msg
;if (mbox
->write
>= mbox
->maxCount
){mbox
->write
= 0;}}mbox
->count
++;}tTaskExitCritical(status
);return tErrorNoError
;
}
參考資料:
【李述銅】從0到1自己動手寫嵌入式操作系統
總結
以上是生活随笔為你收集整理的邮箱的获取与释放的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。