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 在 并发
每月 120 次下载
33KB
560 行
简单的周期时间片调度器
一个简单的多核调度器,为应用程序提供特质。如果为特定对象实现了此特质,则可以用于从调度器获取周期性调用。应用程序特质对象必须注册到调度器以获取周期性调用。
调度器特质的任务方法实现是可选的,如果某个特定应用程序对象不需要一个或多个方法。
限制
为了保持简单,调度器有一些限制
- 所有任务周期必须是最小任务周期的倍数。
- 所有任务使用相同的操作系统优先级运行。因此,任务不会互相中断。
- 任务的执行顺序是未定义的。
- 可以注册到调度器的应用程序对象数量是编译时常量。
支持的平台
- 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-hal
和esp-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