欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

邮箱的获取与释放

发布时间:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 邮箱的获取与释放 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 1 邮箱的获取与释放
      • 1.1 设计实现

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();// 首先检查消息计数是否大于0if (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();// 首先检查消息计数是否大于0if (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; }

参考资料:

  • 【李述铜】从0到1自己动手写嵌入式操作系统
  • 总结

    以上是生活随笔为你收集整理的邮箱的获取与释放的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。