Совместимость
Типы-обёртки предоставляют метод деструктора (C-FREE)
Любой не-Copy тип-обёртка, предоставляемый HAL, должен предоставлять метод free, который поглощает обёртку и возвращает сырую периферию (и, возможно, другие объекты), из которых она была создана.
Метод должен при необходимости выключать и сбрасывать периферию. Вызов new с сырой периферией, возвращённой free, не должен завершаться с ошибкой из-за неожиданного состояния периферии.
Если типу HAL требуется создать другие не-Copy объекты (например, выводы ввода-вывода), все такие объекты также должны освобождаться и возвращаться через free. В этом случае free должен возвращать кортеж.
Например:
#![allow(unused)]
fn main() {
pub struct TIMER0;
pub struct Timer(TIMER0);
impl Timer {
pub fn new(periph: TIMER0) -> Self {
Self(periph)
}
pub fn free(self) -> TIMER0 {
self.0
}
}
}
HAL реэкспортируют свой крейт доступа к регистрам (C-REEXPORT-PAC)
HAL можно писать поверх PAC, сгенерированных svd2rust, или поверх других крейтов, которые предоставляют прямой доступ к регистрам. HAL всегда должны реэкспортировать в корне своего крейта крейт доступа к регистрам, на котором они основаны.
PAC следует реэкспортировать под именем pac независимо от фактического имени крейта, так как название HAL уже должно ясно показывать, к какому PAC выполняется доступ.
Типы реализуют трейты embedded-hal (C-HAL-TRAITS)
Типы, предоставляемые HAL, должны реализовывать все применимые трейты, которые предоставляет крейт embedded-hal.
Для одного типа может быть реализовано несколько трейтов.