【7】uC/OS-III应用开发————>事件(STM32F767)

Android 12,通过JNI写framebuff实现白板书写加速 Android 书写加速 阅读详情
  1. 简述
    1. 事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输
    2. 可以实现一对多,多对多的同步,即一个任务可以等待多个事件的发生
    3. 事件仅用于同步,不提供数据传输功能
    4. 允许多个任务对同一事件进行读、写操作
    5. 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走),等效于只设置一次
    6. 事件不与任务相关联,事件相互独立,一个32位的变量就是事件的集合,标识该任务发生的事件类型,
    7. 0:事件类型未发生,1:事件类型己发生
  2. 应用场景
    1. 事件做标志位,判断某些事件是否发生,然后做数据处理
    2. 事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务,中断与任务间的同步
  3. 事件运作机制
    1. 等待接收:可以根据感兴趣的事件类型等待事件的单个/多个事件
    2. 等待成功:必须使用OS_OPT_PEND_FLASG_CONSUME选项来清除己接收到的事件类型,否则不会清除己接收到的事件
    3. 设置事件:对指定事件写入指定的事件类型,设置事件集合的对应事件位为1,可一次同时写多个事件类型
    4. 清除事件:根据写入参数事件句柄和待清除的事件类型,对事件相应位进行清0操作‘
  4. 相关函数
    1. OSFlagCreate();  创建事件标志组
    2. OSFlagDel();  删除事件标志组
    3. OSFlagPend();  等待事件标志组
    4. OSFlagPendAbort();  取消等待事件标志组
    5. OSFlagPendGetFlagsRdy();  获取使任务就绪的事件标志
    6. OSFlagPost();  向事件标志组发布标志
    7. 常用函数:创建、发布、等待
  5. 例程
    1. 创建
          //创建事件标志组 flag_grp
          OSFlagCreate((OS_FLAG_GRP   *)&flag_grp,                                   //指向事件标志组的指针
                       (CPU_CHAR      *)"flag for test",                             //事件标志组的名字
                       (OS_FLAGS       )0,                                           //事件标志组的初始值
                       (OS_ERR        *)&err);                                       //返回错误类型

       

    2. 发布
      /**************************************************
       * 函数名:static void AppTaskKey(void *p_arg)
       * 描述  :按键检测
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskKey(void *p_arg)
      {
          OS_ERR err;
          
          uint8_t KeyValue;
      
          (void)p_arg;
          
          for(;;)
          {
              KeyValue = BSP_KEY_Scan(0);
              if(KeyValue == Key0_PH3_Value)
              {
                  printf("\r\n Key0被按下 \r\n");
                  
                  OSFlagPost( (OS_FLAG_GRP        *)&flag_grp,
                              (OS_FLAGS            )KEY0_EVENT,
                              (OS_OPT              )OS_OPT_POST_FLAG_SET,
                              (OS_ERR             *)&err);
              }
              if(KeyValue == Key1_PH2_Value)
              {
                  printf("\r\n Key1被按下 \r\n");
                  
                  OSFlagPost( (OS_FLAG_GRP        *)&flag_grp,
                              (OS_FLAGS            )KEY1_EVENT,
                              (OS_OPT              )OS_OPT_POST_FLAG_SET,
                              (OS_ERR             *)&err);
              }
              if(KeyValue == Key2_PC13_Value)
              {
                  printf("\r\n Key3被按下 \r\n");
                  
                  OSFlagPost( (OS_FLAG_GRP        *)&flag_grp,
                              (OS_FLAGS            )(KEY0_EVENT | KEY1_EVENT),
                              (OS_OPT              )OS_OPT_POST_FLAG_SET,
                              (OS_ERR             *)&err);
              }           
          }
      }
      

       

    3. 等待
      /**************************************************
       * 函数名:static void AppTaskLed(void *p_arg)
       * 描述  :led应用
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskLed(void *p_arg)
      {
          OS_ERR err;
          
          OS_FLAGS flags_rdy;
          
          (void)p_arg;
            
          for(;;)
          {
              flags_rdy = OSFlagPend( (OS_FLAG_GRP        *)&flag_grp,
                                      (OS_FLAGS            )(KEY0_EVENT | KEY1_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 & (KEY0_EVENT | KEY1_EVENT)) == (KEY0_EVENT | KEY1_EVENT))
              {
                  printf("\r\n key0与key1都按下 \r\n");
                  LED1_TOGGLE;        
              } 
          }
      }

       

  6. 下载验证
  7. 总结
    1. 相同优先级的任务,按顺序执行
  8. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  9. 硬件平台:
    1. 正点原子阿波罗F767
  10. 软件平台:
    1. MDK5.2.5
  11. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  12. uC/OS-III版本
    1. UCOSIII 3.04
检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect 自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈 阅读详情

相关推荐

地瓜机器人RDK Studio使用入门教程

不知道大家在使用AI开发板的时候有没有遇到过板子官方镜像占据空间大难以保存,想要的时候找不到?官方示例项目久而久之便难以找寻?首次登陆开发板连接网络还需要准备显示器键盘鼠标外设繁杂?…为了解决平时开发过程中遇到的种种不便利问题,地瓜机器人创新的推出了RDK Studio这一官方开发者软件,使智能机器人开发迎来新纪元!通过这一软件极大降低了机器人的开发门槛,哪怕是零基础的用户亦可轻松上手RDK系列板卡!

xiongqi123123的博客 3426

UCOSIII使用总结(三)

1、任务创建: OSTaskCreate() 函数 void OSTaskCreate (OS_TCB *p_tcb, CPU_CHAR *p_name, OS_TASK_PTR p_task, void *p_arg, OS_PRIO prio, CPU_STK *p_stk_base, CPU_STK_SIZE stk_limit, CPU_STK_SIZE stk_size, OS_MSG_QTY q_size, OS_TICK time_quanta, void *p_ext, OS_OPT opt

hpf247的博客 1727

Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理

高可用性是指系统在面对故障(如数据库宕机、网络中断)时,能够快速恢复并继续提供服务。Sharding-JDBC 和 Sharding-Proxy 提供了多种机制支持高可用性,同时需要结合底层数据库的高可用方案(如 MySQL 主从复制、MHA)来实现。高可用性和集群管理是 Sharding-JDBC 和 Sharding-Proxy 在生产环境中成功应用的关键。本篇详细介绍了数据库高可用方案、Sharding-JDBC 的故障切换机制、Sharding-Proxy 的集群部署,以及分布式治理功能。

资深架构师分享:深入剖析软件架构,探讨云计算、微服务、大数据等前沿技术。分享实践经验,促进技术交流,共同构建卓越系统。 1393

os_flag.c

typedef  struct  os_flag_grp         OS_FLAG_GRP; struct  os_flag_grp {                                       /* Event Flag Group                                       */

avenger0422的专栏 1218

2019年数学建模美赛经验总结

北京时间2019年1月29号上午9时,数模美赛结束。美赛结束已经10多天了,我在这次竞赛中负责建模和编程,趁现在记忆还比较清晰,写下这篇博客记录第一次参加数学建模美赛的经历。 补更:2019年4月20日公布成绩,笔者最终获得了美赛一等奖 目录 1、基本情况 2、选题 3、分工合作 4、论文写作 5、建模 6、编程 7、入门资源 ...

Smallactive 7万+

Linux系统下奥比中光Astra Pro相机SDK部署与避坑指南

本文详细指导了在Linux系统下部署奥比中光Astra Pro深度相机SDK的全过程,涵盖系统准备、SDK安装、设备权限配置及常见问题排查。重点解析了USB设备规则配置这一关键步骤,并提供了Python与C++项目的集成方法,旨在帮助开发者快速完成相机配置,避免常见陷阱。

weixin_28455801的博客 299

ucos-iii 事件标志组

一 事件标志组相关函数 创建事件标志组 OSFlagCreate() OS_CFG_FLAG_EN OS_FLAG_GRP EngineStatus; OS_ERR err; OSFlagCreate(&EngineStatus, “Engine Status”,(OS_FLAGS)0,&err); 删...

Ningjianwen的专栏 517

避坑指南:PCIe设备兼容性那些坑——聊聊MPS/MRRS设置不当引发的血泪史

本文深入探讨了PCIe设备兼容性问题,特别是MPS/MRRS参数设置不当引发的常见故障。通过详细解析MPS(Max Payload Size)和MRRS(Max Read Request Size)的作用机制,提供Linux内核五大配置策略的对比分析,并分享FPGA加速卡等实战案例的排查经验。文章还介绍了诊断工具链、动态调试技巧以及性能优化方法,帮助工程师有效解决PCIe兼容性难题。

weixin_30872499的博客 419

嵌入式系统学习——STM32之UCOS-III事件标志组和存储管理

事件标志组:        有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。      “或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。      “与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。        在UCOSIII中事件标志组为OS_FL

hjf161105的博客 1497

PCB设计中的规则优先级陷阱:为什么你的过孔总是十字连接?

本文深入解析PCB设计中Altium Designer规则优先级机制,解决过孔总是十字连接而非全连接的问题。通过分析铺铜连接原理和规则匹配逻辑,提供精确控制连接方式的技术实践,包括Custom Query使用和优先级最佳设置,帮助设计师避免常见陷阱,优化高速电路板的电气性能和制造可靠性。

banana的博客 467

电路布局中近场耦合问题

开关电源EMC设计中,传导骚扰超标往往源于空间耦合而非参数问题。某案例中,DC-DC模块的非屏蔽电感磁场泄漏耦合到邻近X电容,导致0.5MHz频点超标。通过将X电容移至PCB底层、优化布局保持15mm间距后,问题完全解决。实践证明:EMC设计需注重空间隔离,优先采用屏蔽电感,滤波元件应远离高频磁场区,布局优化比参数调整更有效。这提示工程师需将电磁兼容视为空间问题而不仅是电气问题。

硬核科技 375

【UCOSIII操作系统】事件篇

UCOSIII操作系统UCOSIII操作系统——事件篇信号量的API函数创建事件标志组->OSFlagCreate()向事件标志组发布标志->OSFlagPost()等待事件标志组->OSFlagPend()等待事件标志组->OSFlagPend() UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 UCOSIII操作系统——任务篇(1)创建任务 UCOSII......

不知道在干嘛每天 3291

22、常见加密哈希算法及安全机制解析

本文详细解析了多种常见加密哈希算法,包括SHA系列、RIPEMD、Tiger、HAVAL、Whirlpool等,涵盖其工作原理、安全性与性能对比。同时探讨了哈希攻击方式如预映像攻击和彩虹表,并介绍了盐、MAC、HMAC等防御机制。结合密码存储、消息完整性验证及区块链应用案例,分析了不同场景下的算法选择建议,并展望了哈希算法在创新、融合与标准化方面的未来发展趋势。

seed的博客 390

【1】uC/OS-III应用开发————>移植uC/OS-III到STM32F767

移植前准备工作: 获取STM32裸机最小工程 跑马灯实验 uC/OS源码获取: https://www.micrium.com/downloadcenter/,下载需要注册帐号 uC/OS文件介绍 移植到STM32工程 按需配置 修改主函数 下载验证 总结 ...

Dream Catcher 506

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【3】uC/OS-III应用开发————>任务管理(STM32F767)

简述: 多任务操作系统核心是对任务的管理,包括:任务创建、挂起、删除、调度等 任务的基本概念: 下载验证 省略 总结 任务的5个状态、任务构成、任务创建流程、用户任务与系统任务 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统uC/OS-III原理及应用(第二版)》 官方...

Dream Catcher 612

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【1】uC/OS-III应用开发————>创建任务(STM32F767)

1 2 3 4 5 6

Dream Catcher 465

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【2】uC/OS-III应用开发————>启动流程(STM32F767)

简述: 系统初始化 空闲任务 CPU初始化 SysTick初始化 内存初始化 OSStart() 主函数 下载验证 总结 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统uC/OS-III原理及应用(第二版)》 官方源码 硬件平台: 正点原子阿波罗F767 软件平...

Dream Catcher 510

【9】uC/OS-III应用开发————>任务信号量(STM32F767)

简述 uC/OS提供任务信号量这个功能,每个任务都有一个32位(用户自定义位宽)的信号量值SemCtr,这个信号量值在任务控制块中包含的,是任务独有的一个信号量通知值 多数情况下,任务信号量可以替代内核对象的二进制信号量、计数信号量 特点 任务信号量更加灵活、速度快、节省RAM、无需单独创建信号量 只能有一个任务接收信号,必须指定接收信号量的任务,才能正确发送信号量, 相关...

Dream Catcher 683

【免费下载】 uC/OS-II 和 uC/OS-III 源码及官方例程集合

本仓库提供了一个资源文件的下载,文件名为 `ucosII和ucosIII源码下载和官方例程集合大打包.rar`。该资源文件包含了以下内容: ### 一、源码部分 1. **uC/OS-II** - 版本:v2.92.15 2. **uC/OS-III** - 版本:v3.03 - 版本:v3.04 - 版本:v3.07.03(最新版本) 3. **uC/CP...

gitblog_09770的博客 871

【4】uC/OS-III应用开发————>消息队列(STM32F767)

2 2 2 2 2 2 2 222 下载验证 总结 任务的迁移状态、常用任务函数、延时函数; 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统uC/OS-III原理及应用(第二版)》 官方源码 硬件平台: 正点原子阿波罗F767 软件平台: MDK5.2.5...

Dream Catcher 790

【6】uC/OS-III应用开发————>互斥信号量(STM32F767)

简述 它是一种特殊的二进制信号量,支持互斥量所有权、递归访问以及防止优先级翻转,实现对临界资源的独占式处理 互斥量的状态: 开锁:任务释放这个互斥量时,该互斥量处于开锁状态,任务失去该互斥量的所有权 闭锁:-----获得----------------,---------------------闭锁------,该互斥量被任务持有 优先级翻转图解 优先级继承 ...

Dream Catcher 512

【10】uC/OS-III应用开发————>任务消息队列(STM32F767)

简述 下载验证 总结 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统uC/OS-II原理及应用(第二版)》 官方源码 硬件平台: 正点原子阿波罗F767 软件平台: MDK5.2.5 库版本: TM32Cube_FW_F7_V1.4.0 uC/OS-III版本...

Dream Catcher 491

【13】uC/OS-III应用开发————>CPU利用率及堆栈检测统计(STM32F767)

下载验证 总结 uC/OS支持中断嵌套,即当前中断可以被更高优先级中断打断 在OS中,很多时候我们会主动进入临界段,系统不允许当前状态被中断打断 进入与退出时需要调用OSIntEnter()和OSIntExit(),方便中断嵌套管理 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统uC...

Dream Catcher 1806

【0】从0到1教你写uC/OS-III————>开篇:为什么要重复造轮子

为什么要重复造轮子 市面上的教程都是怎么调用库函数,很少对其实现原理进行分析;本教程从最简单系统讲起,不断迭代,教你怎么从0开始把uC/OS-iii写出来; 能深入了解uC/OS的运行机制,当在调试程序时能快速定位错误点,而不是一头莫展; 如何学习RTOS? 目前市面所有的RTOS内核实现方式、运行机制大同小异;深入学习其中一款,再换其它的RTOS都是得心应手 就如同熟悉一个人,...

Dream Catcher 503

【5】uC/OS-III应用开发————>信号量(STM32F767)

下载验证 略 总结 消息队列指针传递,传送的是首地址 参考资料: 正点原子《STM32F767 UCOS开发手册》 野火《uC/OS-III内核应用与开发》 《嵌入式实时操作系统?uC/OS-III原理及应用(第二版)》 官方源码 硬件平台: 正点原子阿波罗F767 软件平台: MDK5.2.5 库版本: TM32Cube_FW_F7_V1.4.0 uC/OS-I...

Dream Catcher 712

【8】uC/OS-III应用开发————>软件定时器(STM32F767)

简述 定时器:是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率 分类: 硬件定时器: 芯片本身提供的功能 每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息 软件定时器: 由操作系统提供的一类系统接口,构建在硬件定时器(SysTick)基础上 软件定时器指定时间到过后要调用的函数(也称超时函数/回调...

Dream Catcher 575
上一篇: 【6】uC/OS-III应用开发————>互斥信号量(STM32F767)
下一篇: 【8】uC/OS-III应用开发————>软件定时器(STM32F767)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值