μC/OS-II---消息邮箱管理2(os_mbox.c)

目录

    • 消息邮箱发送(扩展)
    • 从消息邮箱获取/无等待
    • 消息邮箱状态查询
    • 消息邮箱中断等待
    • 用邮箱作为二值信号量(无)
    • 用邮箱实现延时(无)

在这里插入图片描述

消息邮箱发送(扩展)

#if OS_MBOX_POST_OPT_EN > 0u
INT8U  OSMboxPostOpt (OS_EVENT  *pevent,void      *pmsg,INT8U      opt)
{
#if OS_CRITICAL_METHOD == 3u                          /* Allocate storage for CPU status register      */OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                      /* Validate 'pevent'                             */{return (OS_ERR_PEVENT_NULL);}if (pmsg == (void *)0)                            /* Make sure we are not posting a NULL pointer   */{return (OS_ERR_POST_NULL_PTR);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX)    /* Validate event block type                     */{return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u)                     /* See if any task pending on mailbox            */{if ((opt & OS_POST_OPT_BROADCAST) != 0x00u)   /* Do we need to post msg to ALL waiting tasks ? */{while (pevent->OSEventGrp != 0u)          /* Yes, Post to ALL tasks waiting on mailbox     */{(void)OS_EventTaskRdy (pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);}}else                                          /* No,  Post to HPT waiting on mbox              */{(void)OS_EventTaskRdy (pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);}OS_EXIT_CRITICAL();if ((opt & OS_POST_OPT_NO_SCHED) == 0u)       /* See if scheduler needs to be invoked          */{OS_Sched();                               /* Find HPT ready to run                         */}return (OS_ERR_NONE);}if (pevent->OSEventPtr != (void *)0)              /* Make sure mailbox doesn't already have a msg  */{OS_EXIT_CRITICAL();return (OS_ERR_MBOX_FULL);}pevent->OSEventPtr = pmsg;                        /* Place message in mailbox                      */OS_EXIT_CRITICAL();return (OS_ERR_NONE);
}
#endif

从消息邮箱获取/无等待

#if OS_MBOX_ACCEPT_EN > 0u
void  *OSMboxAccept (OS_EVENT *pevent)
{void      *pmsg;
#if OS_CRITICAL_METHOD == 3u                              /* Allocate storage for CPU status register  */OS_CPU_SR  cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                          /* Validate 'pevent'                         */{return ((void *)0);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX)        /* Validate event block type                 */{return ((void *)0);}OS_ENTER_CRITICAL();pmsg               = pevent->OSEventPtr;pevent->OSEventPtr = (void *)0;                       /* Clear the mailbox                         */OS_EXIT_CRITICAL();return (pmsg);                                        /* Return the message received (or NULL)     */
}
#endif

消息邮箱状态查询

#if OS_MBOX_QUERY_EN > 0u
INT8U  OSMboxQuery (OS_EVENT      *pevent,OS_MBOX_DATA  *p_mbox_data)
{INT8U       i;OS_PRIO    *psrc;OS_PRIO    *pdest;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */OS_CPU_SR   cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                           /* Validate 'pevent'                        */{return (OS_ERR_PEVENT_NULL);}if (p_mbox_data == (OS_MBOX_DATA *)0)                  /* Validate 'p_mbox_data'                   */{return (OS_ERR_PDATA_NULL);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX)         /* Validate event block type                */{return (OS_ERR_EVENT_TYPE);}OS_ENTER_CRITICAL();p_mbox_data->OSEventGrp = pevent->OSEventGrp;          /* Copy message mailbox wait list           */psrc                    = &pevent->OSEventTbl[0];pdest                   = &p_mbox_data->OSEventTbl[0];for (i = 0u; i < OS_EVENT_TBL_SIZE; i++){*pdest++ = *psrc++;}p_mbox_data->OSMsg = pevent->OSEventPtr;               /* Get message from mailbox                 */OS_EXIT_CRITICAL();return (OS_ERR_NONE);
}
#endif 

消息邮箱中断等待

#if OS_MBOX_PEND_ABORT_EN > 0u
INT8U  OSMboxPendAbort (OS_EVENT  *pevent,INT8U      opt,INT8U     *perr)
{INT8U      nbr_tasks;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICALif (perr == (INT8U *)0){OS_SAFETY_CRITICAL_EXCEPTION();return (0u);}#endif
#if OS_ARG_CHK_EN > 0uif (pevent == (OS_EVENT *)0)                           /* Validate 'pevent'                        */{*perr = OS_ERR_PEVENT_NULL;return (0u);}#endifif (pevent->OSEventType != OS_EVENT_TYPE_MBOX)         /* Validate event block type                */{*perr = OS_ERR_EVENT_TYPE;return (0u);}OS_ENTER_CRITICAL();if (pevent->OSEventGrp != 0u)                          /* See if any task waiting on mailbox?      */{nbr_tasks = 0u;switch (opt){case OS_PEND_OPT_BROADCAST:                    /* Do we need to abort ALL waiting tasks?   */while (pevent->OSEventGrp != 0u)          /* Yes, ready ALL tasks waiting on mailbox  */{(void)OS_EventTaskRdy (pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);nbr_tasks++;}break;case OS_PEND_OPT_NONE:default:                                       /* No,  ready HPT       waiting on mailbox  */(void)OS_EventTaskRdy (pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);nbr_tasks++;break;}OS_EXIT_CRITICAL();OS_Sched();                                        /* Find HPT ready to run                    */*perr = OS_ERR_PEND_ABORT;return (nbr_tasks);}OS_EXIT_CRITICAL();*perr = OS_ERR_NONE;return (0u);                                           /* No tasks waiting on mailbox              */
}
#endif

用邮箱作为二值信号量(无)

用邮箱实现延时(无)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/185922.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机怎么转移通讯录?简单操作方法来了!

通讯录是手机中存储联系人信息的应用程序&#xff0c;它可以帮助用户方便快捷地进行通讯和信息交流。通讯录记录了我们的亲朋好友、同事等重要人物的联系方式。 如果因更换手机而丢失通讯录&#xff0c;可能会对我们的日常生活和社交带来不便。苹果手机怎么转移通讯录&#xf…

基于PyTorch搭建你的生成对抗性网络

前言 你听说过GANs吗&#xff1f;还是你才刚刚开始学&#xff1f;GANs是2014年由蒙特利尔大学的学生 Ian Goodfellow 博士首次提出的。GANs最常见的例子是生成图像。有一个网站包含了不存在的人的面孔&#xff0c;便是一个常见的GANs应用示例。也是我们将要在本文中进行分享的…

《Linux从练气到飞升》No.29 生产者消费者模型

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

如何用AB测试完善产品激励体系

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 用户激励体系&#xff0c;也称用户激励机制&#xff0c;是为了让用户持续使用产品&#xff0c;而设计的一套对应规则。在用户激励体系建立过程中&#xff0c;产品可…

目前比较好用的护眼台灯?小白入门最适合的护眼台灯推荐

随着人们对家庭环境艺术的重视&#xff0c;台灯因其摆设在桌案台几上的特殊地位&#xff0c;也要进求特有的装饰效果。家居用台灯开始逐新分流为工艺台灯和书写台灯两类。前者追求外观效果&#xff0c;将发展思路放在材质的创新、造型的求异上&#xff0c;以配合风格多样的家居…

新品|CASAIM-IS(2ND)自动化智能检测系统正式上市,打造更高效、更智能、更安全新体验!

全新第二代中科广电CASAIM-IS自动化智能检测系统正式上市&#xff0c;集合CASAIM最新的“智能控制、智能成像、智能检测”三智技术&#xff0c;为中小型精密复杂工件测量及检测提供一站式高效全自动化智能检测解决方案

查看连接过的wifi历史记录及密码

查看连接过的历史wifi及密码 netsh wlan show profile 查看wifi历史记录 netsh wlan show profile name“北固湾” keyclear 查询某个wifi的密码 netsh wlan export profile folderC:\Users\Administrator\Desktop\wifi keyclear 批量导出wifi配置文件查看密码

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

RT-DETR算法优化改进:SCConv,空间和通道重建卷积 | CVPR2023 | 卷积变体大作战

💡💡💡本文改进:SCConv(空间和通道重建卷积),一个即插即用的架构单元,可以直接用来替代各种卷积神经网络中的标准卷积。 1)放入Neck RepC3后面; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR �…

简单高效的定制移动固态硬盘,稳定易用的办公小助手

我在平时的工作中&#xff0c;常常需要处理各种大文件和数据&#xff0c;如果硬盘速度跟不上&#xff0c;那工作效率就会大幅降低。今年固态硬盘的价格大幅下降&#xff0c;有很多国产品牌加入其中&#xff0c;很容易找到一款性价比高的固态硬盘&#xff0c;搭配硬盘盒使用&…

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

01ctfer 文件上传

01ctfer 文件上传 启动靶场 访问该地址 代码审计 <?php header("Content-Type:text/html; charsetutf-8"); // 每5分钟会清除一次目录下上传的文件 require_once(pclzip.lib.php);if(!$_FILES){echo <!DOCTYPE html> <html lang"zh">…