请求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
相关产品推荐
相关产品推荐

