zoukankan      html  css  js  c++  java
  • STM32CubeIDE+FreeRTOS消息队列实验

    新建工程RTOS_Message,配置如下:

    Ctrl + S生成代码

    修改代码,

    1,在main.h中添加

    //添加include
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    /* USER CODE END Includes */

    2,在main.c中添加

    //添加_write函数重定义
    /* USER CODE BEGIN PFP */
    int _write(int file , char *ptr,int len)
    {
        int i = 0;
        for(i = 0;i<len;i++)
            ITM_SendChar((*ptr++));
        return len;
    }
    /* USER CODE END PFP */
    ...
    ...
    ...
    /* USER CODE BEGIN 2 */
    printf("starting...
    ");
    /* USER CODE END 2 */

    3,在main.c中修改3个任务入口函数的内容

    /* USER CODE BEGIN Header_StartDefaultTask */
    /**
      * @brief  Function implementing the defaultTask thread.
      * @param  argument: Not used 
      * @retval None
      */
    /* USER CODE END Header_StartDefaultTask */
    void StartDefaultTask(void const * argument)
    {
      /* USER CODE BEGIN 5 */
        int timeCount = 0;
      /* Infinite loop */
      for(;;)
      {
        printf("DefaultTask----time   %d
    ",timeCount++);
        osDelay(1000);
      }
      /* USER CODE END 5 */ 
    }
    /* USER CODE BEGIN Header_StartSendTask */
    /**
    * @brief Function implementing the sendTask thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartSendTask */
    void StartSendTask(void const * argument)
    {
      /* USER CODE BEGIN StartSendTask */
      /* Infinite loop */
      for(;;)
      {
        osDelay(2000);//等待2秒
        osMessagePut(myQueue01Handle, 1, 0);//发送消息1
        osDelay(3000);//等待3秒
        osMessagePut(myQueue01Handle, 2, 0);//发送消息2
      }
      /* USER CODE END StartSendTask */
    }
    /* USER CODE BEGIN Header_StartReceiveTask */
    /**
    * @brief Function implementing the receiveTask thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartReceiveTask */
    void StartReceiveTask(void const * argument)
    {
      /* USER CODE BEGIN StartReceiveTask */
        osEvent theEvent;//声明一个事件
      /* Infinite loop */
      for(;;)
      {
        //获取消息,如果没有消息就一直等待
          theEvent = osMessageGet(myQueue01Handle, osWaitForever);
          if(theEvent.status == osEventMessage)
          {
              printf("Receive message %ld
    ",theEvent.value.v);
          }
      }
      /* USER CODE END StartReceiveTask */
    }

    修改完毕后点击 小锤子 构建工程,然后点击Debug,按如下步骤配置ITM调试

     

     全速运行之前一定要先点击SWV ITM data Console 页面中的红色圆圈

    现象:

     分析:

    DefaultTask 负责每秒输出一个当前的时间信息,表示此时时间为第几秒。

    SendTask先等待2秒发送消息1,再等待3秒发送消息2。

    ReceiveTask为获取消息队列内容,如果获取成功,将获取的信息打印出来。

    看输出信息,当第3秒时,ReceiveTask接收到消息1,第5秒时,ReceiveTask接收到消息2.

    实现了任务间通过消息队列进行通信。

  • 相关阅读:
    [探索][管理]《现在,发现你的优势》
    【成功智慧】010.依靠忍耐度过困难时期
    爱情五十九课,就差一句话
    VSS2005 托管 VS2010代码
    一个网站的金字塔战略
    【成功智慧】013.脚踏实地的去做,没有完不成的任务
    MU.Bread 麦卡优娜
    【成功智慧】012.要有耐心去等待成功的到来
    【成功智慧】009.要能够承受所发生的事情
    【成功智慧】014.一日复一日的度过难关
  • 原文地址:https://www.cnblogs.com/tianxxl/p/12018190.html
Copyright © 2011-2022 走看看