当前位置: 首页 > news >正文

(学习日记)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、实验现象

在这里插入图片描述

相关文章:

  • vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示
  • solidity(3)
  • SCP 从Linux快速下载文件到Windows本地
  • 移动机器人运动规划 | 基于图搜索的Dijkstra 和 A*算法详解
  • 【软考高项】第二章 信息技术发展
  • WebSocket 对于手游的意义
  • CMake学习笔记(三)区分macro与function
  • 钉钉自建应用-下载excel(h5)
  • 插值表达式
  • 【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用
  • 文件操作详解
  • 蓝桥杯刷题-14-更小的数-区间DP⭐
  • windows or ubuntu mount 文件
  • 初学python记录:力扣1600. 王位继承顺序
  • 【微服务】面试题(一)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • android 一些 utils
  • Angular 4.x 动态创建组件
  • Angular 响应式表单之下拉框
  • Apache的基本使用
  • KMP算法及优化
  • Median of Two Sorted Arrays
  • Next.js之基础概念(二)
  • nginx 配置多 域名 + 多 https
  • nodejs实现webservice问题总结
  • npx命令介绍
  • PHP的Ev教程三(Periodic watcher)
  • XML已死 ?
  • 理解在java “”i=i++;”所发生的事情
  • 漂亮刷新控件-iOS
  • 前端攻城师
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用Python写一份独特的元宵节祝福
  • Hibernate主键生成策略及选择
  • 整理一些计算机基础知识!
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​你们这样子,耽误我的工作进度怎么办?
  • #{}和${}的区别是什么 -- java面试
  • #laravel 通过手动安装依赖PHPExcel#
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.each()与$(selector).each()
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (WSI分类)WSI分类文献小综述 2024
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (蓝桥杯每日一题)love
  • (论文阅读30/100)Convolutional Pose Machines
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .bat文件调用java类的main方法