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

  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值