uCOS-III学习笔记(10)----等待多个内核对象
理解:等待多个内核对象说的就是,比如一个任务需要等待信号量才能打开led1,等待一个消息队列才能打开led2,此时不用等待多个内核对象的话就算来了信号量也会被pend卡住而不能往下面运行,所以等待多个内核对象解决的就是这类问题。
创建多个内核对象:比如需要等待一个信号量和一个消息队列,多内核对象就可以看成是一个数组
OS_SEM MY_SEM;
OS_Q MyMsgQ;
OS_PEND_DATA mul_pend_array[2];//等待两个 这里就是2OSSemCreate ((OS_SEM *)&MY_SEM,(CPU_CHAR *)"MY_SEM",(OS_SEM_CTR)0,(OS_ERR *)&err);OSQCreate((OS_Q *)&MyMsgQ,(CPU_CHAR *)"MyMsgQ",(OS_MSG_QTY)1000,(OS_ERR *)&err);mul_pend_array[0].PendObjPtr = (OS_PEND_OBJ *)&MY_SEM; //这里要注意类型的匹配mul_pend_array[1].PendObjPtr = (OS_PEND_OBJ *)&MyMsgQ;
创建好后来测试一下,
用任务1循环的发送一个消息队列,
并且增加一个软件定时器来检测按键是否按下,
如果按下发送一个信号量
extern OS_SEM MY_SEM;
extern OS_Q MyMsgQ;
extern OS_PEND_DATA mul_pend_array[2];void tmr1_callback(OS_TMR *p_tmr, void *p_arg);void Task_1(void *p_arg)
{OS_ERR err;OS_TMR tmr1;(void)p_arg;OSTmrCreate((OS_TMR *)&tmr1,(CPU_CHAR *)"tmr1",(OS_TICK )0, (OS_TICK )1, // 1*100ms = 100ms(OS_OPT )OS_OPT_TMR_PERIODIC,(OS_TMR_CALLBACK_PTR) tmr1_callback,(void *)0,(OS_ERR *)&err);OSTmrStart(&tmr1, &err);while(1){OSQPost((OS_Q *)&MyMsgQ,(void *)"I love you, Rick",(OS_MSG_SIZE)sizeof("I love you, Rick"),(OS_OPT )OS_OPT_POST_FIFO | OS_OPT_POST_ALL,(OS_ERR *)&err); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);}
}void Task_2(void *p_arg)
{OS_ERR err;(void)p_arg;while(1){OSPendMulti((OS_PEND_DATA *)mul_pend_array,(OS_OBJ_QTY )2,(OS_TICK )0,(OS_OPT )OS_OPT_PEND_BLOCKING,(OS_ERR *)&err);if(mul_pend_array[0].RdyObjPtr == mul_pend_array[0].PendObjPtr){printf("Key1 is pressed\n");}if(mul_pend_array[1].RdyObjPtr == mul_pend_array[1].PendObjPtr){printf("Received: %s, size: %dbytes.\n", (char *)mul_pend_array[1].RdyMsgPtr, mul_pend_array[1].RdyMsgSize);}}
}void tmr1_callback(OS_TMR *p_tmr, void *p_arg)
{OS_ERR err;if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON){OSSemPost(&MY_SEM, OS_OPT_POST_ALL, &err);}
}
实际结果就是,串口一直打印字符串(因为一直循环发送消息队列),
如果按键按下,打印key is pressed(因为按键按下导致发送了一个信号量)
uCOS-III学习笔记(10)----等待多个内核对象相关推荐
- ucos iii学习笔记——为什么选择ucos iii
首先我们得先讨论前后台系统和RTOS(Real Time OS)的区别.前后台系统,也即是我们所说的裸机程序,它的结构通常包括一个死循环和若干个中断服务程序,直接上图,我们有一个直观认识: 假如Tas ...
- μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列
在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...
- 史上最牛最强的linux学习笔记 10.shell基础
史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传
SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...
- Hadoop学习笔记—10.Shuffle过程那点事儿
Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...
- Linux学习笔记10
Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...
- HALCON 20.11:深度学习笔记(10)---分类
HALCON 20.11:深度学习笔记(10)---分类 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一 ...
最新文章
- 手动配置linux(centos)的IP地址
- 为什么说python是世界上最好的语言-python是世界上最好的语言
- 逻辑推理篇:数据分析中违背常理的悖论:辛普森悖论
- 黄文俊:Serverless小程序后端技术分享
- Elasticsearch--进阶-term_keyword查询---全文检索引擎ElasticSearch工作笔记015
- hadoop安装及简单的使用
- 台式电脑主机前面耳机插孔没声音的解决方法
- visual studio python使用教程_教程:在 Visual Studio 中开始使用 Flask Web 框架
- 手算逆元及手动模拟扩展欧几里得算法及思路推导
- 每天吃多少才不会胖?食物和卡路里对照表
- 转载:Delphi中制作外挂心得
- 《大掌门》欧阳刘彬--基于Cocos2d-x引擎开发经验分享
- Everything研究之读取NTFS下的USN日志文件(2)
- php 生成 webp,使用PHP脚本批量转换webp文件为png文件
- Selective Search学习笔记
- JAVA API1.8中文版 谷歌翻译 最准确的翻译版本!
- 卷积神经网络(一)- 卷积神经网络
- 最新体感:超级街霸4
- 数据库表的主键、唯一约束和索引
- ubuntu下安装和配置Qt5.12.8