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

  1. 简述
    1. 任务消息队列与任务信号量相同,均隶属于某一个特定任务,不需要单独创建
    2. 任务在消息队列在,只有该任务才可以接收这个任务消息队列的信息,其它任务只能给这个任务发送信息
  2. 优缺点
    1. 优:处理速度快、RAM开锁小
    2. 缺:只能指定消息发送的对象,只有一个任务接收
  3. 相关函数
    1. OSTaskQPost();  任务消息队列发送函数
    2. OSTaskQPend();  任务消息队列获取函数
  4. 例程
    1. 发送
      /**************************************************
       * 函数名:static void AppTaskKey(void *p_arg)
       * 描述  :按键检测
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskKey(void *p_arg)
      {
          OS_ERR err;
          
          (void)p_arg;
      
          for(;;)
          {
              OSTaskQPost( (OS_TCB        *)&AppTaskLedTCB,       //目标任务控制块
                           (void          *)"dreamer uC/OS-III",     //消息内容
                           (OS_MSG_SIZE    )sizeof("dreamer uC/OS-III"),  //  消息长度
                           (OS_OPT         )OS_OPT_POST_FIFO,         //发送到任务消息队列的入口
                           (OS_ERR        *)&err);                    //返回错误类型
          
              OSTimeDlyHMSM ( 0, 0, 1, 0, OS_OPT_TIME_DLY, & err );                   //每1s发送一次           
          }
      }

       

    2. 接收
      /**************************************************
       * 函数名:static void AppTaskLed(void *p_arg)
       * 描述  :led应用
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **************************************************/
      static void AppTaskLed(void *p_arg)
      {
          OS_ERR err;
          
          CPU_INT32U  cpu_clk_freq;
          CPU_TS  ts;
          OS_MSG_SIZE msg_size;
          char * pMsg;
          
          (void)p_arg;
      
          cpu_clk_freq = BSP_CPU_ClkFreq();   //获取系统时钟
          
          for(;;)
          {
              pMsg = OSTaskQPend( (OS_TICK        )0,     //无期限等待
                                  (OS_OPT         )OS_OPT_PEND_BLOCKING,      //没有消息任务就阻塞
                                  (OS_MSG_SIZE   *)&msg_size,                 //返回消息长度
                                  (CPU_TS        *)&ts,                       //返回消息被发送的时间戳
                                  (OS_ERR        *)&err);                     //返回错误类型
              
              ts = OS_TS_GET() - ts;  //计算时间差
              LED1_TOGGLE;
              
              printf("\r\n 接收到的消息内容为: %s,长度是: %d 字节 \r\n", pMsg,msg_size);
              printf("\r\n 任务消息从被发送到被接收的时间差是: %d us \r\n", ts / (cpu_clk_freq / 1000000));        
          }    
      }

       

  5. 下载验证
  6. 总结
    1. 实际通信中,一个或多个任务发送一个消息给另个任务非常常见,很适合用任务消息队列传递消息
    2. 一个任务给多个任务发送消息的情况相对比较少
    3. 如果任务消息队列可以满足设计需求,尽量不要使用普通消息队列
  7. 参考资料:
    1. 正点原子《STM32F767 UCOS开发手册》
    2. 野火《uC/OS-III内核应用与开发》
    3. 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
    4. 官方源码
  8. 硬件平台:
    1. 正点原子阿波罗F767
  9. 软件平台:
    1. MDK5.2.5
  10. 库版本:
    1. TM32Cube_FW_F7_V1.4.0
  11. uC/OS-III版本
    1. UCOSIII 3.04
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值