相互運用性
ラッパー型はデストラクタメソッドを提供する (C-FREE)
HAL が提供する non-Copy のラッパー型は、それを消費し、作成元となった生のペリフェラル(および場合によってはほかのオブジェクト)を返す free メソッドを提供するべきです。
このメソッドは、必要に応じてペリフェラルを停止してリセットするべきです。free が返した生のペリフェラルで new を呼び出しても、ペリフェラルの予期しない状態が原因で失敗してはなりません。
HAL 型の構築にほかの non-Copy オブジェクト(たとえば I/O ピン)が必要な場合、そのようなオブジェクトも 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 は、svd2rust が生成した PAC の上に書くことも、あるいは生のレジスタアクセスを提供するほかのクレートの上に書くこともできます。HAL は、それがベースとしているレジスタアクセスクレートを、常にクレートルートで再エクスポートするべきです。
PAC は、クレートの実際の名前にかかわらず、pac という名前で再エクスポートするべきです。というのも、HAL の名前によって、どの PAC にアクセスしているのかはすでに明確になっているはずだからです。
型は embedded-hal のトレイトを実装する (C-HAL-TRAITS)
HAL が提供する型は、embedded-hal クレートが提供する適用可能なすべてのトレイトを実装するべきです。
同じ型に対して複数のトレイトが実装される場合があります。