TaskScheduler:轻量级的协作式多任务调度器,Arduino、ESP32、STM32 等微控制器

文摘   2024-11-05 00:01   湖南  

在嵌入式开发中,多任务处理是提高系统效率和功能的关键。而对于资源有限的微控制器,传统的抢占式多任务框架(如 FreeRTOS)可能过于复杂和消耗资源。此时,轻量级的协作式多任务调度器 TaskScheduler 就成为了理想的选择。

TaskScheduler 简介

TaskScheduler 是一个为 Arduino、ESPx、STM32 等微控制器提供协作式多任务处理功能的库。它提供了简单易用的 API,让你能够轻松地创建、管理和执行多个任务,而无需深入了解复杂的抢占式调度机制。

为什么选择协作式多任务?

相较于抢占式多任务,协作式多任务有以下优势:

  • • 简化编程: 开发者只需专注于任务逻辑,无需考虑线程同步、锁等复杂问题。

  • • 资源效率: 由于没有上下文切换的开销,协作式多任务更加轻量级,更适合资源受限的微控制器。

  • • 易于调试: 由于任务执行顺序可控,调试过程更加容易。

TaskScheduler 的主要特性

  • • 周期性任务执行: 可以设定任务执行的频率(毫秒或微秒)和迭代次数。

  • • 动态参数调整: 可以动态修改任务的执行频率、迭代次数和回调方法。

  • • 事件驱动: 通过状态请求对象,可以实现事件驱动的任务执行。

  • • 任务优先级: 支持多层级的任务优先级,能够有效地管理不同任务的执行顺序。

  • • CPU 负载统计: 提供 CPU 负载和空闲时间统计,方便分析系统性能。

  • • 低功耗模式: 当没有任务需要执行时,可以进入休眠模式以节省功耗。

  • • 线程安全: 在运行在抢占式调度器(如 FreeRTOS)下时,仍然可以保证调度操作的线程安全。

  • • 跨平台支持: 支持多种常见的微控制器平台,包括 Arduino、ESPx、STM32 等。

TaskScheduler 的使用示例

假设你想要实现一个简单的 LED 闪烁功能:

#include <TaskScheduler.h>

TaskScheduler scheduler;
Task task1;

void setup() {
pinMode(LED_BUILTIN, OUTPUT);

// 创建一个周期为 500 毫秒的任务,回调函数为 blinkLED
  task1.setInterval(500);
  task1.setCallback(blinkLED);
  scheduler.addTask(task1);
}

void loop() {
// 处理其他任务
  scheduler.execute();
}

void blinkLED() {
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
}

总结

TaskScheduler 为 Arduino 和其他微控制器提供了简单易用的协作式多任务处理功能。它能够有效地简化多任务编程,提高系统效率,并降低开发难度。无论是简单的 LED 闪烁还是复杂的功能实现,TaskScheduler 都能满足你的需求。

项目地址:https://github.com/arkhipenko/TaskScheduler


DIY太阳系
分享嵌入式系统知识,写精华文章!
 最新文章