大家好,我是麦鸽。
这次推荐一款轻量级的嵌入式任务调度器,目前已经有1.4K
的star
,这个项目比较轻量化,只有5个源文件,可以作为学习的一个开源项目。
这是一个轻量级的协作式多任务处理(任务调度)实现。相比于抢占式编程和像 FreeRTOS 这样的框架,它提供了一种更简单的替代方案。
使用协作式处理时,我们无需过多担心并发处理中的陷阱(如竞态条件、死锁、活锁、资源共享等)。
协作式处理的设计天然地解决了这些问题。
正如 Herb Sutter(ISO C++ 标准委员会主席,微软公司)所说:
“每个学习并发编程的人,都认为自己理解了它,但最终都会发现自己遇到了原本认为不可能发生的竞态条件,发现自己其实并没有真正理解它。”
std::function
(仅在 ESPx 和 STM32 测试过)TaskScheduler 已在以下平台上进行过测试:
该项目为实现协作式多任务处理提供了一个简洁而高效的方案,尤其适用于需要周期性任务和节能模式的嵌入式系统。
项目里已经提供了大量的样例程序,不过都是基于Arduino
平台,也都是比较好理解的;
下面是一段调度器使用的模板程序,具体如何使用,可以参考一下;
// ==== 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
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
往期推荐