邮箱的获取与释放
发布日期: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秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
系统调用过程的理解
2019-05-01
Ant内置任务之whichresource
2019-05-01
Ant内置任务之symlink
2019-05-01
jface databinding:部分实现POJO对象的监测
2019-05-01
深入理解python--线程、进程与协程(1)
2019-05-01
Java--流重点总结初稿
2019-05-01
Html2Servlet--Html代码转换为Servlet小程序
2019-05-01
HTTP认证方式
2019-05-01
图书商城:分类模块
2019-05-01
图书商城:订单模块
2019-05-01
开源全能播放器Vitamio的使用
2019-05-01
使用ViewPager加载页面出现空白
2019-05-01
ImageView scaleType
2019-05-01
RecyclerView notifyItem闪屏问题
2019-05-01
dubbo学习笔记 十一 dubbo-rpc之模块
2019-05-01
motan学习笔记 五 opentracing学习入门
2019-05-01
求列表最长子序列
2019-05-01
字符串的排序
2019-05-01