#外设 #结构体 # #资源 #嵌入式 #定义 #位置

embedded-resources

在单一位置定义外设使用,以便在所有地方使用

4 个版本

0.1.5 2024年5月11日
0.1.4 2024年5月11日
0.1.2 2024年2月19日

1089硬件支持

Download history 295/week @ 2024-05-08 17/week @ 2024-05-15 12/week @ 2024-05-22 11/week @ 2024-07-03

364 每月下载量

自定义许可

16KB
120

embedded-resources

此包最初是 Adam Greig 向 assign-resources 提交的 PR

此包包含一个宏,用于帮助将结构体(如嵌入式 PAC 和 HAL 提供的 Peripherals 结构体)的资源分配和拆分到许多更小的结构体中,这些结构体可以传递给其他任务或函数。

以下示例可以更好地说明。在此,我们定义了新的结构体 UsbResourcesLedResources,每个结构体都包含一些 I/O 引脚和一个外设,并生成新的宏 usb_resources!led_resources!。这些宏将根据 Peripherals 实例构造相应的类型。然后我们可以将这些新的结构体移动到我们的任务中。

可以生成资源类型别名,因此函数签名也可以引用该类型,并且任何更改都会传播。

use embassy_stm32::peripherals::*;
use embedded_resources::resource_group;

#[resource_group]
struct UsbResources {
    dp: PA12,
    dm: PA11,
    usb: USB,
}

#[resource_group]
struct LedResources {
    r: PA2,
    g: PA3,
    b: PA4,
    #[alias = PWMTimer] // make an alias for this resource
    tim2: TIM2,
}

#[embassy_executor::task]
async fn usb_task(r: UsbResources) {
    // use r.dp, r.dm, r.usb
}

async fn setup_leds<'a>(r: LedResources) -> SimplePWM<'a, PWMTimer> {
    // setup three channel PWM (one for each color)       ^ alias used here
}

#[embassy_executor::task]
async fn led_task(rgb_pwm: SimplePWM<'a, PWMTimer>) {
    // use rgb_pwm                       ^ alias used here
}

#[embassy_executor::main]
async fn main(spawner: embassy_executor::Spawner) {
    let p = embassy_stm32::init(Default::default());

    let rgb_pwm = setup_leds(led_resources!(p));

    spawner.spawn(usb_task(usb_resources!(p))).unwrap();
    spawner.spawn(led_task(rgb_pwm)).unwrap();

    // can still use p.PA0, p.PA1, etc
}

这有几个优点:你只需要在一个地方编写特定的引脚名称,如 PA12,之后可以按名称引用它们,对于每个任务只有一个参数,而不是可能有很多,并且不需要编写大量代码来拆分资源。如果你针对多个不同的硬件版本,可以使用 #[cfg] 在一个地方更改引脚分配。

依赖关系

~0.4–0.9MB
~19K SLoC