推荐一个开源的轻量级任务调度器!TaskScheduler!

server/2025/1/23 21:27:12/

大家好,我是麦鸽。

这次推荐一款轻量级的嵌入式任务调度器,目前已经有1.4Kstar,这个项目比较轻量化,只有5个源文件,可以作为学习的一个开源项目。

394fe8d4503eebea63c561541af97037.png
核心文件

项目概述:

这是一个轻量级的协作式多任务处理(任务调度)实现。相比于抢占式编程和像 FreeRTOS 这样的框架,它提供了一种更简单的替代方案。

为什么是协作式的?

使用协作式处理时,我们无需过多担心并发处理中的陷阱(如竞态条件、死锁、活锁、资源共享等)。

协作式处理的设计天然地解决了这些问题。

正如 Herb Sutter(ISO C++ 标准委员会主席,微软公司)所说:

“每个学习并发编程的人,都认为自己理解了它,但最终都会发现自己遇到了原本认为不可能发生的竞态条件,发现自己其实并没有真正理解它。”

主要特点:

  • 周期性任务执行,支持动态的执行周期(默认是毫秒,也可以启用微秒精度)——执行频率

  • 任务迭代次数(有限或无限次迭代)

  • 预定义顺序执行任务

  • 动态调整任务执行参数(频率、迭代次数、回调方法)

  • 省电模式,当没有任务调度时进入空闲睡眠模式

  • 支持通过状态请求对象(Status Request)进行事件驱动的任务调用

  • 支持任务ID和控制点,用于错误处理和看门狗定时器

  • 支持本地任务存储指针(允许多个任务共享相同的回调代码)

  • 支持分层任务优先级

  • 支持 std::function(仅在 ESPx 和 STM32 测试过)

  • 任务超时功能

  • 支持静态和动态回调方法绑定

  • 提供 CPU负载/空闲统计,适用于时间敏感型应用

  • 支持带有优先级的调度选项(原始调度的优先级及间隔,包括是否处理调度遗漏)

  • 能够暂停/恢复启用/禁用调度

  • 在抢占式调度器(如 FreeRTOS)下提供线程安全的调度

  • 支持动态创建的任务在禁用时自动销毁

  • 支持在 FreeRTOS 下的“无滴答”执行(持续睡眠直到下一次调度任务调用)

  • 调度开销:每次调度约 15 至 18 微秒(以 Arduino UNO rev 3,16MHz 时钟为例,单一调度器,不带优先级)

兼容平台:

TaskScheduler 已在以下平台上进行过测试:

  • Arduino Uno R3

  • Arduino Nano

  • Arduino Micro

  • ATtiny85

  • ESP8266

  • ESP32

  • Teensy(测试过 Teensy 3.5)

  • nRF52(测试过 nRF52832)

  • nRF52 Adafruit Core(测试过 nRF52840,v3.6.2 修复版)

  • STM32(测试过 Mini USB STM32F103RCBT6 ARM Cortex-M3,Leaflabs Leaf maple mini 模块 F)

  • MSP430 和 MSP432 开发板

  • Raspberry Pi(需要外部的 Arduino.h 和 millis() 实现)

该项目为实现协作式多任务处理提供了一个简洁而高效的方案,尤其适用于需要周期性任务和节能模式的嵌入式系统。

0638fef85d83554382eb6463834136c8.png
架构

如何使用?

项目里已经提供了大量的样例程序,不过都是基于Arduino平台,也都是比较好理解的;

9fdbb706c946ba9004fe7c14435da71d.png
样例

下面是一段调度器使用的模板程序,具体如何使用,可以参考一下;

// ==== Debug and Test options ==================
#define _DEBUG_
//#define _TEST_//===== Debugging macros ========================
#ifdef _DEBUG_
#define SerialD Serial
#define _PM(a) SerialD.print(millis()); SerialD.print(": "); SerialD.println(a)
#define _PP(a) SerialD.print(a)
#define _PL(a) SerialD.println(a)
#define _PX(a) SerialD.println(a, HEX)
#else
#define _PM(a)
#define _PP(a)
#define _PL(a)
#define _PX(a)
#endif#include <TaskScheduler.h>
Scheduler ts;void task1Callback();
void task2Callback();// ==== Task definitions ========================
Task t1 (100 * TASK_MILLISECOND, TASK_FOREVER, &task1Callback, &ts, true);
Task t2 (TASK_IMMEDIATE, 100 /* times */, &task2Callback, &ts, true);void setup() {// put your setup code here, to run once:
#if defined(_DEBUG_) || defined(_TEST_)Serial.begin(115200);delay(2000);_PL("Scheduler Template: setup()");
#endif
}// main loop
void loop() {ts.execute();
}void task1Callback() {
_PM("task1Callback()");
//  task code
}void task2Callback() {
_PM("task2Callback()");
//  task code
}

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

往期推荐

新手必看!C语言精华知识:表驱动法

9条必学的嵌入式C语言调试技巧!宏定义的妙用

踩坑了!嵌入式C语言常见的几个陷阱!你遇到过吗?

嵌入式开发又遇到BUG?怎么办?教你几招直接起飞

现成轮子OSAL操作系统抽象层的移植


http://www.ppmy.cn/server/160853.html

相关文章

CentOS 7乱码问题如何解决?

1.使用超级用户操作: sudo su2.修改i18n配置文件&#xff1a; vi /etc/sysconfig/i18n将文件修改或添加为以下内容&#xff1a; LANG"zh_CN.UTF8" LC_ALL"zh_CN.UTF8"保存并退出&#xff08;按Esc键&#xff0c;输入:wq&#xff0c;然后回车&#xff09…

什么是网络爬虫?Python爬虫到底怎么学?

最近我在研究 Python 网络爬虫&#xff0c;发现这玩意儿真是有趣&#xff0c;干脆和大家聊聊我的心得吧&#xff01;咱们都知道&#xff0c;网络上的信息多得就像大海里的水&#xff0c;而网络爬虫就像一个勤劳的小矿工&#xff0c;能帮我们从这片浩瀚的信息海洋中挖掘出需要的…

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具&#xff0c;采用先进的 WinUI 3 框架开发&#xff0c;以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观&#xff0c;还提供了多样化的系统优化选项&#xff0c;旨在帮助用户最大化设备…

大语言模型应用实践:性能与资源的权衡之道

标题&#xff1a;大语言模型应用实践&#xff1a;性能与资源的权衡之道 文章信息摘要&#xff1a; 文章深入探讨了大型语言模型在实践应用中的多维度权衡。从运行成本、模型特点、部署方案等方面分析了不同选择的优劣势。技术实现上强调了模板设计、缓存优化等细节的重要性&am…

Spring WebFlux:响应式编程

在软件开发领域&#xff0c;随着互联网应用的规模和复杂性不断增加&#xff0c;传统的编程模型逐渐暴露出一些局限性&#xff0c;尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;应运而生…

[STM32 HAL库]串口中断编程思路

一、前言 最近在准备蓝桥杯比赛&#xff08;嵌入式赛道&#xff09;&#xff0c;研究了以下串口空闲中断DMA接收不定长的数据&#xff0c;感觉这个方法的接收效率很高&#xff0c;十分好用。方法配置都成功了&#xff0c;但是有一个点需要进行考虑&#xff0c;就是一般我们需要…

不用安装双系统,如何在mac上玩windows游戏呢?

Mac软件推荐 随着技术的进步&#xff0c;越来越多的游戏公司开始发布 Mac 平台的游戏。虽然目前 Windows 系统仍然占据着主导地位&#xff0c;但 Mac 用户同样可以享受丰富的游戏体验。并且借助某些工具&#xff0c;可以实现 Mac 电脑玩 Windows 游戏的需求。 一、Mac 能玩哪些…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…