STM32CubeIDE+FreeRTOS任务管理实验

新建工程RTOS_Task,配置如下:

 

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...\n");
/* 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\n",timeCount++);
    osDelay(1000);
  }
  /* USER CODE END 5 */ 
}
/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
    int times = 0;
  /* Infinite loop */
  for(;;)
  {
    printf("Task02----times   %d\n",times++);
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}
/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(3000);//等待3秒

    osThreadSuspend(myTask02Handle);//挂起线程Task02

    osDelay(3000);//等待3秒

    osThreadResume(myTask02Handle);//恢复线程Task02
  }
  /* USER CODE END StartTask03 */
}

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

 

 

 

 

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

 

 现象:

 

 分析:

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

Task02每秒输出一次,表示此次为第几次输出。

Task03等待3秒挂起Task02,在等待3秒回复Task02.

程序刚运行时,DefaultTask 和 Task02同频率输出,3秒钟之后DefaultTask继续输出,而Task02不再输出。

再等待3秒,Task03将Task02 恢复,Task02 继续输出,如此循环。

此次实现了任务的挂起与恢复。

 

posted @ 2019-12-10 17:12  飞起的小田  阅读(2526)  评论(0编辑  收藏  举报