#rtic #embedded-hal #i2c #spi #shared-bus

已弃用 无 std shared-bus-rtic

为 RTIC 应用程序中共享外设通信总线提供实用工具

7 个版本

0.2.3+已弃用2024 年 7 月 3 日
0.2.2 2020 年 7 月 21 日
0.1.2 2020 年 7 月 5 日

#15 in #rtic

Download history 1/week @ 2024-05-21 8/week @ 2024-05-28 13/week @ 2024-06-11 2/week @ 2024-06-25 113/week @ 2024-07-02 11/week @ 2024-07-09

342 每月下载量

MIT 许可证

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