(学习日记)2024.04.10:UCOSIII第三十八节:事件实验

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.04.10:UCOSIII第三十八节:事件实验现象

  • 五十二、UCOSIII:事件实验
    • 1、实验设计与代码
    • 2、实验现象

五十二、UCOSIII:事件实验

1、实验设计与代码

事件标志组实验是在μC/OS中创建了两个任务,一个是设置事件任务,一个是等待事件任务。
两个任务独立运行, 设置事件任务通过检测按键的按下情况设置不同的事件标志位,等待事件任务则获取这两个事件标志位,并且判断两个事件是否都发生, 如果是则输出相应信息,LED进行翻转。
等待事件任务一直在等待事件的发生,等待到事件之后清除对应的事件标记位,具体如下:

#include <includes.h>OS_FLAG_GRP flag_grp;                   //声明事件标志组#define KEY1_EVENT  (0x01 << 0)//设置事件掩码的位0
#define KEY2_EVENT  (0x01 << 1)//设置事件掩码的位1static  OS_TCB   AppTaskStartTCB;      //任务控制块
static  OS_TCB   AppTaskPostTCB;
static  OS_TCB   AppTaskPendTCB;static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];       //任务栈
static  CPU_STK  AppTaskPostStk [ APP_TASK_POST_STK_SIZE ];
static  CPU_STK  AppTaskPendStk [ APP_TASK_PEND_STK_SIZE ];static  void  AppTaskStart  (void *p_arg);               //任务函数声明
static  void  AppTaskPost   ( void * p_arg );
static  void  AppTaskPend   ( void * p_arg );int  main (void)
{OS_ERR  err;OSInit(&err);                       //初始化 μC/OS-III/* 创建起始任务 */OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,//任务控制块地址(CPU_CHAR   *)"App Task Start",//任务名称(OS_TASK_PTR ) AppTaskStart,//任务函数(void       *) 0,//传递给任务函数(形参p_arg)的实参(OS_PRIO     ) APP_TASK_START_PRIO,//任务的优先级(CPU_STK    *)&AppTaskStartStk[0],//任务栈的基地址(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,//任务栈空间剩下1/10时限制其增长(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,//任务栈空间(单位:sizeof(CPU_STK))(OS_MSG_QTY  ) 5u,//任务可接收的最大消息数(OS_TICK     ) 0u,//任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)(void       *) 0,//任务扩展(0表不扩展)(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),//任务选项(OS_ERR     *)&err);//返回错误类型OSStart(&err);//启动多任务管理(交由μC/OS-III控制)
}static  void  AppTaskStart (void *p_arg)
{CPU_INT32U  cpu_clk_freq;CPU_INT32U  cnts;OS_ERR      err;(void)p_arg;BSP_Init();//板级初始化CPU_Init();//初始化 CPU组件(时间戳、关中断时间测量和主机名)cpu_clk_freq = BSP_CPU_ClkFreq();//获取 CPU内核时钟频率(SysTick 工作时钟)cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;//根据用户设定的时钟节拍频率计算 SysTick定时器的计数值OS_CPU_SysTickInit(cnts);//调用 SysTick初始化函数,设置定时器计数值和启动定时器Mem_Init();//初始化内存管理组件(堆内存池和内存池表)#if OS_CFG_STAT_TASK_EN > 0u
//如果启用(默认启用)了统计任务OSStatTaskCPUUsageInit(&err);
#endifCPU_IntDisMeasMaxCurReset();//复位(清零)当前最大关中断时间/* 创建事件标志组 flag_grp */OSFlagCreate ((OS_FLAG_GRP  *)&flag_grp,        //指向事件标志组的指针(CPU_CHAR     *)"FLAG For Test",  //事件标志组的名字(OS_FLAGS      )0,                //事件标志组的初始值(OS_ERR       *)&err);            //返回错误类型/* 创建 AppTaskPost 任务 */OSTaskCreate((OS_TCB     *)&AppTaskPostTCB,//任务控制块地址(CPU_CHAR   *)"App Task Post",//任务名称(OS_TASK_PTR ) AppTaskPost,//任务函数(void       *) 0,//传递给任务函数(形参p_arg)的实参(OS_PRIO     ) APP_TASK_POST_PRIO,//任务的优先级(CPU_STK    *)&AppTaskPostStk[0],//任务栈的基地址(CPU_STK_SIZE) APP_TASK_POST_STK_SIZE / 10,//任务栈空间剩下1/10时限制其增长(CPU_STK_SIZE) APP_TASK_POST_STK_SIZE,//任务栈空间(单位:sizeof(CPU_STK))(OS_MSG_QTY  ) 5u,//任务可接收的最大消息数(OS_TICK     ) 0u,//任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)(void       *) 0,//任务扩展(0表不扩展)(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),//任务选项(OS_ERR     *)&err);//返回错误类型/* 创建 AppTaskPend 任务 */OSTaskCreate((OS_TCB     *)&AppTaskPendTCB,//任务控制块地址(CPU_CHAR   *)"App Task Pend",//任务名称(OS_TASK_PTR ) AppTaskPend,//任务函数(void       *) 0,//传递给任务函数(形参p_arg)的实参(OS_PRIO     ) APP_TASK_PEND_PRIO,//任务的优先级(CPU_STK    *)&AppTaskPendStk[0],//任务栈的基地址(CPU_STK_SIZE) APP_TASK_PEND_STK_SIZE / 10,//任务栈空间剩下1/10时限制其增长(CPU_STK_SIZE) APP_TASK_PEND_STK_SIZE,//任务栈空间(单位:sizeof(CPU_STK))(OS_MSG_QTY  ) 5u,//任务可接收的最大消息数(OS_TICK     ) 0u,//任务的时间片节拍数(0表默认值OSCfg_TickRate_Hz/10)(void       *) 0,//任务扩展(0表不扩展)(OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),//任务选项(OS_ERR     *)&err);//返回错误类型OSTaskDel ( & AppTaskStartTCB, & err );//删除起始任务本身,该任务不再运行
}static  void  AppTaskPost ( void * p_arg )
{OS_ERR      err;(void)p_arg;while (DEF_TRUE)                                    //任务体{if ( Key_ReadStatus ( macKEY1_GPIO_PORT, macKEY1_GPIO_PIN, 1 ) == 1 )//如果KEY1被按下{//点亮LED1printf("KEY1被按下\n");OSFlagPost ((OS_FLAG_GRP  *)&flag_grp,//将标志组的BIT0置1(OS_FLAGS      )KEY1_EVENT,(OS_OPT        )OS_OPT_POST_FLAG_SET,(OS_ERR       *)&err);}if ( Key_ReadStatus ( macKEY2_GPIO_PORT, macKEY2_GPIO_PIN, 1 ) == 1 )//如果KEY2被按下{//点亮LED2printf("KEY2被按下\n");OSFlagPost ((OS_FLAG_GRP  *)&flag_grp,//将标志组的BIT1置1(OS_FLAGS      )KEY2_EVENT,(OS_OPT        )OS_OPT_POST_FLAG_SET,(OS_ERR       *)&err);}OSTimeDlyHMSM ( 0, 0, 0, 20, OS_OPT_TIME_DLY, & err );}}static  void  AppTaskPend ( void * p_arg )
{OS_ERR      err;OS_FLAGS      flags_rdy;(void)p_arg;while (DEF_TRUE)                                         //任务体{//等待标志组的的BIT0和BIT1均被置1flags_rdy =   OSFlagPend ((OS_FLAG_GRP *)&flag_grp,(OS_FLAGS     )( KEY1_EVENT | KEY2_EVENT ),(OS_TICK      )0,(OS_OPT)OS_OPT_PEND_FLAG_SET_ALL |OS_OPT_PEND_BLOCKING |OS_OPT_PEND_FLAG_CONSUME,(CPU_TS      *)0,(OS_ERR      *)&err);if ((flags_rdy & (KEY1_EVENT|KEY2_EVENT)) == (KEY1_EVENT|KEY2_EVENT)){/* 如果接收完成并且正确 */printf ( "KEY1与KEY2都按下\n");macLED1_TOGGLE();       //LED1  翻转}}
}

2、实验现象

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【报错】Python3.9及以上相对路径导入文件夹方式

Python3.9及以上相对路径导入文件夹 python跨文件夹调用别的文件夹下的py文件或参数方式 5.7. 包相对导入 相对导入使用前缀点号。 一个前缀点号表示相对导入从当前包开始。 两个或更多前缀点号表示对当前包的上级包的相对导入&#xff0c;第一个点号之后的每个点号代表一级…

二维相位解包理论算法和软件【全文翻译- 掩码(3.4)】

本节我们将研究从质量图中提取掩码的问题。掩码是一个质量图,其像素只有两个值:0 或 1。零值像素标志着质量最低的相位值,这些相位值将被屏蔽、零权重或忽略。第 5 章中的某些 L/ 正则算法需要使用掩码来定义零权重。掩码还可用于某些路径跟踪算法,如第 4.5 节中将要介绍的…

管廊ar实景可视化巡检提升安全性

在科技日新月异的今天&#xff0c;智慧工地ar远程巡检交互系统应运而生&#xff0c;它是ar开发公司深圳华锐视点综合运用了AR增强现实、5G通信、人工智能、物联网以及GPS北斗定位等前沿技术&#xff0c;为企业打造了一套全新的数字化巡检解决方案。不仅解放了巡检人员的双手&am…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

普通人想要找轻资产创业项目?抖音小店了解一下!

大家好&#xff0c;我是电商小布。 普通人想要创业&#xff0c;考虑的事情无非两点&#xff1a;一个是项目的发展&#xff0c;另一个就是项目的投入和回报。 刚开始的话&#xff0c;大家都是愿意来找一些小而美&#xff0c;轻资产的创业项目来玩的。 而现在相对来说投入不算…

DJ的打碟是什么意思 FL Studio怎么制作打碟的效果

在如今的音乐文化中&#xff0c;DJ打碟已经成为一种重要的表演形式和音乐创作方式。但是&#xff0c;对于许多人来说&#xff0c;仍然会对DJ的打碟到底意味着什么存在疑惑&#xff0c;接下来给大家介绍DJ的打碟是什么意思&#xff0c;FL Studio怎么制作打碟的效果的具体内容。 …

线性代数难学怎么办?到星河社区让飞桨来帮忙!

用飞桨帮我们好好学线性代数 参考自《动手学深度学习》第二章 《漫画线性代数》等。星河社区代码一键执行&#xff1a;线性代数难学怎么办&#xff1f;到星河社区让飞桨来帮忙&#xff01; 线性代数&#xff0c;这个在数学领域举足轻重的学科&#xff0c;是众多学科的基础&am…

『VUE』14. Style绑定(详细图文注释)

目录 行内css动态样式对象引入数组引入代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 大体上和前面的class绑定是一致的,只是class换成了style. 请注意,实际开发中,我们一般建议用class,因为style的权重太高了,用sty…

【科普小文】3分钟搞懂 Apache SeaTunnel CDC 数据同步

CDC简介 CDC(Change Data Capture)是一种用于跟踪数据库库变更事件&#xff08;插入、更新、删除&#xff09;中的行级更改&#xff0c;并将事件以发生的顺序通知到其他系统处理。在容灾场景下&#xff0c;CDC主要实现的是主备间的数据同步&#xff0c;即从主数据库到备数据库…

虚拟主机WordPress网站安装教程

一般的企业官网&#xff0c;简站WordPress小编都推荐使用虚拟主机&#xff0c;用虚拟主机搭建一般的WordPress企业官网足够用了。最主要的好处是使用虚拟主机可以省去了主机维护的成本。 下面是以简站WordPress主题在虚拟主机搭建企业官网为例子&#xff0c;写的一个教程&…

基于java+springboot+vue实现的健身房管理系统(文末源码+Lw)23-223

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用&#xf…

大厂都在用的在线文档编辑器推荐

使用一个高效、便捷的在线文档编辑器是企业提高工作效率的必备工具。选择到合适的在线文档编辑器可以事半功倍。然而现在市面上的在线文档编辑器数不胜数&#xff0c;看的人眼花缭乱&#xff0c;无法从中选择最适合的&#xff0c;今天就推荐几个特别受到大厂青睐的工具&#xf…