首页 > 其他 > 详细

STM32CubeIDE+FreeRTOS消息队列实验

时间:2019-12-10 19:25:00      阅读:381      评论:0      收藏:0      [点我收藏+]

新建工程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 */

 

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\n",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\n",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.

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

 

STM32CubeIDE+FreeRTOS消息队列实验

原文:https://www.cnblogs.com/tianxxl/p/12018190.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!