邮箱的获取与释放
发布日期:2021-07-01 04:26:16
浏览次数:3
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月28日 05时24分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unix时间戳和Java中的时间戳的区别
2019-05-02
2018阿里巴巴全球数学竞赛预选赛
2019-05-02
关于Java中的除以零的研究
2019-05-02
Spring Boot 2.1.0新特性
2019-05-02
Java中的位向量——BitSet
2019-05-02
Java8日期类用法示例
2019-05-02
通俗易懂的Java线程不安全
2019-05-02
线程安全类错误使用示范
2019-05-02
Java8的Optional
2019-05-02
CentOS和Ubuntu上实用文件格式转换工具
2019-05-02
mysql中的_rowid
2019-05-02
第一章-go开发环境准备与HelloWorld
2019-05-02
第二章-go中的变量
2019-05-02
第三章-go中的常量
2019-05-02
第五章-go中的字符串
2019-05-02
第四章-go中的数组和切片
2019-05-02
Java中ArrayList的对象引用问题
2019-05-02
mysql踩坑记录之limit和sum函数混合使用问题
2019-05-02
MySql之事务管理
2019-05-02
MySql之触发器的使用
2019-05-02