IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> UCOS---等待多个内核对象 -> 正文阅读

[嵌入式]UCOS---等待多个内核对象

UCOS---等待多个内核对象

概述

内核对象,可以指的是信号量、消息队列、互斥锁、事件标志组等

等待多个内核对象

等待多个内核对象,只能等待信号量和消息队列。

在UCOSIII中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOSIII不支持同时等待多个事件标志组或互斥锁。

This function only allows you to pend on semaphores and/or message queues.

OS_OBJ_QTY  OSPendMulti (OS_PEND_DATA  *p_pend_data_tbl,
                         OS_OBJ_QTY     tbl_size,
                         OS_TICK        timeout,
                         OS_OPT         opt,
                         OS_ERR        *p_err)

参数:
p_pend_data_tbl,内核对象的数组
tbl_size,内核对象的数目
timeout,超时时间,默认写0,一直等待
opt,默认写OS_OPT_PEND_BLOCKING,阻塞等待
p_err,返回错误码,没有错误的就返回OS_ERR_NONE

返回值:

0,就绪内核对象的数目
=0,超时或发生错误

注意:
使用上述函数,确保OS_CFG_Q_EN、OS_CFG_SEM_EN、OS_CFG_PEND_MULTI_EN宏定义开关有效,并可在os_cfg.h文件找到。

例程

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "string.h"

//任务函数
void Task1_task(void *parg);
//任务优先级
#define	Task1_TASK_PRIO	6
//任务堆栈大小
#define	Task1_TASK_SIZE	128
//任务堆栈空间
CPU_STK	Task1_TASK_STK[Task1_TASK_SIZE];
//任务控制块
OS_TCB	Task1_TCB;

//任务函数
void Task2_task(void *parg);
//任务优先级
#define	Task2_TASK_PRIO	6
//任务堆栈大小
#define	Task2_TASK_SIZE	128
//任务堆栈空间
CPU_STK	Task2_TASK_STK[Task1_TASK_SIZE];
//任务控制块
OS_TCB	Task2_TCB;


OS_Q	g_queue_usart1;
OS_SEM	g_sem;

OS_PEND_DATA	MyPendArray[2];

int main(void)
{
	//UCOS系统的变量定义
	OS_ERR err;
	
	delay_init();       //延时初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
	uart_init(115200);    //串口波特率设置
	LED_Init();         //LED初始化

	//初始化UCOSIII
	OSInit(&err);
	
	//创建任务1
	OSTaskCreate((OS_TCB 	* )&Task1_TCB,		//任务控制块
				 (CPU_CHAR	* )"Task1_task", 		//任务名字
                 (OS_TASK_PTR )Task1_task, 			//任务函数
                 (void		* )0,					//传递给任务函数的参数
                 (OS_PRIO	  )Task1_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&Task1_TASK_STK[0],	//任务堆栈基地址
                 (CPU_STK_SIZE)Task1_TASK_SIZE/10,	//任务堆栈深度限位
                 (CPU_STK_SIZE)Task1_TASK_SIZE,		//任务堆栈大小
                 (OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void   	* )0,					//用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_NONE, //任务选项
                 (OS_ERR 	* )&err);				//存放该函数错误时的返回值

	//创建任务2
	OSTaskCreate((OS_TCB 	* )&Task2_TCB,		//任务控制块
				 (CPU_CHAR	* )"Task2_task", 		//任务名字
                 (OS_TASK_PTR )Task2_task, 			//任务函数
                 (void		* )0,					//传递给任务函数的参数
                 (OS_PRIO	  )Task2_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&Task2_TASK_STK[0],	//任务堆栈基地址
                 (CPU_STK_SIZE)Task2_TASK_SIZE/10,	//任务堆栈深度限位
                 (CPU_STK_SIZE)Task2_TASK_SIZE,		//任务堆栈大小
                 (OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void   	* )0,					//用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_NONE, //任务选项
                 (OS_ERR 	* )&err);				//存放该函数错误时的返回值		 
			
	//创建信号量,初值为0
	OSSemCreate(&g_sem,"g_sem",0,&err);				 
	//创建消息队列
	OSQCreate(&g_queue_usart1,"g_queue_usart1",16,&err);
	
	MyPendArray[0].PendObjPtr=(OS_PEND_OBJ*)&g_sem;
	MyPendArray[1].PendObjPtr=(OS_PEND_OBJ*)&g_queue_usart1;
	//开启UCOSIII
	OSStart(&err);  
				 
	printf("OS run error.......\r\n");
	while(1);
}

void Task1_task(void *parg)
{
	u32 cnt =0;
	char buf[64]={0};
	
	OS_ERR err;
	printf("task1 is create ok\r\n");

	while(1)
	{
		cnt++;
		sprintf(buf,"task1 run %d times",cnt);
		printf("task1 is running ...\r\n");
		//每三秒发送信号量
		OSSemPost(&g_sem,OS_OPT_POST_1,&err);
		delay_ms(3000);
		OSQPost(&g_queue_usart1,buf,strlen(buf),OS_OPT_POST_FIFO,&err);
		delay_ms(1000);
		
	}
}

void Task2_task(void *parg)
{
	OS_OBJ_QTY obj_count=0;
	OS_ERR err;		
	printf("task2 is create ok\r\n");

	while(1)
	{
		obj_count=OSPendMulti(MyPendArray,2,0,OS_OPT_PEND_BLOCKING,&err);
		if(obj_count>0)
		{
			if(MyPendArray[0].RdyObjPtr == (OS_PEND_OBJ*)&g_sem)
			{
					printf("sem get\r\n");
			}
			if(MyPendArray[1].RdyObjPtr == (OS_PEND_OBJ*)&g_queue_usart1)
			{
				printf("msg:[%s][%d]\r\n",MyPendArray[1].RdyMsgPtr,MyPendArray[1].RdyMsgSize);
			
				memset(MyPendArray[1].RdyMsgPtr,0,MyPendArray[1].RdyMsgSize);
			}
		}
		printf("task2 is running ...\r\n");
		
		delay_ms(1000);
	}
}




任务1每3秒发送一个信号量再延时1秒发送消息队列
任务2将接收到的消息队列和信号量打印到串口
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:45:46  更:2022-02-22 20:48:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:29:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码