Интероперабельность
Типы-обертки предоставляют метод деструктора (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.
Один и тот же тип может реализовывать несколько трейтов.