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

目录

    • 消息邮箱创建
    • 消息邮箱删除
    • 等待邮箱中的消息
    • 向邮箱发送一则消息

在这里插入图片描述

消息邮箱创建

OS_EVENT  *OSMboxCreate (void *pmsg)
{
	OS_EVENT  *pevent;
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
	OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508
	
	if (OSSafetyCriticalStartFlag == OS_TRUE)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return ((OS_EVENT *)0);
	}
	
#endif
	
	if (OSIntNesting > 0u)                       /* See if called from ISR ...                         */
	{
		return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
	}
	
	OS_ENTER_CRITICAL();
	pevent = OSEventFreeList;                    /* Get next free event control block                  */
	
	if (OSEventFreeList != (OS_EVENT *)0)        /* See if pool of free ECB pool was empty             */
	{
		OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
	}
	
	OS_EXIT_CRITICAL();
	
	if (pevent != (OS_EVENT *)0)
	{
		pevent->OSEventType    = OS_EVENT_TYPE_MBOX;
		pevent->OSEventCnt     = 0u;
		pevent->OSEventPtr     = pmsg;           /* Deposit message in event control block             */
#if OS_EVENT_NAME_EN > 0u
		pevent->OSEventName    = (INT8U *) (void *)"?";
#endif
		OS_EventWaitListInit (pevent);
	}
	
	return (pevent);                             /* Return pointer to event control block              */
}

消息邮箱删除

#if OS_MBOX_DEL_EN > 0u
OS_EVENT  *OSMboxDel (OS_EVENT  *pevent,
											INT8U      opt,
											INT8U     *perr)
{
	BOOLEAN    tasks_waiting;
	OS_EVENT  *pevent_return;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
	OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return ((OS_EVENT *)0);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (pevent == (OS_EVENT *)0)                           /* Validate 'pevent'                        */
	{
		*perr = OS_ERR_PEVENT_NULL;
		return (pevent);
	}
	
#endif
	
	if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)         /* Validate event block type                */
	{
		*perr = OS_ERR_EVENT_TYPE;
		return (pevent);
	}
	
	if (OSIntNesting > 0u)                                 /* See if called from ISR ...               */
	{
		*perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
		return (pevent);
	}
	
	OS_ENTER_CRITICAL();
	
	if (pevent->OSEventGrp != 0u)                          /* See if any tasks waiting on mailbox      */
	{
		tasks_waiting = OS_TRUE;                           /* Yes                                      */
	}
	
	else
	{
		tasks_waiting = OS_FALSE;                          /* No                                       */
	}
	
	switch (opt)
	{
		case OS_DEL_NO_PEND:                               /* Delete mailbox only if no task waiting   */
			if (tasks_waiting == OS_FALSE)
			{
#if OS_EVENT_NAME_EN > 0u
				pevent->OSEventName = (INT8U *) (void *)"?";
#endif
				pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
				pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free list  */
				pevent->OSEventCnt  = 0u;
				OSEventFreeList     = pevent;             /* Get next free event control block        */
				OS_EXIT_CRITICAL();
				*perr               = OS_ERR_NONE;
				pevent_return       = (OS_EVENT *)0;      /* Mailbox has been deleted                 */
			}
			
			else
			{
				OS_EXIT_CRITICAL();
				*perr               = OS_ERR_TASK_WAITING;
				pevent_return       = pevent;
			}
			
			break;
			
		case OS_DEL_ALWAYS:                                /* Always delete the mailbox                */
			while (pevent->OSEventGrp != 0u)              /* Ready ALL tasks waiting for mailbox      */
			{
				(void)OS_EventTaskRdy (pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
			}
			
#if OS_EVENT_NAME_EN > 0u
			pevent->OSEventName    = (INT8U *) (void *)"?";
#endif
			pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
			pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
			pevent->OSEventCnt     = 0u;
			OSEventFreeList        = pevent;              /* Get next free event control block        */
			OS_EXIT_CRITICAL();
			
			if (tasks_waiting == OS_TRUE)                 /* Reschedule only if task(s) were waiting  */
			{
				OS_Sched();                               /* Find highest priority task ready to run  */
			}
			
			*perr         = OS_ERR_NONE;
			pevent_return = (OS_EVENT *)0;                /* Mailbox has been deleted                 */
			break;
			
		default:
			OS_EXIT_CRITICAL();
			*perr         = OS_ERR_INVALID_OPT;
			pevent_return = pevent;
			break;
	}
	
	return (pevent_return);
}
#endif

等待邮箱中的消息

void  *OSMboxPend (OS_EVENT  *pevent,
									 INT32U     timeout,
									 INT8U     *perr)
{
	void      *pmsg;
#if OS_CRITICAL_METHOD == 3u                          /* Allocate storage for CPU status register      */
	OS_CPU_SR  cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
	
	if (perr == (INT8U *)0)
	{
		OS_SAFETY_CRITICAL_EXCEPTION();
		return ((void *)0);
	}
	
#endif
#if OS_ARG_CHK_EN > 0u
	
	if (pevent == (OS_EVENT *)0)                      /* Validate 'pevent'                             */
	{
		*perr = OS_ERR_PEVENT_NULL;
		return ((void *)0);
	}
	
#endif
	
	if (pevent->OSEventType != OS_EVENT_TYPE_MBOX)    /* Validate event block type                     */
	{
		*perr = OS_ERR_EVENT_TYPE;
		return ((void *)0);
	}
	
	if (OSIntNesting > 0u)                            /* See if called from ISR ...                    */
	{
		*perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
		return ((void *)0);
	}
	
	if (OSLockNesting > 0u)                           /* See if called with scheduler locked ...       */
	{
		*perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
		return ((void *)0);
	}
	
	OS_ENTER_CRITICAL();
	pmsg = pevent->OSEventPtr;
	
	if (pmsg != (void *)0)                            /* See if there is already a message             */
	{
		pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
		OS_EXIT_CRITICAL();
		*perr = OS_ERR_NONE;
		return (pmsg);                                /* Return the message received (or NULL)         */
	}
	
	OSTCBCur->OSTCBStat     |= OS_STAT_MBOX;          /* Message not available, task will pend         */
	OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
	OSTCBCur->OSTCBDly       = timeout;               /* Load timeout in TCB                           */
	OS_EventTaskWait (pevent);                        /* Suspend task until event or timeout occurs    */
	OS_EXIT_CRITICAL();
	OS_Sched();                                       /* Find next highest priority task ready to run  */
	OS_ENTER_CRITICAL();
	
	switch (OSTCBCur->OSTCBStatPend)                  /* See if we timed-out or aborted                */
	{
		case OS_STAT_PEND_OK:
			pmsg =  OSTCBCur->OSTCBMsg;
			*perr =  OS_ERR_NONE;
			break;
			
		case OS_STAT_PEND_ABORT:
			pmsg = (void *)0;
			*perr =  OS_ERR_PEND_ABORT;               /* Indicate that we aborted                      */
			break;
			
		case OS_STAT_PEND_TO:
		default:
			OS_EventTaskRemove (OSTCBCur, pevent);
			pmsg = (void *)0;
			*perr =  OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */
			break;
	}
	
	OSTCBCur->OSTCBStat          =  OS_STAT_RDY;      /* Set   task  status to ready                   */
	OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status                            */
	OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers                          */
#if (OS_EVENT_MULTI_EN > 0u)
	OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
#endif
	OSTCBCur->OSTCBMsg           = (void      *)0;    /* Clear  received message                       */
	OS_EXIT_CRITICAL();
	return (pmsg);                                    /* Return received message                       */
}

向邮箱发送一则消息

#if OS_MBOX_POST_EN > 0u
INT8U  OSMboxPost (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 > 0u
	
	if (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);
	}
	
#endif
	
	if (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            */
	{
		/* Ready HPT waiting on event                    */
		(void)OS_EventTaskRdy (pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
		OS_EXIT_CRITICAL();
		OS_Sched();                                   /* Find highest priority task 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年软件安装管家目录最新

软件目录 ①【电脑办公】电脑系统(直接安装)Win7Win8Win10OfficeOffice激活office2003office2007office2010office2013office2016office2019office365office2021wps2021Projectproject2007project2010project2016project2019project2013project2021Visio…

VS+Qt+C++ Yolov8物体识别窗体程序onnx模型

程序示例精选 VSQtC Yolov8物体识别窗体程序onnx模型 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC Yolov8物体识别窗体程序onnx模型》编写代码,代码整洁,规…

分布式事务seata的使用

分布式事务介绍 在微服务架构中,完成某一个业务功能可能需要横跨多个服务,操作多个数据库。这就涉及到到了分布式事务,需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据操作,要么全部成功&…

37 关于 undo 日志

前言 undo 和 redo 是在 mysql 中 事务, 或者 异常恢复 的场景下面 经常会看到的两个概念 这里 来看一下 undo, undo 主要是用于 事务回滚 的场景下面 测试表结构如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(128) DEFAULT NUL…

【容器化】Kubernetes(k8s)

文章目录 概述Docker 的管理痛点什么是 K8s云架构 & 云原生 架构核心组件K8s 的服务注册与发现组件调用流程部署单机版部署主从版本Operator来源拓展阅读 概述 Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。 这时候就…

介绍一款 SaaS 服务器监控工具: CloudStats

导读CloudStats 是一个简单而强大的服务器监控和网络监控工具。使用 CloudStats,你可以监控来自世界上任何地方的服务器和网络的所有指标。 最棒的是你不需要有任何特殊的技术技能 - CloudStats 很容易安装在任何数据中心的任何服务器上。 CloudStats 允许你使用任…

一文了解ChatGPT Plus如何完成论文写作和AI绘图

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车,就有可能被淘汰在这个数字化时代,如何能高效地处理文本、文献查阅、PPT…

大势所趋!机器视觉替换传统人工,深眸科技以工业AI视觉赋能生产

如今,在工业4.0的浪潮下,人工智能技术凭借着优化生产流程、实现个性化定制、保障产品安全、促进产业变革等优势,逐渐成为制造业数智化转型的“利器”之一,其在工业生产中的广泛应用使传统制造业焕发生机。 机器视觉作为人工智能快…

vue + antd 动态增加表单并进行表单校验

<template><a-modalv-model:visible="visible":title="formData.id ? 编辑渠道 : 添加渠道":width="850":mask-closable="false":destroy-on-close="true"@ok="onSubmit"@cancel="onClose"&g…

Android SmartTable根据int状态格式化文字及颜色

private void initData() {List<UserInfo> list new ArrayList<>();list.add(new UserInfo("一年级", "李同学", 6, 1, 120, 1100, 450, 0));list.add(new UserInfo("一年级", "张同学", 6, 2, 120, 1100, 450, 1));list…

高转化率的软文都有哪些要素?媒介盒子分享

信息爆炸的时代下用户注意力成为稀缺资源&#xff0c;网络上的各个平台充斥着信息流广告的痕迹&#xff0c;在海量信息内容中&#xff0c;企业想要吸引用户注意力&#xff0c;提高转化率&#xff0c;就需要不断更新文案创意&#xff0c;今天媒介盒子就来分享&#xff1a;高转化…

关于漏洞怎么挖/SRC刷分技巧

Google谷歌爬虫WebRobot自动化SQL检测 这里先用之前的谷歌爬虫爬取足够多的url链接 我这里爬了差不多600条 再打开WebRobot工具,这个会发给大家 它的UI是这样的&#xff0c;里面集成了许多其它小工具&#xff0c;都可以使用 点击注入检测 右键导入URL文件即可 这四个选项…

SOLIDWORKS Electrical工程属性配置与图框

导读 很多工程师都是直接使用现有的图框&#xff0c;但是现有图框会遇到一些问题&#xff0c;自己想显示的内容不知道怎么设置出来&#xff0c;或者是图纸显示的内容太繁杂&#xff0c;行列号不符合自己的习惯。这些问题都是关于图框模板的设计。 一、关于工程属性设计的问题…

井盖位移监测,智能井盖智慧监测方式

在推动城市向智能化和高效化方向发展的过程中&#xff0c;科学技术发挥着至关重要的作用。智能井盖传感器作为科学技术进步的产物&#xff0c;正逐渐在城市管理过程之中崭露头角。这些看似不起眼的设备&#xff0c;虽然隐藏在井盖下方不被人们看到&#xff0c;但实实在在为人民…

html书本翻页效果,浪漫表白日记本(附源码)

文章目录 1.设计来源1.1 书本正面1.2 界面1-21.3 界面3-41.4 界面5-61.5 界面7-81.6 界面9-101.7 界面11-121.8 书本结尾 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/1…

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.16)

电路板原理图 触摸脚选择&#xff1a;PB1、PB2、PB3、PB4、PB5 这里我感觉触摸脚PB5应该是PB0。 程序结构 程序逻辑 其实就是在HS16F3211_TkLib.c中存在与触摸相关的函数&#xff0c;然后在 每个按键封装一个专门对这个按键按下或者松开不同的状态执行不同的操作。 在main.c里…

Michael.W基于Foundry精读Openzeppelin第38期——AccessControlEnumerable.sol

Michael.W基于Foundry精读Openzeppelin第38期——AccessControlEnumerable.sol 0. 版本0.1 AccessControlEnumerable.sol 1. 目标合约2. 代码精读2.1 supportsInterface(bytes4 interfaceId)2.2 _grantRole(bytes32 role, address account)2.3 _revokeRole(bytes32 role, addre…

ERP智能管理系统:智能化的未来之路

ERP智能管理系统&#xff1a;智能化的未来之路 科技飞速发展&#xff0c;人工智能(AI)和大数据等先进技术的应用正在改变着企业的运营模式。其中&#xff0c;ERP智能管理系统在帮助企业实现智能化运营、提高效率、降低成本等方面发挥着越来越重要的作用。本文将为您详细介绍ERP…

有什么好用的后勤管理软件?学校后勤服务要怎么提升满意度?

后勤服务是院校管理中的重要一环&#xff0c;直接影响到师生的工作、学习和生活质量。师生作为学校的核心用户&#xff0c;对后勤服务的质量和满意度有着深刻的体验和感受。因此&#xff0c;他们的评价对于提升学校品牌形象、提高服务质量以及改进学校管理具有至关重要的作用。…