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

news2024/11/23 21:28:44

目录

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

在这里插入图片描述

消息邮箱创建

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/1220332.html

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

相关文章

比特币上的人工智能

以感知机为例 人工智能,尤其是机器学习形式的人工智能,最近取得了巨大的进步,应用范围从人脸识别到自动驾驶汽车。我们建议将 AI 与比特币区块链结合起来,以获得许多其他方式无法实现的显着优势: 公开透明&#xff1a…

面试资料快速复习 Git常用命令(简单实用)

Git-command Git常用命令、面试复习、简单实用命令 ​ 一、概念理解 (一)工作区、暂存区、本地仓库、远程仓库 workspace:工作区staging area:暂存区/缓存区local repository:本地仓库remote repository&#xff…

前端实现页面内容的截图与下载(html2canvas)

今天是一个发文的好日子😀~ 👇👇👇 一个需求,要截取页面中的内容并截图保存,来看一看我是怎么实现的吧: 这里需要使用到插件--html2canvas 1.安装并引入html2canvas npm install html2canv…

Es 拼音搜索无法高亮

目录 背景: Es 版本: 第一步 第二步 (错误步骤 - 只是记录过程) 第三步 第四步 第五步 第六步 第七步 背景: app 原有的搜索功能无法进行拼音搜索,产品希望可以支持,例如内容中含有&a…

upload-labs关卡10(点和空格绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十关通关思路1、看源代码2、bp抓包绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测…

软件质量保护与测试(第2版)学习总结第十一章 白盒测试

错误隐藏在角落里、集聚在边界处 ----Boris Beizer 白盒测试是看源代码的,静态分析和动态分析 11.2 控制流测试 程序结构主要有3种 顺序结构、分支结构、循环结构 #include "stdafx.h" …

C++实现KNN和K-Means

学校机器学习课程的实验课要求实现KNN和K-Means: (平时没听课)临时去查了一下KNN和K-Means是啥,然后自己用C写了小例子,想着写都写了那就把代码贴出来吧。 顺便再聊聊自己对于这俩算法的理解。 下面是文心一言的回答…

洛谷 P3131 [USACO16JAN] Subsequences Summing to Sevens S

被普及-卡的没思路真是蒟蒻啊233 优化思路 每次都在枚举(a[r]-a[l-1])%70,所以可以认为数组大小对最终答案没有影响,考虑对前缀和数组取模,那么如果有a[r]的值等于a[l-1]的值相等(即余数相等),那么两者相减…

米尔AM62x核心板,高配价低,AM335x升级首选

AM335x是TI经典的工业MPU,它引领了一个时代,即工业市场从MCU向MPU演进,帮助产业界从Arm9迅速迁移至高性能Cortex-A8处理器。随着工业4.0的发展,HMI人机交互、工业工控、医疗等领域的应用面临迫切的升级需求,AM62x处理器…

Python 双门双向门禁控制板实时监控源码

本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) #python通过缩进来表示代码块,不可以随意更改每行前面的空白,否则程序会运行错误!!!如果缩进不一致&a…

这款IDEA插件真的爱了

IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件:Api…

Taro编译警告解决方案:Error: chunk common [mini-css-extract-plugin]

文章目录 1. 背景2. 问题分析3. 解决方案3.1 更新 Taro 版本3.2 更新相关依赖3.3 调整 webpack 配置3.4 检查依赖版本 4. 拓展与分析4.1 拓展4.2 避免不必要的依赖4.3 查阅 Taro GitHub 仓库 5. 总结 🎉欢迎来到Java学习路线专栏~Taro编译警告解决方案:E…

golang学习笔记——斐波纳契数列

斐波纳契数列 编写一个程序来计算某个数字的斐波纳契数列。 斐波那契数列是一个数字列表,其中每个数字是前两个斐波那契数字之和。 例如,数字 6 的序列是 1,1,2,3,5,8,数字 7 的序列是 1,1,2,3,5,8,13,数字 8 的序列是 1,1,2,3,5…

[每周一更]-(第72期):Docker容器瘦身方式

Docker清理缓存操作 在构建测试的过程中,由于是自家小服务器,资源紧张,发现磁盘一直爆满,删除一些大镜像还是会占满的情况,就想到是不是也是缓存问题。 经过查询确实是build过程中的缓存启发的占用问题。 因此引出以下…

WPF创建自定义控件编译通过但是找不到资源

报错: 原因: 路径写错了: 不是这样: Source"pack://application:,,,/Controls/Styles/xTabControl.xaml" 而是这样: Source"pack://application:,,,/项目名;component/Controls/Styles/xTabControl.xaml …

Objectarx 使用libcurl请求WebApi

因为开发cad需要请求服务器的数据,再次之前我在服务器搭设了webapi用户传递数据,所以安装了libcurl在objectarx中使用数据。 Open VS2012 x64 Native Tools Command Prompt补充地址: 我在此将相关的引用配置图片,cad里面的应用和…

CI/CD --git版本控制系统

目录 一、git简介 二、git使用 三、github远程代码仓库 一、git简介 Git特点: 速度简单的设计对非线性开发模式的强力支持(允许成千上万个并行开发的分支)完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数…

【Mysql】学习笔记

目录 基本操作登录指令:启动、关闭、重启mysql指令(适用于centos7):查看mysql运行状态:删除和创建表 修改密码(ubuntu18.04可行,其余版本行不行不知道)3 使用MYSQL了解数据库和表 4 …

VR智慧景区:VR赋能文旅产业,激活消费潜能

随着国家数字化战略的不断深入实施,文旅产业数字化转型的步伐也在逐渐加快,以VR技术赋能文旅产业,让文旅景区线上线下双渠道融合,进一步呈现文化底蕴、激活消费潜能。 VR智慧景区以沉浸式、互动式、科技感的方式,将景区…

std::copy代替memcpy

在工作中,经常会有c/c的混合使用。但看到memcpy总是感觉不太安全,c中有一个替代品std::copy,用起来还不错,而且std::copy不会有效率上的损失,放心用吧。迭代器的方式还安全些。 将int数组转换为vector int inputArr[…