长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机视觉

  • ESP32开发

    • ESP32-开发环境配置
    • ESP32-点亮LED灯
    • ESP32-点亮OLED屏幕
    • ESP32-实时操作系统freertos
      • ESP32-PWM驱动SG90舵机
      • ESP32-网络摄像头方案
    • Linux系统移植

    • 快速开始

    • 编程小知识

    • 技术
    • ESP32开发
    DC Wang
    2025-06-14
    目录

    ESP32-实时操作系统freertos

    # ESP32-FreeRTOS

    本文以ESP32-S3N16R8为例,介绍如何使用FreeRTOS。创建两个任务(Task)分别控制LED闪烁和串口打印消息。

    #include <Arduino.h>
    #include <freertos/FreeRTOS.h>
    #include <freertos/task.h>
    
    // 配置引脚(根据开发板调整LED引脚)
    const uint8_t LED_PIN = GPIO_NUM_48; // 默认LED引脚(需根据开发板调整)
    
    // 任务函数声明
    void blinkLED(void *pvParameters);
    void printMessage(void *pvParameters);
    
    void setup() {
      Serial.begin(115200); // 初始化串口
      pinMode(LED_PIN, OUTPUT);
      
      // 创建任务1:闪烁LED
      xTaskCreate(
        blinkLED,       // 任务函数
        "Blink Task",   // 任务名称
        2048,           // 栈大小(字节)
        NULL,           // 任务参数
        1,              // 优先级(1较低)
        NULL            // 任务句柄
      );
      
      // 创建任务2:串口打印
      xTaskCreate(
        printMessage,
        "Print Task",
        2048,
        NULL,
        1,
        NULL
      );
      
      // 如果setup结束,loop任务会自动运行(优先级为1)
    }
    
    void loop() {
      // 低优先级任务(FreeRTOS调度器会管理任务)
      vTaskDelay(pdMS_TO_TICKS(1000)); // 避免占用CPU
    }
    
    // 任务1:每500ms切换LED状态
    void blinkLED(void *pvParameters) {
      for(;;) { // 无限循环
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
        Serial.println("LED状态切换");
        vTaskDelay(pdMS_TO_TICKS(500)); // 非阻塞延时
      }
      vTaskDelete(NULL); // 安全退出(通常不会执行到这里)
    }
    
    // 任务2:每2秒打印消息
    void printMessage(void *pvParameters) {
      TickType_t lastWakeTime = xTaskGetTickCount();
      const TickType_t period = pdMS_TO_TICKS(2000);
      
      for(;;) {
        Serial.println("[系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2");
        Serial.println("------------------------------------");
        vTaskDelayUntil(&lastWakeTime, period); // 精确周期延时
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64

    # 关键说明:

    1. LED引脚:
      • 默认使用 GPIO48(常见开发板LED引脚)
      • 如果LED不亮,请检查开发板文档并修改LED_PIN
    2. 任务特点:
      • blinkLED:使用vTaskDelay()简单延时
      • printMessage:使用vTaskDelayUntil()实现精确周期执行
    3. 串口监视:
      • 打开Arduino IDE串口监视器(波特率115200)查看输出消息
    4. FreeRTOS优势:
      • 双核处理(ESP32-S3有2个核心)
      • 任务独立运行(LED闪烁不影响消息打印)
      • 精确时间控制

    # 预期输出:

    LED状态切换
    [系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2
    ------------------------------------
    LED状态切换
    LED状态切换
    [系统] FreeRTOS运行中 | 芯片: ESP32-S3 | 内核数: 2
    ------------------------------------
    (持续交替输出...)
    
    1
    2
    3
    4
    5
    6
    7
    8
    编辑 (opens new window)
    #ESP32
    ESP32-点亮OLED屏幕
    ESP32-PWM驱动SG90舵机

    ← ESP32-点亮OLED屏幕 ESP32-PWM驱动SG90舵机→

    最近更新
    01
    ESP32-网络摄像头方案
    06-14
    02
    ESP32-PWM驱动SG90舵机
    06-14
    03
    ESP32-点亮OLED屏幕
    06-14
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式