外贸网站平台,沈阳 教育 公司 网站建设,wordpress服务器出错,做网站横幅价格大家好#xff0c;我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器#xff0c;目前已经有1.4K的star#xff0c;这个项目比较轻量化#xff0c;只有5个源文件#xff0c;可以作为学习的一个开源项目。 核心文件 项目概述#xff1a; 这是一个轻量级的协作式多任务处理我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器目前已经有1.4K的star这个项目比较轻量化只有5个源文件可以作为学习的一个开源项目。 核心文件 项目概述 这是一个轻量级的协作式多任务处理任务调度实现。相比于抢占式编程和像 FreeRTOS 这样的框架它提供了一种更简单的替代方案。 为什么是协作式的 使用协作式处理时我们无需过多担心并发处理中的陷阱如竞态条件、死锁、活锁、资源共享等。 协作式处理的设计天然地解决了这些问题。 正如 Herb SutterISO C 标准委员会主席微软公司所说 “每个学习并发编程的人都认为自己理解了它但最终都会发现自己遇到了原本认为不可能发生的竞态条件发现自己其实并没有真正理解它。” 主要特点 周期性任务执行支持动态的执行周期默认是毫秒也可以启用微秒精度——执行频率任务迭代次数有限或无限次迭代预定义顺序执行任务动态调整任务执行参数频率、迭代次数、回调方法省电模式当没有任务调度时进入空闲睡眠模式支持通过状态请求对象Status Request进行事件驱动的任务调用支持任务ID和控制点用于错误处理和看门狗定时器支持本地任务存储指针允许多个任务共享相同的回调代码支持分层任务优先级支持 std::function仅在 ESPx 和 STM32 测试过任务超时功能支持静态和动态回调方法绑定提供 CPU负载/空闲统计适用于时间敏感型应用支持带有优先级的调度选项原始调度的优先级及间隔包括是否处理调度遗漏能够暂停/恢复和启用/禁用调度在抢占式调度器如 FreeRTOS下提供线程安全的调度支持动态创建的任务在禁用时自动销毁支持在 FreeRTOS 下的“无滴答”执行持续睡眠直到下一次调度任务调用调度开销每次调度约 15 至 18 微秒以 Arduino UNO rev 316MHz 时钟为例单一调度器不带优先级 兼容平台 TaskScheduler 已在以下平台上进行过测试 Arduino Uno R3Arduino NanoArduino MicroATtiny85ESP8266ESP32Teensy测试过 Teensy 3.5nRF52测试过 nRF52832nRF52 Adafruit Core测试过 nRF52840v3.6.2 修复版STM32测试过 Mini USB STM32F103RCBT6 ARM Cortex-M3Leaflabs Leaf maple mini 模块 FMSP430 和 MSP432 开发板Raspberry Pi需要外部的 Arduino.h 和 millis() 实现 该项目为实现协作式多任务处理提供了一个简洁而高效的方案尤其适用于需要周期性任务和节能模式的嵌入式系统。 架构 如何使用 项目里已经提供了大量的样例程序不过都是基于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 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操作系统抽象层的移植