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

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

相关文章

老师们是怎样发期中考试成绩的?

每次期中考试后,老师们总是忙碌于回答家长和学生咨询成绩。技术发展飞快,发布成绩的方式也在不断进步。如今,已经可以通过各种代码、Excel以及小程序等,让学生和家长自助查询成绩,既安全又方便。 简单来说,…

一分钟搞懂什么是this指针(未涉及静态成员和函数)

前言 我们在学习类的过程中,一定听说过this指针,但是并不知道它跟谁相似,又有什么用途,所以接下来,让我们一起去学习this指针吧! 一、this指针的引入 我们先来看下面两段代码,它们输出的是什么&…

Pytorch CUDA CPP简易教程,在Windows上操作

文章目录 前言一、使用的工具二、学习资源分享三、libtorch环境配置1.配置CUDA、nvcc、cudnn2.下载libtorch3.CLion配置libtorch4.CMake Application指定Environment variables5.测试libtorch 四、PyTorch CUDA CPP项目流程1.使用CLion结合torch extension编写可以调用cuda的C代…

DSP生成hex方法

以下使用两种方法生成的HEX文件,亲测可用 (1)万能法 不管.out文件是哪个版本CCS编译器生成的,只要用HEX2000.exe软件,翻译都可以使用。方法: hex2000 -romwidth 16 -memwidth 16 -i -o 20170817chuankou…

问题 D: 过山车(二分图)

首先,绘制二分图 核心思想: 对于每一个左边端点,查找每个右边端点, 若右边端点无对象,则暂时作为该左端点的对象 若右边端点有对象,递归查询其对象是否有其他选择 (1.若有其他选择&#xf…

【Robotframework+python】实现http接口自动化测试

前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了bug,所以需要…

MHA的那些事儿

什么是MHA? masterhight availability:基于主库的高可用环境下,主从复制和故障切换 主从的架构 MHA至少要一主两从 出现的目的:解决MySQL的单点故障问题。一旦主库崩溃,MHA可以在0-30s内自动完成故障切换 MHA使用的…

[MySQL] MySQL中的数据类型

在MySQL中,数据类型用于定义表中列的数据的类型。在前面的几篇文章中,我们也会看到有很多的数据类型,例如:char、varchar、date、int等等。本篇文章会对常见的数据类型进行详细讲解。希望会对你有所帮助! 文章目录 一、…

海康G5系列(armv7l) heop模式下交叉编译Qt qmqtt demo,出现moc缺少高版本GLibc问题之解决

1.编辑源 sudo vi /etc/apt/sources.list 2.添加高版本的源 deb http://th.archive.ubuntu.com/ubuntu jammy main #添加该行到文件 3.运行升级 sudo apt update sudo apt install libc6 4.strings /**/libc.so.6 |grep GLIBC_ 参考链接:version GLIBC_2.3…

github 私人仓库clone的问题

github 私人仓库clone的问题 公共仓库直接克隆就可以,私人仓库需要权限验证,要先申请token 1、登录到github,点击setting 打开的页面最底下,有一个developer setting 这里申请到token之后,注意要保存起来&#xff…

【Python+requests+unittest+excel】实现接口自动化测试框架

一、框架结构: 工程目录 二、Case文件设计 三、基础包 base3.1 封装get/post请求(runmethon.py) 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if header …

Stable Diffusion新手村-我们一起完成AI绘画

1.工具搭建 感谢bilibili的"秋葉aaaki"大佬出的整合包,让我们方便下载安装一键启动,去它的网盘里下载 我的显卡设备,暂时还够哈,出图速度还可以1-2分钟比较美的质感画面 下载以后需要解压下sd-webui-aki-v4.4.7z&#…

spring-cloud-alibaba-sentinel

sentinel (哨兵) 简介 # 官网 - https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_sentinel # github - https://github.com/alibaba/Sentinel/wiki# 简介 - 随着微服务的普及,服务调用的稳定性变得越来…

Eigen的基操

转自博客 博客

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词,那到底什么是cookie呢? Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

【23真题】易,学硕爆冷,题目常规!

今天分享的是23年广州大学823的信号与系统试题及解析。广州大学23年学硕爆冷,一志愿全部录取,不知道24情况将如何。我们拭目以待! 本套试卷难度分析:本套试题内容难度中等偏下,考察的知识点都是比较常见的&#xff0c…

如何使用线性模型的【分箱】操作处理非线性问题

让线性回归在非线性数据上表现提升的核心方法之一是对数据进行分箱,也就是离散化。与线性回归相比,我们常用的一种回归是决策树的回归。为了对比不同分类器和分箱前后拟合效果的差异,我们设置对照实验。 生成一个非线性数据集前,…

【论文阅读】(CTGAN)Modeling Tabular data using Conditional GAN

论文地址:[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务,有着许多挑战。本文设计了CTGAN,使用条件生成器解决挑战。为了帮助进行公…

flutter下拉列表

下拉列表 内容和下拉列表的标题均可滑动 Expanded: 内容限制组件,将其子类中的无限扩展的界面限制在一定范围中。在此使用,是为了防止下拉列表中的内容超过了屏幕限制。 SingleChildScrollView: 这个组件,从名字中可…

C++——友元函数

如下是一个日期类&#xff1a; class Date { public:Date(int year 2023, int month 10, int day 1){_year year;_month month;_day day;if (_month < 1 || month > 12 || _day < 1 || _day > GetMonthDay(_year, _month)){cout << "日期不规范&…