实验目标
学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用:
start_task:用来创建其他的三个任务。
task1:实现LED1每500ms闪烁一次。
task2:实现LED2每500ms闪烁一次。
task3:判断按键按下逻辑,KEY1按下,挂起task1,按下KEY2在任务中恢复task1。
CubeMX环境准备
添加 KEY2
STM32 FreeRTOS 任务创建和删除实验(动态方法)-CSDN博客
基于上述代码进行修改和添加
FreeRTOSConfig.h代码清单
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_xTaskResumeFromISR 1
// 文件中已有该宏定义,原值为0,修改为1即可,请勿重复定义
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
注意查看上下代码是否有重复,方式:双击单词查看
参考:STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态-CSDN博客
通过编译没有错误,证明迁移完成
FreeRTOS_demo.h代码清单
#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "key.h"
#include <stdio.h>
#include "stm32f1xx_hal.h"
// 主入口:启动(创建启动任务,开启调度器)
void FreeRTOS_Start(void);
#endif
FreeRTOS_demo.c代码清单
添加task4
// 5. Task4 任务函数和相关参数
#define TASK4_NAME "Task4"
#define TASK4_STACK_DEPTH 128
#define TASK4_PRIORITY 5
TaskHandle_t task4_handler;
void Task4(void *pvParameters);
启动函数体中添加xtaskcreate---task4
xTaskCreate(
(TaskFunction_t)Task4,
(char *)TASK4_NAME,
(configSTACK_DEPTH_TYPE)TASK4_STACK_DEPTH,
(void *)NULL,
(UBaseType_t)TASK4_PRIORITY,
&task4_handler);
改写task3和书写task4的函数体
void Task3(void *pvParameters)
{
while (1)
{
// printf("Task3 正在运行...\n");
// 检测按键,如果key1按下就挂起Task1,如果key2按下就恢复Task1
uint8_t key = Key_Detect();
if (key == KEY1_PRESS)
{
printf("挂起 Task1 任务...\n");
vTaskSuspend(task1_handler);
}
else if (key == KEY2_PRESS)
{
printf("恢复 Task1 任务...\n");
vTaskResume(task1_handler);
}
vTaskDelay(10);
}
}
// 定义用于接收任务列表信息的缓冲区
char buff[1024];
// Task4函数体:查看任务状态列表
void Task4(void *pvParameters)
{
while (1)
{
printf("Task4 运行,查询任务列表...\n");
vTaskList(buff);
printf("%s", buff);
vTaskDelay(1000);
}
}