5-3. svd2rust
SVD (System View Description) ファイルからRustのstructを自動生成するツールです。SVDファイルはXMLファイルで、特にペリフェラルのメモリマップドレジスタの記述を形式化したものです。
svd2rustは、Cortex-M, MSP430, RISCVのマイクロコントローラに対応しています。svd2rustで自動生成されたクレートは、PAC (Peripheral Access Crate) と呼ばれています。主要なPACは、Peripheral Access Cratesにまとめられています。
ちょっとしたプログラムを書く場合、svd2rustから生成されたPACは間違いを犯しにくいです。svd2rustで生成されたレジスタアクセス関数では、数値ではなくクロージャを引数に取ります。例えば、GPIOピン (8番ピン) を出力設定にして、highレベルを出力するコードは、次のようになります。
// ピンを出力に設定します
gpioe.moder.modify(|_, w| {
w.moder8().output();
});
// LEDを点灯します
gpioe.odr.write(|w| {
w.odr8().set_bit();
});
クロージャを引数に取る利点は、modify()メソッドの利用時にあります。modify()メソッドは、メモリマップドレジスタのリード・モディファイ・ライトを行うAPIです。操作対象のレジスタがクロージャ内でしか操作できないため、別レジスタを誤って操作するような事故が発生しません。
単純なレジスタ読み書きより複雑なコードに見えますが、コンパイラの最適化により、リリースビルドされたバイナリは、通常のレジスタアクセスと同等の機械語になります。
Discoveryでは、svd2rustで生成したPACを利用して、LEDを点灯したり、シリアル通信します。
後述するRTFM for ARM Cortex-Mでも、svd2rustで生成したPACを利用します。