μC/OS-II---消息邮箱管理2(os_flag.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/175459.html

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

相关文章

【网络奇缘】- 计算机网络|网络类型|性能指标

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分类 1.根据范围分类 ​编辑 2.按使用者分​编辑 3.按交换技术分 ​编辑4.按拓扑结构分 ​…

向量矩阵范数pytorch

向量矩阵范数pytorch 矩阵按照某个维度求和&#xff08;dim就是shape数组的下标&#xff09;1. torch1.1 Tensors一些常用函数 一些安装问题cd进不去不去目录PyTorch里面_表示重写内容 在默认情况下&#xff0c;PyTorch会累积梯度&#xff0c;我们需要清除之前的值 范数是向量或…

如何在群晖虚拟机快速部署线上web网站并实现公网访问

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页&#xff0c;实现公网…

RXMVB2 2RK251 206AN大容量双位置继电器 JOSEF约瑟 DC110V

系列型号&#xff1a; RXMVB2 RK 251 204大容量双位置继电器; RXMVB2 RK 251 205大容量双位置继电器; RXMVB2 RK 251 206大容量双位置继电器; DCS-11大容量双位置继电器; DCS-12大容量双位置继电器; DCS-13大容量双位置继电器; 一、用途 RXMVB2(DCS-10)系列大容量双位置继电器…

数据结构第三课 -----线性表之双向链表

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件&#xff0c;开源免费&#xff0c;对标Visio&#xff0c;用过的都说好。而且除了提供常规的桌面软件之外&#xff0c;直接访问draw.io就可以在线使用&#xff0c;堪称百分之百跨平台&#xff0c;便捷性直接拉满。 那么…

Looking for downloadable pre-built shared indexes关闭

这个功能很烦,把他关闭就行了 PyCharm的“Looking for downloadable pre-built shared indexes”是指PyCharm IDE中的一个功能&#xff0c;用于搜索和下载可共享的预构建索引。 这个功能的主要用途是帮助开发人员在开发过程中快速地获取和使用预构建的索引&#xff0c;以提高…

Supervisor管理器

如果宝塔版本是低于 7.9 可以选用supervisor 管理器&#xff0c;宝塔7.9及以上版本此工具可能出BUG&#xff0c;请选择 堡塔应用管理器跳过本页&#xff0c;看堡塔应用管理器 Supervisor 管理器 和 堡塔应用管理器 二选一使用 步骤总结&#xff1a; 一、切换PHP命令行版本和站…

一文解码语言模型:语言模型的原理、实战与评估

在本文中&#xff0c;我们深入探讨了语言模型的内部工作机制&#xff0c;从基础模型到大规模的变种&#xff0c;并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究&#xff0c;提供了一份全面而深入的视角&#xff0c;旨在帮助读者更准确地理解和评估语言模…

创建具有负载平衡和集群的可扩展 Node.js 应用程序

创建具有负载平衡和集群的可扩展 Node.js 应用程序 负载平衡是提高应用程序性能、可扩展性和可用性的一项重要技术。当客户端向负载均衡器发出请求时&#xff0c;负载均衡器根据预定义的规则将请求分发到不同的实例。 可以使用cluster集群模块或 PM2 等工具根据负载均衡器的流…

使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Java版B/S架构云his医院信息管理系统源码(springboot框架)

一、技术框架 ♦ 前端&#xff1a;AngularNginx ♦ 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus&#xff0c;等 ♦ 数据库&#xff1a;MySQL MyCat ♦ 缓存&#xff1a;RedisJ2Cache ♦ 消息队…