FreeRTOS 任务管理学习笔记

FreeRTOS 任务管理学习笔记

引言

本文档旨在通过在STM32微控制器上使用FreeRTOS来理解和实现任务管理。实验的重点是创建和管理多个任务、处理任务同步以及通过简单的硬件接口控制任务状态。

实验概述

实验涉及创建三个任务:

  1. LED1_Task: 每300毫秒切换一次LED。
  2. LED2_Task: 每500毫秒切换一次另一个LED。
  3. Key_Task : 监控按钮按下以暂停或恢复LED1_Task。

此外,创建了一个初始化任务(InitializeTasks)来设置和管理这些任务。

关键概念

1. 任务创建

在FreeRTOS中,任务是通过xTaskCreate函数创建的。该函数接受以下参数:

  • 任务函数: 实现任务功能的函数。
  • 任务名称: 任务的描述性名称。
  • 堆栈大小: 分配给任务的堆栈大小。
  • 参数: 传递给任务函数的参数。
  • 优先级: 任务的优先级。
  • 任务句柄: 创建的任务的句柄,用于任务管理。
示例
c 复制代码
xTaskCreate(LED1_Task, "LED1_Task", configMINIMAL_STACK_SIZE, NULL, 1, &LED1_Task_Handle);

2. 任务延迟

任务可以使用vTaskDelay函数进行延迟,这会使任务暂停指定的时间。延迟时间以滴答为单位指定,可以使用pdMS_TO_TICKS将其从毫秒转换为滴答。

示例
c 复制代码
vTaskDelay(pdMS_TO_TICKS(300));

3. 任务同步

在本实验中,任务同步通过任务暂停和恢复实现:

  • 暂停 : 使用vTaskSuspend暂停任务。这会停止任务的调度。
  • 恢复 : 使用vTaskResume恢复任务。这会使任务重新被调度。
示例
c 复制代码
vTaskSuspend(LED1_Task_Handle);
vTaskResume(LED1_Task_Handle);

4. 按钮去抖动

按钮去抖动通过在检测到按钮状态变化后引入短暂延迟并再次检查状态来确保准确检测到按钮按下。这有助于消除机械开关的抖动。

示例
c 复制代码
if (keyState != lastKeyState)
{
  vTaskDelay(pdMS_TO_TICKS(50)); // 去抖动延迟
  keyState = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10) == GPIO_PIN_RESET) ? 1 : 0;

  if (keyState != lastKeyState)
  {
    lastKeyState = keyState;
    if (keyState == 1)
    {
      key = (key == 1) ? 0 : 1;
      printf("按键按下: %s\r\n", key == 1 ? "1" : "0");
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

      if (key == 1)
      {
        vTaskSuspend(LED1_Task_Handle);
      }
      else
      {
        vTaskResume(LED1_Task_Handle);
      }
    }
  }
}

5. 任务删除

在初始化并创建所有必要任务后,初始化任务(InitializeTasks)会删除自身以释放资源。

示例
c 复制代码
vTaskDelete(&InitializeTasks_Handle);

代码分析

文件: main.c

任务函数
  • LED1_Task: 每300毫秒切换一次GPIOA, Pin 0上的LED。
  • LED2_Task: 每500毫秒切换一次GPIOA, Pin 1上的LED。
  • Key_Task : 监控GPIOA, Pin 10上的按钮按下以暂停/恢复LED1_Task。
初始化函数
  • InitializeTasks: 创建所有任务并在初始化后删除自身。
主函数
  • 初始化外设和FreeRTOS调度器。
  • 创建初始化任务并启动调度器。

结论

本实验提供了对FreeRTOS中任务管理的实际理解,包括任务创建、同步和资源管理。按钮去抖动和任务暂停/恢复的实现展示了如何有效地使用FreeRTOS功能来动态控制任务行为。

相关推荐
深圳市恒锐丰科技杨生13 分钟前
LR010N04SD10 N 沟道 SGT‑MOSFET|Long‑Tek 龙夏电子
嵌入式硬件·硬件工程
西城微科方案开发33 分钟前
方案商|西城微科胎压计方案开发
单片机·嵌入式硬件
深圳市尚想信息技术有限公司38 分钟前
HITENX海速芯TM56M152A-SOP8单片机MCU微控制器IC,高精度ADC-16位PWM国产主控芯片
单片机·嵌入式硬件
艾芯微科技1 小时前
CJX3134K 长晶双 N 沟道 MOS 管详解|SOT-563 20V 小型电源开关方案
网络·单片机·嵌入式硬件·集成测试·51单片机
番茄灭世神1 小时前
PN学堂GD32教程第14篇——Arm单片机启动流程
arm开发·单片机·嵌入式硬件
垆边人似月.2 小时前
找出最小的 K 个数
数据结构·c++·算法
C语言小火车2 小时前
C++ 为什么越来越依赖标准库?
java·开发语言·c++
lhh_qrsly2 小时前
一、电机控制怎么学
驱动开发·嵌入式硬件
八月的雨季 最後的冰吻2 小时前
C++ 面试要点笔记(续)
c++·笔记·面试
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛