TaskScheduler是一个为Arduino、ESPx、STM32和其他微控制器设计的轻量级协作式多任务调度库。它提供了一种比抢占式编程和FreeRTOS等框架更简单易用的替代方案,让您轻松实现多任务处理,无需深陷并发编程的陷阱。
一、 协作式多任务的优势
TaskScheduler采用协作式多任务处理模式。这意味着任务在运行时会主动放弃CPU控制权,从而避免了抢占式多任务可能出现的竞态条件、死锁、活锁以及资源共享等复杂问题。 协作式多任务简化了开发流程,降低了出错的概率,特别适合资源受限的微控制器环境。
二、 主要功能与特性
TaskScheduler拥有丰富的功能,旨在满足各种微控制器多任务编程的需求:
-
• 灵活的任务调度: 支持周期性任务执行,可动态调整任务执行周期(毫秒或微秒)。可以设置任务执行的迭代次数(有限或无限)。
-
• 自定义任务序列: 允许以预定义的顺序执行任务。
-
• 动态参数调整: 运行时可动态修改任务的执行参数,例如频率、迭代次数和回调方法。
-
• 节能机制: 当没有任务需要运行时,系统会进入IDLE休眠模式,节省功耗。
-
• 事件驱动: 通过状态请求对象支持事件驱动型任务调用。
-
• 错误处理与监控: 支持任务ID和控制点,方便错误处理和看门狗定时器集成。
-
• 本地任务存储: 支持本地任务存储指针,允许使用相同的回调代码为多个任务服务。
-
• 分层优先级: 支持分层任务优先级,实现任务间的优先级调度。
-
• 标准函数支持: 支持
std::function
(在 ESPx 和 STM32 上测试)。 -
• 任务超时机制: 设置全局任务超时时间。
-
• 静态和动态回调绑定: 支持静态和动态回调方法绑定,灵活配置任务回调函数。
-
• CPU负载统计: 提供CPU负载/空闲状态统计信息,方便时间关键型应用的性能分析。
-
• 多种调度策略: 提供多种调度策略,包括优先级调度(包含和不包含追赶机制)和时间间隔调度。
-
• 暂停/恢复与启用/禁用: 允许暂停/恢复和启用/禁用任务调度。
-
• 线程安全: 在抢占式调度器(例如FreeRTOS)下运行时保证线程安全。
-
• 动态任务自销毁: 支持动态创建的任务在禁用时自动销毁。
-
• FreeRTOS下”tickless”执行: 在FreeRTOS下支持”tickless”执行,在下一个计划任务调用之前持续休眠。
-
• 低调度开销: 在Arduino UNO rev 3 (16MHz)上,每次调度开销在15到18微秒之间(单调度器,无优先级)。
三、 支持的平台
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 module F测试版)
-
• MSP430 和 MSP432 芯片
-
• Raspberry Pi (需要外部Arduino.h和millis()实现)
四、总结
TaskScheduler 为Arduino等微控制器提供了强大的、易于使用的协作式多任务调度功能。其轻量级的特性和丰富的功能使其成为各种嵌入式应用的理想选择。无论是简单的定时任务,还是复杂的事件驱动系统,TaskScheduler 都能有效地简化开发流程,提高代码质量,并释放微控制器的潜能。
项目地址:https://github.com/arkhipenko/TaskScheduler
原文始发于微信公众号(DIY太阳系):TaskScheduler:一个为Arduino、ESPx、STM32和其他微控制器设计的轻量级协作式多任务调度库
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/307542.html