5 个版本 (破坏性更新)

0.5.0 2024 年 8 月 10 日
0.4.0 2024 年 6 月 24 日
0.3.0 2024 年 1 月 26 日
0.2.0 2023 年 11 月 30 日
0.1.0 2023 年 10 月 29 日

#158并发

Download history 122/week @ 2024-06-24 31/week @ 2024-07-01 95/week @ 2024-08-05 25/week @ 2024-08-12

每月 120 次下载

MIT/Apache

33KB
560

简单的周期时间片调度器

项目主页

Git 仓库

Github 仓库

一个简单的多核调度器,为应用程序提供特质。如果为特定对象实现了此特质,则可以用于从调度器获取周期性调用。应用程序特质对象必须注册到调度器以获取周期性调用。

调度器特质的任务方法实现是可选的,如果某个特定应用程序对象不需要一个或多个方法。

限制

为了保持简单,调度器有一些限制

  • 所有任务周期必须是最小任务周期的倍数。
  • 所有任务使用相同的操作系统优先级运行。因此,任务不会互相中断。
  • 任务的执行顺序是未定义的。
  • 可以注册到调度器的应用程序对象数量是编译时常量。

支持的平台

  • esp-idf-hal:带有 IDF 的 ESP32。

Cargo.toml

[dependencies]
timeslice = { version = "0.4", features = [ "hal-espidf", "meas" ] }

示例代码

一个简单的使用示例可能如下所示

// Here we define the scheduler, its tasks and behavior.
timeslice::define_timeslice_sched! {
    name: sched_main,
    num_objs: 1,
    tasks: {
        { name: task_10ms, period: 10 ms, cpu: 0, stack: 16 kiB },
        { name: task_50ms, period: 50 ms, cpu: 0, stack: 3 kiB },
        { name: task_100ms, period: 100 ms, cpu: 1, stack: 16 kiB },
    }
}

// This structure belongs to your application. It contains application state.
struct MyThing {
    // ...
}

impl MyThing {
    fn new() -> Self {
        Self {
            // ...
        }
    }
}

// Implement the scheduler's tasks for your application.
impl sched_main::Ops for Box<MyThing> {
    fn task_10ms(&self) {
        // Called every 10 ms.
        // ... Put your code here ...
    }

    fn task_50ms(&self) {
        // Called every 50 ms.
        // ... Put your code here ...
    }

    fn task_100ms(&self) {
        // Called every 100 ms.
        // ... Put your code here ...
    }
}

fn main() {
    // Initialize the application.
    use std::sync::Arc;
    let thing = Arc::new(Box::new(MyThing::new()));

    // Initialize the scheduler and register your application.
    let obj = Arc::clone(&thing);
    sched_main::init([obj]);

    // ...
}

请参阅文档以获取更复杂的示例。

后端选择

必须通过 feature 标志选择一个后端。以下后端可用

  • hal-espidf:使用 esp-idf-halesp-idf-svc hal 后端。如果您使用 ESP 微控制器,请选择此选项。
  • hal-dummy:仅用于测试的后端。它什么也不做。您永远不会选择它。

只能选择一个 hal 后端 feature 标志。

esp-idf-hal 和 esp-idf-svc 版本

hal-espidf 后端依赖于以下 crate

esp-idf-hal = "0.44"
esp-idf-svc = "0.49"

功能

  • meas:如果启用了 meas 功能,则将启用运行时测量功能。如果没有提供此功能标志,则运行时测量功能将为空占位符。

内部

ESP-IDF 实现细节

hal-espidf 上,每个任务都作为 std::thread 运行,并将其固定到指定的 CPU 核心。线程等待来自周期性 ESP 定时器的触发信号。在触发时,如果时间片到期,则执行特质方法。

内存安全

此 crate 不使用 unsafe 代码。

许可证

版权所有 2023-2024 Michael Büsch [email protected]

许可协议:Apache License version 2.0 或 MIT 许可协议,由您选择。

SPDX-License-Identifier: Apache-2.0 OR MIT

依赖项

~0–6.5MB
~36K SLoC