邮箱的获取与释放
发布日期:2021-07-01 04:26:16 浏览次数:2 分类:技术文章

本文共 4007 字,大约阅读时间需要 13 分钟。

文章目录

1 邮箱的获取与释放

1.1 设计实现

获取消息:

在这里插入图片描述
释放消息:
在这里插入图片描述
代码如下:

/************************************************************************************************************ Function name        :   tMboxWait** Descriptions         :   等待邮箱, 获取一则消息** parameters           :   mbox 等待的邮箱** parameters           :   msg 消息存储缓存区** parameters           :   waitTicks 最大等待的ticks数,为0表示无限等待** Returned value       :   等待结果,tErrorResourceUnavaliable.tErrorNoError,tErrorTimeout***********************************************************************************************************/uint32_t tMboxWait (tMbox * mbox, void **msg, uint32_t waitTicks) {
uint32_t status = tTaskEnterCritical(); // 首先检查消息计数是否大于0 if (mbox->count > 0) {
// 如果大于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(); // 当切换回来时,从tTask中取出获得的消息 *msg = currentTask->eventMsg; // 取出等待结果 return currentTask->waitEventResult; }}/************************************************************************************************************ Function name : tMboxNoWaitGet** Descriptions : 获取一则消息,如果没有消息,则立即退回** parameters : mbox 获取消息的邮箱** parameters : msg 消息存储缓存区** Returned value : 获取结果, tErrorResourceUnavaliable.tErrorNoError***********************************************************************************************************/uint32_t tMboxNoWaitGet (tMbox * mbox, void **msg){
uint32_t status = tTaskEnterCritical(); // 首先检查消息计数是否大于0 if (mbox->count > 0) {
// 如果大于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; } }/************************************************************************************************************ Function name : tMboxNotify** Descriptions : 通知消息可用,唤醒等待队列中的一个任务,或者将消息插入到邮箱中** parameters : mbox 操作的信号量** parameters : msg 发送的消息** parameters : notifyOption 发送的选项** Returned value : tErrorResourceFull***********************************************************************************************************/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;}

参考资料:

转载地址:https://muzimin.blog.csdn.net/article/details/105077370 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:文本编辑器实现关于对话框的功能
下一篇:邮箱的原理与创建

发表评论

最新留言

很好
[***.229.124.182]2024年05月01日 15时38分59秒