UCOSII-消息邮箱与消息队列

2023-05-16

文章目录

  • 一.事件控制块及事件处理函数
    • 1.等待任务列表
    • 2.事件控制块的结构
    • 3.操作事件控制块的函数
    • 4.空事件控制块列表
  • 二.消息邮箱
    • 1.消息邮箱介绍
    • 2.消息邮箱操作步骤
  • 三.消息队列
    • 1.消息指针数组
    • 2.队列控制块
    • 3.消息队列的操作流程
  • 四.总结

消息邮箱是特殊的消息队列,是大小为1的消息队列!!!

一.事件控制块及事件处理函数

1.等待任务列表

对于事件来说,当其被占用时,会导致其他请求该事件的任务因暂时的得不到该事件的服务而处于等待状态。作为功能完善的事件,应该对等待任务具有两方面的管理功能:
一是要对等待事件的所有任务进行记录并排序
二是应该允许等待任务有一个等待时限
UCOSII定义了一个INT8U类型的数组OSEventTb1[]作为等待事件的任务的记录表,即等待任务表。位为1则表示为等待任务,0则不是。
为了加快对该表的访问速度,也定义了一个INT8U类型的变量OSEventGrp来表示等待任务表中的等待组。OSEventTb1[]与变量OSEventGrp示意图如下:
在这里插入图片描述

2.事件控制块的结构

为了把事件统一起来,UCOSII用事件控制块ECB的数据结构来描述信号量、消息邮箱、和消息队列等事件。结构如下:

#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)
typedef struct os_event {
    INT8U    OSEventType;                    /* 事件的类型   */
    INT16U   OSEventCnt;                     /* 信号量计数器  */
    void    *OSEventPtr;                     /* 消息或消息队列的指针  */
    OS_PRIO  OSEventGrp;                     /* 等待事件的任务组 */
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE];  /* 任务等待表  */
} OS_EVENT;

在这里插入图片描述

3.操作事件控制块的函数

1)事件控制块初始化函数

void OS_EventWaitListInit(
                            OS_EVENT *pevent    //事件控制块的指针
                         )

在这里插入图片描述
2)使一个任务进入等待状态的函数

void OS_EventTaskWait(
                         OS_EVENT *pevent    //事件控制块的指针
                     )

3)使一个正在等待的任务进入就绪状态的函数

INT8U OS_EventTaskRdy(
                         OS_EVENT *pevent    //事件控制块的指针
                         void *msg,          //未使用
                         INT8U msk           //清除TCB状态标识掩码
                     )

4)使一个等待超时的任务进入就绪状态的函数

void OS_EventTO(
                         OS_EVENT *pevent    //事件控制块的指针
                     )

4.空事件控制块列表

UCOSII初始化时,系统会在初始化函数OSInit()中按照程序使用事件的总数OS_MAX_EVENTS(在文件OS_CFG.H中定义)创建OS_MAX_EVENTS个空事件控制块并借用成员OSEventPtr作为链接指针。由于链表中所有控制块尚未与具体事件想关联,因此叫空事件控制块链表。以后,每当应用程序创建一个事件时,系统会从链表中取出一个空事件控制块,并对它进行初始化以描述该事件。当删除一个事件时,系统会将该事件的控制块归还给空事件控制块链表。
在这里插入图片描述

二.消息邮箱

1.消息邮箱介绍

如果要在任务与与任务之间传递一个数据,那么为了适应不同数据的需要最好在存储器中建立一个数据缓存区,然后以这个缓存区为中介来实现任务间的数据传递
把数据缓存区指针赋给控制块的成员OSEventPtr,同时使事件控制块成员OSEventType为常数OS_EVENT_TYPE_MBOX,则事件控制块就叫做消息邮箱。消息邮箱通过在两个需要通信的任务之间传递数据缓冲区指针进行通信。消息邮箱数据结构如下图:
在这里插入图片描述

2.消息邮箱操作步骤

1.定义消息邮箱

OS_EVENT * msg_key;			//定义按键消息邮箱事件块指针

2.创建消息邮箱

msg_key=OSMboxCreate((void*)0);	//创建消息邮箱,定义msg初值为NULL

3请求消息邮箱

//在主任务中请求消息邮箱,切等待时间为10ms,根据消息邮箱中的键值做出不同的动作
void main_task(void *pdata)
{							 
	u32 key=0;	
	u8 err;	
	u8 semmask=0;
	u8 tcnt=0;						 
	while(1)
	{
		key=(u32)OSMboxPend(msg_key,10,&err);   //请求邮箱函数,请求消息邮箱指针为msg_key,等待时间为100ms
		switch(key)
		{
			case 1://控制DS1
				LED1=!LED1;
				break;
			case 2://发送信号量
				semmask=1;
				OSSemPost(sem_beep);//发送信号量函数,释放信号量,释放信号量后UART_TASK任务才能执行
			    OSMutexPost(sem_mutex);//发送互斥型信号量
				break;
			case 3://清除
				LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
				break; 
			case 4://校准
				OSTaskSuspend(TOUCH_TASK_PRIO);	//挂起触摸屏任务		 
 				if((tp_dev.touchtype&0X80)==0)TP_Adjust();   
 				OSTaskResume(TOUCH_TASK_PRIO);	//解挂
				ucos_load_main_ui();			//重新加载主界面		 
				break;
		}
   		if(semmask||sem_beep->OSEventCnt)//需要显示sem,即此时的信号量计数器值不为0		
		{
			LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
			if(sem_beep->OSEventCnt==0)semmask=0;	//停止更新
		} 
		if(tcnt==50)//0.5秒更新一次CPU使用率
		{
			tcnt=0;
			POINT_COLOR=BLUE;		  
			LCD_ShowxNum(192,30,OSCPUUsage,3,16,0);	//显示CPU使用率   
		}
		tcnt++;
		delay_ms(10);
	}
}

4.发生消息邮箱

//在按键扫描任务中发生消息邮箱
void key_task(void *pdata)
{	
	u8 key;		    						 
	while(1)
	{
		key=KEY_Scan(0);   
		if(key)OSMboxPost(msg_key,(void*)key);//向邮箱发送消息函数,把当前KEY值传送到邮箱当中,在main_task中查询该值,以实现KEY任务与MAINR任务之间的通信
 		delay_ms(10);
	}
}

5.查询邮箱的状态

INT8U OSMboxQuery(
                      OS_EVENT *pevent,      //消息邮箱指针
                      SO_MBOX_DATA *pdata    //存放邮箱消息的结构
                 )

SO_MBOX_DATA 结构如下:

typedef struct
{
  void *OSMsg;
  INT8U OSEventTb1[OS_EVENT_TBL_SIZE];
  INTU8 OSEventGrp;
}SO_MBOX_DATA 

6.删除邮箱

OS_EVENT *OSboxDel(
                     OS_EVENT *pevent,      //消息邮箱指针
                     INT8U opt,             //删除选项
                     INT8U *err             //错误信息
                  )

三.消息队列

使用消息队列可以在任务之间传递多条消息,消息队列由三部分组成:事件控制块、消息队列、消息。
当事件控制块成员OSEventType值为OS_EVENT_TYPE_Q时,该事件控制块代表一个消息队列。
消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向一个叫做队列控制块(OS_Q)的结构,该结构管理着一个数组MsgTb1[],该数组中的元素都是指向消息的指针。
在这里插入图片描述

1.消息指针数组

消息队列的核心部件为消息指针数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以采用2种方式向指针数组插入消息:先进先出的FIFO方式和后进先出的LIFO方式。当采用FIFO方式时,消息队列将在指针OSQIn指向的位置插入消息指针,而OSQOut指向的消息指针为输出;当采用LIFO方式时,则只使用指针OSQOut。

2.队列控制块

UCOSII把消息指针数组的基本参数都记录在一个叫做队列控制块的结构中。队列控制块的结构如下:

#if OS_Q_EN > 0u
typedef struct os_q {                   /* QUEUE CONTROL BLOCK                                         */
    struct os_q   *OSQPtr;              /* Link to next queue control block in list of free blocks     */
    void         **OSQStart;            /* Pointer to start of queue data                              */
    void         **OSQEnd;              /* Pointer to end   of queue data                              */
    void         **OSQIn;               /* Pointer to where next message will be inserted  in   the Q  */
    void         **OSQOut;              /* Pointer to where next message will be extracted from the Q  */
    INT16U         OSQSize;             /* Size of queue (maximum number of entries)                   */
    INT16U         OSQEntries;          /* Current number of entries in the queue                      */
} OS_Q;

在UCOSII系统初始化时,系统将按文件OS_CFG.H中配置OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。由于这时还没有使用它们,因此这个链表叫做空队列控制块列表。
在这里插入图片描述

3.消息队列的操作流程

1)定义消息队列

OS_EVENT * q_msg;			//定义消息队列控制块

2)创建消息队列

q_msg=OSQCreate(&MsgGrp[0],256);	//创建消息队列,缓存区指针数组地址为MsgGrp[0],数组大小为256

3)请求消息队列

//队列消息显示任务:每500ms显示当前消息队列的内容
void qmsgshow_task(void *pdata)
{
	u8 *p;
	u8 err;
	while(1)
	{
		p=OSQPend(q_msg,0,&err);//请求消息队列,且为无限等待
		LCD_ShowString(5,170,240,16,16,p);//显示消息
 		myfree(SRAMIN,p);	  
		delay_ms(500);	 
	}									 
}

4)向消息队列发生消息

//软件定时器3的回调函数,100ms溢出一次,自动发送消息到消息队列			  	   
void tmr3_callback(OS_TMR *ptmr,void *p_arg) 
{	
	u8* p;	 
	u8 err; 
	static u8 msg_cnt=0;	//msg编号	  
	p=mymalloc(SRAMIN,13);	//申请13个字节的内存
	if(p)
	{
	 	sprintf((char*)p,"ALIENTEK %03d",msg_cnt);
		msg_cnt++;
		err=OSQPost(q_msg,p);	//发送队列,q_msg:消息队列指针。p:待发送消息指针
		if(err!=OS_ERR_NONE) 	//发送失败
		{
			myfree(SRAMIN,p);	//释放内存
			OSTmrStop(tmr3,OS_TMR_OPT_NONE,0,&err);	//关闭软件定时器3
 		}
	}
} 

5)清空消息队列

INT8U OSQFlush(
                 OS_EVENT *pevent    //消息队列指针
              )

6)删除消息队列

INT8U OSQDel(
                 OS_EVENT *pevent    //消息队列指针
              )

7)查询消息队列

INT8U OSQQuery(
                 OS_EVENT *pevent    //消息队列指针
                 OS_Q_DATA*pdata     //存放状态信息的结构
              )

函数中的参数pdata是OS_Q_DATApdata类型的指针。OS_Q_DATApdata的机构如下:

typedef struct struct{
    void          *OSMsg;               /* Pointer to next message to be extracted from queue          */
    INT16U         OSNMsgs;             /* Number of messages in message queue                         */
    INT16U         OSQSize;             /* Size of message queue                                       */
    OS_PRIO        OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur         */
    OS_PRIO        OSEventGrp;          /* Group corresponding to tasks waiting for event to occur     */
} OS_Q_DATA;

四.总结

1.消息邮箱是特殊的消息队列,是大小为1的消息队列。
2.消息邮箱是能够在任务之间传递消息指针的数据结构。
3.消息队列是能够在任务之间传递一组消息指针的数据结构。
4.信号量、消息邮箱、消息队列都叫做“事件”,每个事件都有一个用来记录等待事件的任务的表----等待任务表,而任务的等待时限则记录在OSTCBDly中。
5.UCOSII统一用事件控制块来描述各种事件。
6.操作系统中各任务之间的同步与通信是通过各种各样的事件来完成的。
7.重要总结:消息队列的应用有点类似于信号量。
函数需要通过访问事件控制块的成员OSEventPtr指向的队列控制块OS_Q的成员OSQEntries来判断是否有消息可用(有点类似于信号量计数值cnt)。如果有消息可用,则返回OS_Q成员OSQOut指向的消息,同时调整指针OSQOut,使之指向下一条消息并把有效消息数的变量OSQEntries减1,如果无消息可用(也就是OSQEntries=0),则使用调用函数OSQPend()的任务挂起,使之处于等待状态并引发一次任务调度。同样,向队列发送消息后OSQEntries+1.如果希望任务无等待的请求一个消息队列,则可调用函数OSQAccept();函数原型为:void OSQAccept(OS_EVENT *pevent);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UCOSII-消息邮箱与消息队列 的相关文章

  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • STM32上使用UCOSII--消息队列和信号量集

    有关UCOS任务的介绍 xff1a STM32上使用UCOSII 任务 有关UCOS信号量和邮箱的介绍 xff1a STM32上使用UCOSII 信号量和邮箱 一 消息队列 使用消息队列可以在任务之间传递多条消息 消息队列由三个部分组成 x
  • ucosii中消息队列、消息邮箱、信号量的区别

    1 用信号量进行行为同步时 xff0c 只能提供同步的时刻信息 xff0c 不能提供内容信息 若被控制方要求得到控制方的内容信息时 xff0c 可以使用消息邮箱或消息队列 2 但由于消息邮箱里只能存放一条消息 xff0c 所以使用消息邮箱进
  • Ucosii消息邮箱使用

    设置任务优先级 define LED TASK Prio 6 define LED1 TASK Prio 5 用到的UCOSII函数 消息邮箱创建函数 xff1a OS EVENT OSMboxCreate void msg 请求消息邮箱函
  • ucosii消息队列使用

    ucosii消息队列简介 ucosii的消息队列源码定义在os q c文件 xff1b 接口全部声明在ucos ii h xff0c 总共有如下接口 xff1a span class token keyword void span span
  • rtthrea-ucosii-freertos三系统学习总结

    三系统基本功能对比 RT thread ucosii freertos 任务调度 抢占式 时间片式 xff08 多级队列位图调度 xff09 抢占式 xff08 纯位图调度 xff09 抢占式 时间片式 xff08 遍历列表调度 xff09
  • UCOSii中的信号量

    任务间简单通个信 xff0c A告诉B你LED亮一下 这种问题可以用信号量来处理 xff0c UCOSii中关于信号量的函数也就八个 xff0c 今天简单总结下 函数列表 CREATE A SEMAPHORE Description Thi
  • 基于UCOSII的RS485通信(STM32F107)

    一 实现效果 基于ucosii实时操作系统的RS485通信 xff0c 采用USART 43 DMA进行收发 xff0c 二 开发环境 开发工具 xff1a KEIL V5开发板 STM32f107RC采用方式 xff1a USART 43
  • UCOSII 使用笔记

    UCOS使用总结 1 UCOS 是抢占式系统 xff0c 换句话来说 xff0c 优先级高的能够被准时执行 xff0c 优先级低的很容易被高优先级抢占 xff0c 导致执行任务延迟 2 UCOS一般为64个优先级 xff0c 有些可以到25
  • 从零开始学习UCOSII操作系统4--任务管理

    从零开始学习UCOSII操作系统4 任务管理 1 重讲任务 1 任务可以是一个无限的循环 xff0c 也可以在一次执行完毕后被删除 这里需要注意的是 xff0c 任务的代码并不是真正的删除了 xff0c 而是UCOSII不再理会该任务代码
  • 从零开始学习UCOSII操作系统15--总结篇

    从零开始学习UCOSII操作系统15 总结篇 前言 xff1a 在大学的时候 xff0c 我们班级上面都有很多人觉得学习UCOSII 包括UCOSIII 是没什么厉害的 xff0c 因为很多人都喜欢去学习Linux操作系统 xff0c 但是
  • ucosII 信号量使用总结(举例讲解)

    概述 信号量用于 xff1a 1 控制共享资源的使用权 xff08 满足互斥条件 xff09 2 标志某时间的发生 3 使2个任务的行为同步 OSSemCreate 赋初值 OSSemCreate INT16U cnt xff0c cnt为
  • UCOSII之项目实战总结

    电子IT行业博大精深 xff0c 没有人能够用笔记本天天记录自己所学的知识 xff0c 于是乎 xff0c 撰写博客就成了每个 IT民工 的专长 再者 xff0c 写一篇博客 xff0c 其意义与不但记录了自己所需的知识 xff0c 更提高
  • ucosII的书籍

  • UCOSII 信号量和信号量集实例

    代码来自于书本光盘 嵌入式操作系统UCOSII原理及应用 实例1信号量 include 34 includes h 34 define TASK STK SIZE 512 任务堆栈长度 OS STK StartTaskStk TASK ST
  • UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘

    可以观察到OSTickISR Init 函数内部调用了OS ENTER CRITICAL 和OS EXIT CRITICAL 并且 1 该OSTickISR Init 函数所在的 C文件包含了includes h文件 include inc
  • stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决方法之一

    stm32 ucos ii移植 程序执行到OSStart 内部的OSStartHighRdy 语句时跑飞问题解决办法之一 网络上的一些解决办法 stm32程序遇到OSStartHang的问题解决方法总结 但并不适合我遇到的情况 我的情况是已
  • windows下的gcc使用

    文章目录 缘起 正文 安装gcc 使用gcc来编译c语言程序 直接编译生成 exe文件 在cmd里面使用gcc编译器编译c文件流程 利用gcc编译多个c语言源文件 第一步建立文件 编译文件 链接 运行 gcc基本参数 参考文献 缘起 在wi
  • uCOSii中的互斥信号量

    uCOSii中的互斥信号量 一 互斥型信号量项管理 MUTUAL EXCLUSION SEMAPHORE MANAGEMENT OSMutexAccept 无条件等待地获取互斥型信号量 OSMutexCreate 建立并初始化一个互斥型信号

随机推荐

  • Airsim环境下的px4硬件在环仿真

    文章目录 前言1 Airsim和硬件在环介绍2 硬件在环测试的准备工作 xff08 硬件和软件 xff09 2 1 usb ttl转接线的制作 xff1a 2 2 px4的ttl端口波特率设置 3 硬件在环测试过程中的问题4 AirSim
  • 使用Kalibr标定相机和IMU(ZED+px4)外参

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 使用Kalibr标定相机和IMU xff08 ZED 43 px4 xff09 外参 前言一 Kalibr介绍二 CAM IMU外参标定1
  • php curl digest,php curl with digest返回两个响应

    如果对标头使用 I选项 则看起来curl具有相同的行为 xff1a curl I digest u root somepassword http localhost digest test 收益 xff1a HTTP 1 1 401 Aut
  • SET PASSWORD FOR ‘root‘@localhost=PASSWORD(‘XXXX‘);报错

    原因 xff1a 数据库版本较高 老版本 SET PASSWORD FOR root 64 localhost 61 PASSWORD XXXXX 新版本 SET PASSWORD FOR root 64 localhost 61 XXXX
  • ROS学习笔记之小乌龟跟随

    ROS学习笔记之小乌龟跟随 说明 xff1a 整个案例是跟着赵虚左老师的视频和文档资料学习的 xff0c 特此感谢赵虚左老师和Autolabor官方 文档地址 视频地址 学习案例之前的预备知识 xff1a TF坐标变换 大体实现流程 xff
  • MPC,PID,LQR,DDP算法

    算法原理 xff1a
  • 对‘image_transport::ImageTransport::~Image Transport()’未定义的引用

    这是因为cmakelist文件没配置好 xff0c 一般的cmakelist文件配置如下 xff1a cmake minimum required VERSION 2 8 3 project first test pkg Compile a
  • 【VIO笔记(学习VINS的必备基础)】第六讲 视觉前端

    文章目录 前端工作的综述特征点提取 匹配和光流为什么需要角点角点的提取光流的计算光流的总结 关键帧与三角化关键帧三角化三角化程序实现 系列教程来自某学院 xff0c 侵权删除 学习完这一系列课程再去看VINS才能做到不吃力 xff0c 不然
  • windows开机自启动frp教程

    https wp gxnas com 12153 html
  • ubuntu20.08下获取realsense内参

    ubuntu20 08下使用realsense过程记录 介绍一 安装SDK1 注册公钥2 将服务器添加到存储库列表中3 安装库4 安装开发者和调试包5 测试SDK 二 下载realsense2 camera包1 下载包2 测试包3 激活相关
  • 深度视场角(Depth Field of View)

    深度视场角 Depth Field of View Realsense相机深度图的建立依赖双目立体成像原理 xff0c 其有效视场是左 右成像器视场的重叠部分 xff0c 如下图所示 顺带一提 xff0c 这张图不能用于计算双目相机深度成像
  • ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello world xff0c 我们对ROS的整个编程开发过程有了基本的了解 xff0c 现在我们就来编写真正意义上的使用ROS进行节点间通信的程序 由于之前已经建好了catkin ws这样一个工作空间
  • phpStorm2018安装教程

    1 鼠标右击 PhpStorm 2018 2 3 压缩包选择 解压到PhpStorm 2018 2 3 2 双击打开解压后的 PhpStorm 2018 2 3 文件夹 3 鼠标右击 PhpStorm 2018 2 3 exe 选择 以管理
  • 学习Java第一个星期感受和收获

    最近在学习java xff0c 学了有一个星期 xff0c 说一说这个星期的收获和总结吧 xff01 首先我也是从一个小白做起 xff0c 这个星期学习了很多 xff0c 很多java基础知识 xff0c 我印象比较深刻的是基本数据类型和引
  • MySql知识体系总结(2021版)

    一 MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储 提取相分离 下面是MySQL的逻辑架构图 xff1a 1 第一层负责连接管理 授权认证 安全等等 每个客户端的连接都对应着服务器上的一个线程 服务器上维护了一个线程
  • freertos与linux区别,μClinux、μC/OS-II、eCos、FreeRTOS和djyos操作系统的特点及不足-嵌入式系统-与非网...

    基于 STM 平台且满足实时控制要求操作系统 xff0c 有以下 5 种可供移植选择 分别为 Clinux C xff0f OS II eCos FreeRTOS 和都江堰操作系统 djyos 下面分别介绍这五种嵌入式操作系统的特点及不足
  • SM4加密算法原理以及C语言实现

    文章目录 一 算法原理描述1 密钥及密钥参量 xff1a 2 加密算法 3 解密算法 xff1a 4 密钥扩展算法 xff1a 二 C语言算法实现 h部分代码 xff1a c部分代码 xff1a 一 算法原理描述 SM4分组密码算法是一个迭
  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四