4 个版本
0.1.5 | 2024年5月11日 |
---|---|
0.1.4 | 2024年5月11日 |
0.1.2 | 2024年2月19日 |
1089 在 硬件支持
364 每月下载量
16KB
120 行
embedded-resources
此包最初是 Adam Greig 向 assign-resources 提交的 PR。
此包包含一个宏,用于帮助将结构体(如嵌入式 PAC 和 HAL 提供的 Peripherals
结构体)的资源分配和拆分到许多更小的结构体中,这些结构体可以传递给其他任务或函数。
以下示例可以更好地说明。在此,我们定义了新的结构体 UsbResources
和 LedResources
,每个结构体都包含一些 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