7 个版本
0.2.3+已弃用 | 2024 年 7 月 3 日 |
---|---|
0.2.2 | 2020 年 7 月 21 日 |
0.1.2 | 2020 年 7 月 5 日 |
#15 in #rtic
342 每月下载量
13KB
132 代码行
shared-bus-rtic
为在 RTIC 应用程序中使用共享外设总线提供宏和类型定义
⚠️ 弃用通知 ⚠️
随着 embedded-hal
v1.0 的发布,此包不再必要。相反,用户应迁移到使用 embedded-hal
v1.0 特性以及 embedded-hal-bus
。
描述
请注意,使用相同底层总线的所有驱动程序 必须 存储在单个资源(例如,作为 RTIC 资源中的一个更大的 struct
)中。这确保 RTIC 将防止一个驱动程序在另一个驱动程序使用相同底层总线时中断它。该包提供了一种检测机制,如果在不适当的锁定的情况下在多个任务优先级中使用共享总线,则会引发 panic。
功能
此包与 thumbv6 架构兼容。要启用对 thumbv6 设备的支持,请在您的 Cargo.toml
中启用 thumbv6
功能
[dependencies.shared-bus-rtic]
features = ["thumbv6"]
用法示例
use shared_bus_rtic::SharedBus;
struct SharedBusResources<T> {
device: Device<SharedBus<T>>,
other_device: OtherDevice<SharedBus<T>>,
}
// ...
// Replace this type with the type of your bus (e.g. hal::i2c::I2c<...>).
type BusType = ();
struct Resources {
shared_bus_resources: SharedBusResources<BusType>,
}
#[init]
fn init(c: init::Context) -> init::LateResources {
let manager = shared_bus_rtic::new!(bus, BusType);
let device = Device::new(manager.acquire());
let other_device = OtherDevice::new(manager.acquire());
init::LateResources {
shared_bus_resources: SharedBusResources { device, other_device },
}
}
有效示例
struct SharedBusResources<Bus> {
device_on_shared_bus: Device<Bus>,
other_device_on_shared_bus: OtherDevice<Bus>,
}
// ...
struct Resources {
shared_bus_resources: SharedBusResources<Bus>,
}
#[task(resources=[shared_bus_resources], priority=5)
pub fn high_priority_task(c: high_priority_task::Context) {
// Good - This task cannot interrupt the lower priority task that is using the bus because of a
// resource lock.
c.resources.shared_bus_resources.device_on_shared_bus.read();
}
#[task(resources=[shared_bus_resources], priority=0)
pub fn low_priority_task(c: low_priority_task::Context) {
// Good - RTIC properly locks the entire shared bus from concurrent access.
c.resources.shared_bus_resources.lock(|bus| bus.other_device_on_shared_bus.read());
}
在上面的示例中,可以看到总线上的两个设备都存储为单个资源(在共享的 struct
中)。正因为如此,当高优先级或低优先级任务使用总线时,RTIC 正确锁定资源。
无效示例
以下示例无效,不应重复。当资源被中断时,该包将引发 panic。
struct Resources {
// INVALID - DO NOT DO THIS.
device_on_shared_bus: Device<Bus>,
other_device_on_shared_bus: OtherDevice<Bus>,
}
#[task(resources=[device_on_shared_bus], priority=5)
pub fn high_priority_task(c: high_priority_task::Context) {
// ERROR: This task might interrupt the read on the other device!
// If it does interrupt the low priority task, the shared bus manager will panic.
c.resources.device_on_shared_bus.read();
}
#[task(resources=[other_device_on_shared_bus], priority=0)
pub fn low_priority_task(c: low_priority_task::Context) {
// Attempt to read data from the device.
c.resources.other_device_on_shared_bus.read();
}
在上面的错误示例中,RTIC 可能会中断低优先级任务以完成高优先级任务。然而,低优先级任务可能正在使用共享总线。在这种情况下,通信可能会因多个设备同时使用总线而损坏。为了检测这种情况,shared-bus-rtic
会检测任何总线争用,如果总线已被使用,则会引发 panic。
依赖项
~240KB