当前位置: 首页 > news >正文

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

大家好,我是麦鸽。

这次推荐一款轻量级的嵌入式任务调度器,目前已经有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操作系统抽象层的移植

相关文章:

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

大家好&#xff0c;我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器&#xff0c;目前已经有1.4K的star&#xff0c;这个项目比较轻量化&#xff0c;只有5个源文件&#xff0c;可以作为学习的一个开源项目。 核心文件 项目概述&#xff1a; 这是一个轻量级的协作式多任务处理&…...

【18】Word:明华中学-儿童医保❗

目录 题目​ NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向&#xff1a;横向→纸张大小&#xff1a;A3 &#xff1b;页面设置对话框&#xff1a;直接输入纸张大小的宽度和高度即可→页面设置对话框&#xff1a;上下左右边距→版式&…...

如何用selenium来链接并打开比特浏览器进行自动化操作(1)

前言 本文是该专栏的第76篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者将基于“比特浏览器”,通过selenium来实现链接并打开比特浏览器,进行相关的“自动化”操作。 值得一提的是,在本专栏之前,笔者有详细介绍过“使用selenium或者pyppeteer(puppeteer)…...

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码&#xff0c;可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRe…...

读spring官方文档的一些关键知识点介绍

目录 bean definitionBeanPostProcessorBeanFactoryPostProcessorComponent and Further Stereotype AnnotationsAOP Concepts bean definition https://docs.spring.io/spring-framework/docs/5.1.3.RELEASE/spring-framework-reference/core.html#beans-child-bean-definiti…...

2024年AI与大数据技术趋势洞察:跨领域创新与社会变革

目录 引言 技术洞察 1. 大模型技术的创新与开源推动 2. AI Agent 智能体平台技术 3. 多模态技术的兴起:跨领域应用的新风口 4. 强化学习与推荐系统:智能化决策的底层驱动 5. 开源工具与平台的快速发展:赋能技术创新 6. 技术安全与伦理:AI技术的双刃剑 7. 跨领域技…...

ThinkPhp项目解决静态资源请求的跨域问题的解决思路

背景&#xff1a;我在前端使用vue语言开发的&#xff0c;请求的后端是用ThinkPhp项目开发的。我vue项目里的请求php接口&#xff0c;自带header参数的跨域问题通过网上查询到的server端配置方法已经解决了。我使用的 是中间件的配置方法&#xff1a; <?php//admin 项目 配…...

mybatis的多对一、一对多的用法

目录 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 多对一&#xff1a; 一对多&#xff1a; 2、非聚合的多对一做法&#xff1a; 3、非聚合的一对多做法&#xff1a; 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 当我需要多对一、一对…...

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…...

前端发送Ajax请求的技术Axios

目录 1.引入Axios文件 2.使用Axios发送请求 2.1请求方法的别名 请求的URL地址怎么来的&#xff1f; 后端实现 前后端交互 1.引入Axios文件 <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 2.使用Axios发送请求 2.1请求方法的…...

第17章:Python TDD回顾与总结货币类开发

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

opencv_KDTree_搜索介绍及示例

cv::flann::KDTreeIndexParams 说明&#xff0c;使用&#xff1f; cv::flann::KDTreeIndexParams 是 OpenCV 中用于配置 KD 树&#xff08;K-Dimensional Tree&#xff09;索引参数的类。KD 树是一种用于多维空间中的点搜索的数据结构&#xff0c;常用于最近邻搜索等问题。在…...

Windows 上安装 MongoDB 的 zip 包

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注&#xff1a; RPA应用研究&#xff0c;主流厂商产…...

先进制造aps专题二十七 西门子opcenter aps架构分析

欧美的商业aps&#xff0c;主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面&#xff0c;西门子aps是不如sap apo的&#xff0c;但是西门子aps是西门子数字化工厂产品的核心&#xff0c;有很多特色&#xff0c;所以分析 西门子aps主要分计划器和排产器两个部分 计…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

机器学习——什么是代价函数?

1.代价函数的定义 首先,提到代价函数是估计值和实际值的差,这应该是指预测值和真实值之间的差异,用来衡量模型的好坏。 在一元线性模型中,模型是直线,有两个参数,可能是斜率和截距。 通过调整这两个参数,让代价函数最小,这应该是说我们要找到最佳的斜率和截距,使得预测…...

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例&#xff0c;复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…...

02内存结构篇(D1_自动内存管理)

目录 一、内存管理 1. C/C程序员 2. Java程序员 二、运行时数据区 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. Java堆 5. 方法区 运行时常量池 三、Hotspot运行时数据区 四、分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 一、内存管…...

Centos 8 交换空间管理

新增swap 要增加 Linux 系统的交换空间&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建一个交换文件 首先&#xff0c;选择文件路径和大小&#xff08;例如&#xff0c;增加 1 GB 交换空间&#xff09;。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…...

“深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手

TCP&#xff08;传输控制协议&#xff09;的三次握手和四次挥手是TCP连接建立和释放的过程。 一、TCP三次握手 TCP三次握手是为了建立可靠的连接&#xff0c;确保客户端和服务器之间的通信能力。具体过程如下&#xff1a; 第一次握手&#xff1a;客户端向服务器发送一个带有…...

基于扩展卡尔曼滤波算法EKF的锂电池SOC动态估算:考虑充放电倍率与环境温度的综合辨识

扩展卡尔曼滤波soc估算 基于EKF算法的锂电池SOC 卡尔曼滤波估计电池soc &#xff0c;simulink模型&#xff0c;对电池SOC参数进行辨识&#xff0c;充分考虑充放电倍率和环境温度&#xff0c;结合传统安时积分法和扩展卡尔曼滤波算法EKF对锂电池soc进行动态估算。锂电池的SOC&am…...

实战指南:构建高可用集群的核心步骤与关键技术

构建高可用集群的核心步骤 高可用&#xff08;High Availability, HA&#xff09;集群旨在通过冗余设计和故障转移机制&#xff0c;确保服务在硬件或软件故障时仍能持续运行。以下是搭建高可用集群的核心步骤&#xff1a; 1. 需求分析与架构设计 明确目标&#xff1a;定义可…...

YApi本地部署后,接口测试插件cross-request装不上?手把手教你解决Chrome扩展加载难题

YApi本地部署后cross-request插件安装难题的终极解决方案 当你终于完成YApi的本地部署&#xff0c;准备大展拳脚进行接口测试时&#xff0c;却发现cross-request插件怎么都装不上——这可能是最令人抓狂的时刻之一。别担心&#xff0c;这绝不是你一个人的问题。本文将深入剖析这…...

【AI原生研发协作黄金法则】:20年架构师亲授跨团队对齐的7大断点与3步闭环落地法

第一章&#xff1a;AI原生研发协作范式的本质跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统软件工程依赖人工编写、评审与测试的线性协作链&#xff0c;而AI原生研发将模型能力深度嵌入研发全生命周期——从需求理解、代码生成、单元测试到部署验证&#xff0c;均由…...

Oracle归档日志爆满急救指南

作为运维工程师&#xff0c;你一定遇到过这样的紧急情况&#xff1a;/oracle/app/archivelog 目录突然爆满&#xff0c;数据库挂起无法写入&#xff0c;业务全线中断。你慌忙执行了网上找到的 DELETE OBSOLETE 命令&#xff0c;却发现磁盘空间纹丝不动 —— 目录里还躺着好几年…...

# 012、AutoSAR CP基础软件(BSW)模块详解:复杂驱动(CDD)

一、从一次诡异的CAN信号丢失说起 上个月在量产项目上碰到个怪事:ECU休眠唤醒后,某个关键CAN信号偶尔会丢一帧。抓Trace、看DBC、查配置表,忙活两天没定位。最后发现是信号处理函数里有个状态机没在唤醒后复位,而这个函数恰恰放在了一个“自定义驱动模块”里——没错,就是…...

Anthropic Harness工程入门基础教程(非常详细),收藏这一篇就够了!

用 ChatGPT 和用 Claude Code&#xff0c;是两种完全不同的体感。 前者就是聊天&#xff0c;后者是在聊天的基础上给用户干活。 像 Claude Code 这样的 Coding Agent 打开终端&#xff0c;需求丢进去&#xff0c;它开始读文件、搜索代码、执行命令、跑测试、提 PR&#xff0c…...

基于 SpringBoot 的生活信息分享平台,从 0 到 1 完整实现(附源码 + 数据库)

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

别再下错包了!手把手教你获取ROS2 Humble可用的gazebo_grasp_plugin正确分支

ROS2 Humble版gazebo_grasp_plugin获取指南&#xff1a;避开新手三大陷阱 刚接触机械臂抓取仿真的开发者&#xff0c;往往在第一步获取资源时就栽了跟头。上周帮学弟调试机械臂项目时&#xff0c;发现他花了两天时间编译的gazebo_grasp_plugin始终报错——原因竟是下载了错误的…...

5分钟让Windows 11焕然一新:极速系统加速与性能优化终极指南

5分钟让Windows 11焕然一新&#xff1a;极速系统加速与性能优化终极指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …...