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

news2025/4/3 16:41:25

目录

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

在这里插入图片描述

消息邮箱创建

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探讨计算机内存管理:分页与分段的地址空间维度差异(为什么分页机制中逻辑地址空间是一维的,而分段机制中逻辑地址空间是二维的?)

在计算机系统中,内存管理是一个至关重要的组成部分,而分页机制和分段机制是两种常见的内存管理方式。一个引人疑惑的问题是:为什么分页机制中逻辑地址空间是一维的,而分段机制中逻辑地址空间是二维的呢?在本文中&#…

Nacos漏洞复现合集

本文主要复现nacos的一些经典漏洞,既是分享也是为了记录自己的成长,近期会持续更新。 1. QVD-2023-6271 Nacos身份绕过漏洞 1.1 漏洞级别 :高危 1.2 漏洞描述:低版本的Nacos存在默认的scertkey在未更换的情况下可以生成任意的可…

部署百川大语言模型Baichuan2

Baichuan2是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。包含有 7B、13B 的 Base 和 Chat 版本,并提供了 Chat 版本的 4bits 量化。 模…

C++——内存管理(new/delete使用详解)

C内存管理 本章思维导图: 注:本章思维导图对应的xmind文件和.png文件已同步导入至资源 1. C/C内存区域的划分 在C/C中,内存区域主要划分为:内核区域、栈区、内存映射段、堆区、数据段、代码段等区域,如图&#xff1…

mysql数据库报错:1166-Incorrect column name ‘xxx‘

如图,我的报错是:1166-Incorrect column name ‘book_date’,很奇怪,其它的字段都没有报错,但是book_date报错了 报错原因:引入了空字符 可以看到我的鼠标和book_date中间还有一个空格。所以导致该行创建失…

ERP是什么意思?看这一篇就够了!

如果你身在制造业,那么一定对ERP不陌生。天天把ERP挂在嘴边,但你真的了解什么是ERP吗?本篇文章将介绍以下几点:1.ERP是什么意思;2.ERP的功能;3.ERP的落地案例。 一、ERP是什么意思 ERP是企业资源计划&…

5、鸿蒙项目远程调试

一、注册华为账号, 如果是华为手机,并注册了账号可能跳过此步骤,如果使用邮箱注册,此邮箱一定是要正确的邮箱,此处需要使用邮箱获取验证码 注册地址:‎ 1、进入注册页面,输入手机号等信息后点…

Python 爬虫之scrapy 库

文章目录 总的介绍相关模块 总的介绍 Scrapy是一个用于爬取网站数据的开源Python框架。它提供了一套强大而灵活的工具,用于从网站上提取所需的数据。Scrapy是基于Twisted异步网络库构建的,因此可以高效地处理大量的并发请求。以下是Scrapy的一些主要特点…

APUS与深圳大学大数据国家工程实验室联合训练开源中文大模型

日前,APUS与深圳大学大数据系统计算技术国家工程实验室(以下简称“国家工程实验室”)达成战略合作。双方集成各自优势联合开发、开源高性能中文多模态大模型Linly-Chinese-LLaMA-2-70B。该模型将更加适配中文服务场景,计划于2024年…

WebDAV之π-Disk派盘 + RS文件管理器

手机本地文件,网盘、共享文件,如何集中管理?推荐您使用Rs文件管理器,还支持WebDAV等功能。 Rs文件管理器是一款功能强大的手机文件管理器。有强大的本地和网络文件管理功能,让您更方便的管理你的手机、平板、电脑和网盘。可以帮助您轻松管理手机本地存储文件和网络文件,…

keepalived+haproxy配置集群和负载均衡

1、简介 1.1. Keepalived Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备…

19C进入数据库出现问号

问题情况如图所示: 解决方法: su - oracle echo "NLS_LANGAMERICAN_AMERICA.ZHS16GBK;export NLS_LANG" >> ~/.bash_profilesource ~/.bash_profileofile

几种实现子容器水平垂直居中的方法

几种实现子容器水平垂直居中的方法 前言子容器Flexbox 布局position绝对定位transform表格布局 缺点 前言 本文主要讲解有几种方法可以实现容器与子容器水平垂直居中&#xff0c;这些方法的使用方式。那么好&#xff0c;本文正式开始。 子容器 Flexbox 布局 <div style&…

经纬恒润马来西亚工厂正式投入试运行

2023年11月&#xff0c;经纬恒润在中国境外的第一家工厂正式投入试运行。新工厂位于马来西亚&#xff0c;于2023年4月开始筹建&#xff0c;规划总产能500万个汽车电子控制器&#xff0c;主要用于生产新能源汽车电子产品&#xff0c;以满足国外客户日益增长的需求。 经纬恒润马来…

C++编译器对临时对象的优化

思考&#xff1a;我们在构造运算符重载号重载的时候会构造那些函数呐&#xff1f;&#xff1f;&#xff1f; 例子&#xff1a;小dome //该运算重载函数 由 左操作数调用&#xff0c;右操作数当做实参传递给该函数//触发t1t3->t1.operator (t3)Test operator (const Test &a…

印刷设备丝杆选择研磨杆还是冷轧杆好?

在印刷设备中&#xff0c;选择研磨杆还是冷轧杆取决于具体的使用需求和设备要求。以下是关于两种丝杆选择的要点&#xff1a; 1、精度要求&#xff1a;研磨杆通常具有更高的制造精度&#xff0c;能够有效保证印刷设备的精度和稳定性。研磨杆经过精细研磨和校准&#xff0c;具有…

Express基本接口开发-入门学习

前提推荐 任何一个新的知识都是从文档看起&#xff0c;因此express官方文档示例有必要去学习一遍。 推荐看&#xff1a; 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了&#xff0c;然后现在就可以去练习了 注意&#xff1a;更多示例-代…

什么猫罐头好吃?猫咪嘎嘎炫的5款猫主食罐头推荐!

想必铲屎官都知道给猫咪长期吃主食罐头的好处了吧&#xff01;主食罐头不仅营养丰富&#xff0c;还能让猫咪顺便补充水分。有时候猫咪食欲不佳&#xff0c;一罐猫主食罐头就能让它们胃口大开呢~ 作为家里有3只猫的铲屎官来说&#xff0c;养猫的这几年可以说血泪史了&#xff0…

GreenCloud VPS 重装系统后无法 SSH 的解决方法

发布于 2023-07-17 在 https://chenhaotian.top/vps/greencloud-ssh-fix/ 解决方法 发工单让客服解决即可。 操作过程 Tu Pham Operator 客服 Hello, We have fixed your problem, please try again! Thanks! Tu Pham, Senior Technician - GreenCloudVPS 17th July 2023…

微信个人号api

简要描述&#xff1a; 登录E云平台 请求URL&#xff1a; http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/json 参数&#xff1a; 参数名必选类型说…