当前位置: 首页 > article >正文

STM32 FreeRTOS 任务挂起和恢复---实验

实验目标

学会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);
    }
}


http://www.kler.cn/a/509806.html

相关文章:

  • 二进制/源码编译安装mysql 8.0
  • RC2在线加密工具
  • [创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。
  • Linux下源码编译安装Nginx1.24及服务脚本实战
  • 接口防篡改+防重放攻击
  • 深度学习 Pytorch 张量(Tensor)的创建和常用方法
  • 【机器学习:二十一、避免高偏差和高方差】
  • Java 8 Stream API
  • C++ macro: Variadic macros (可变参数宏)
  • ArkUI概述
  • idea中远程调试中配置的参数说明
  • 3,Linux文件与目录管理命令及其参数(基于Ubuntu示例进行讲解)
  • SOA(面向服务架构)全面解析
  • 合格的前端,使用xlsx
  • 蓝桥杯真题 - 公因数匹配 - 题解
  • 【LLM】Openai-o1及o1类复现方法
  • 《C++11》深入剖析正则表达式库:解锁文本处理的高效之道
  • vue | 插值表达式
  • K近邻算法实战——电影分类算法
  • 迅为瑞芯微RK3562开发板/核心板应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)...
  • QQ邮箱登录逆向
  • 前端包管理工具npm、pnpm 和 Yarn 的总结对比
  • Python爬虫(5) --爬取网页视频
  • C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14
  • 机器学习中的方差与偏差
  • Kubernetes (K8s) 入门指南