You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求ESP32基于RTOS的闪烁示例库及库开发指导

ESP32 RTOS 闪烁库示例(PlatformIO)

库文件结构(PlatformIO 项目内)

在你的 PlatformIO 项目的 lib 目录下创建 BlinkRTOS 文件夹,放入以下两个文件:

1. BlinkRTOS.h(头文件)

#ifndef BLINK_RTOS_H
#define BLINK_RTOS_H

#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

class BlinkRTOS {
private:
    uint8_t _pin;
    uint32_t _delayMs;
    TaskHandle_t _taskHandle;

    // 实际处理闪烁逻辑的成员函数
    void blinkTask();
public:
    // 构造函数:指定引脚和闪烁间隔
    BlinkRTOS(uint8_t pin, uint32_t delayMs);

    // 启动闪烁任务
    void startTask(UBaseType_t priority = tskIDLE_PRIORITY);

    // FreeRTOS 任务函数必须是静态函数(C风格签名)
    static void taskWrapper(void* params);
};

#endif // BLINK_RTOS_H

2. BlinkRTOS.cpp(源文件)

#include "BlinkRTOS.h"

BlinkRTOS::BlinkRTOS(uint8_t pin, uint32_t delayMs) {
    _pin = pin;
    _delayMs = delayMs;
    _taskHandle = nullptr;
    pinMode(_pin, OUTPUT);
}

void BlinkRTOS::startTask(UBaseType_t priority) {
    if (_taskHandle == nullptr) {
        // 创建FreeRTOS任务,传递当前类实例指针作为参数
        xTaskCreate(
            taskWrapper,
            "BlinkTask",
            configMINIMAL_STACK_SIZE,
            this,
            priority,
            &_taskHandle
        );
    }
}

void BlinkRTOS::taskWrapper(void* params) {
    // 将参数转换为类实例指针
    BlinkRTOS* instance = static_cast<BlinkRTOS*>(params);
    // 调用实例的闪烁逻辑函数
    instance->blinkTask();
}

void BlinkRTOS::blinkTask() {
    while (true) {
        digitalWrite(_pin, !digitalRead(_pin));
        vTaskDelay(pdMS_TO_TICKS(_delayMs));
    }
}

主程序用法(src/main.cpp)

#include <Arduino.h>
#include <BlinkRTOS.h>

// 实例化两个闪烁对象,分别控制不同引脚
BlinkRTOS led1(2, 500);  // GPIO2,500ms间隔闪烁
BlinkRTOS led2(4, 1000); // GPIO4,1000ms间隔闪烁

void setup() {
    // 启动两个RTOS任务
    led1.startTask(1); // 优先级1
    led2.startTask(2); // 优先级2
}

void loop() {
    // 主循环可以留空,或者处理其他非RTOS逻辑
    vTaskDelay(pdMS_TO_TICKS(1000));
}

关键知识点说明

  • C/C++库的头文件保护:#ifndef BLINK_RTOS_H 这类宏是为了防止头文件被重复引用,这是C/C++库的基础规范。
  • 静态任务函数的作用:FreeRTOS的任务函数要求是C风格的无成员函数,所以我们用静态的taskWrapper作为桥梁,通过传递类实例指针(this),让静态函数能调用类的非成员逻辑函数blinkTask。
  • PlatformIO库路径:把库放在项目的lib目录下,PlatformIO会自动识别并编译,主程序直接#include <BlinkRTOS.h>即可引用。
  • 任务优先级:startTask参数可以指定任务优先级,数值越高优先级越高(ESP32的FreeRTOS通常支持0~31级)。

内容的提问来源于stack exchange,提问作者user3847280

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:00:22