HALを使うべきか使わざるべきか

HALとは Hardware Abstraction Layer  すなわちハードウェアを抽象化して、様々なハードウェアに同じプログラムでアクセスできるようにする仕組みのことです。

PCでおなじみのBIOSもHALの一種に入ります。

STMicroのSTM32CubeMXが生成するライブラリはHALライブラリと呼ばれていて、MPLAB-Xが生成するコードも似たようなもので、HALライブラリを使うとデータシートを見ながら周辺機能レジスタの値を設定する面倒な作業から解放されます。

HALを使わずにPWM出力をおこなう

PWMについて調べていて、HALを使わないでPWM出力をおこなうプログラムについて書いてある上の記事を見つけました。記事の主題は次のようなものです。

「HALを使わないでPWM設定プログラムを書いてみた。 基本的なペリフェラルならレジスタ手打ちで行くのが一流STM32erの流儀らしい(英文サイト参照)。でも、やはりSTM32CubeMXは便利。」

ここで紹介されている About STM32 HAL quality and performance – Stack Overflowを見るとHALに対して「わかりにくい、バグがある、オーバヘッドがある。」というコメントがありました。

STM32CubeMXが発表されて既に3年以上経ちます。当初は「わかりにくいし、バグだらけで使いにくい。」という意見を多く見かけましたが、最近になって安定してきたせいか、前向きの評価が増えてきたようです。

STMicroはSTM32CubeMXを発表する前に Standard Peripheral Library という名前のHALライブラリを提供していました。

Standard Peripheral Library も良く出来たライブラリでUSBやLANを使うためには欠かせず、使い込んだライブラリでしたが、新し物好きの私はSTM32CubeMXが出てすぐにHALライブラリに乗り換えました。

STM32CubeMX+HALライブラリの効果

私が組み込み用として使うのはstm32シリーズに決めていますが、アプリケーションによって最適なCPUが異なるのと、次々と高性能なstm32が発表されることからプロジェクトごとに新しいCPUボードを設計しています。

新規CPUボードのソフトウェア開発で一番時間がかかるのは、周辺機能の動作を一通り確認出来るまでの段階でしたが、STM32CubeMX+HALライブラリのおかげで、この段階は劇的に効率化されました。

確かにHALライブラリには「わかりにくい、バグがある、オーバヘッドが大きい。」というデメリットもありますが、開発の効率化とプログラムの標準化という大きなメリットに比べれば些細な問題に過ぎません。

HALライブラリはわかりにくい?

レジスタに値を設定する単純なプログラムに比べると、HALライブラリはとっつきにくいのは確かです。
ただ、初期化プログラムの開発で発生するトラブルは、データシートからは読み取りにくいレジスタ設定の抜けや設定の順番に起因するもので、USBやLANなどの複雑な処理では、解決までに試行錯誤で数週間を費やすことも珍しくはありませんでした。
HALライブラリを使うと、その無駄な試行錯誤をしなくて済むという効果が大きいのです。
つまり、プログラム表記としては複雑でわかりにくく見えますが、プログラム開発で行き詰まってしまうわかりにくさは大幅に減ったといえます。

HALライブラリのバグ

実際のところHALライブラリのバグで悩まされた経験は殆どありません。
HALライブラリは多くの人が使っていて、不審な動作に出会ったときは検索するとたいてい誰かが情報を発信しているので回避策を素早く見つけることが出来るためです。
コンパイラやライブラリのバグを見つけて鬼の首を取ったように非難している人がたまにいますが、よほど枯れたシステムでない限りバグフリーのコンパイラやライブラリはあり得ないので、バグを上手く回避して使うのがコツです。

気にならないHALライブラリのオーバヘッド

民生分野でなく、開発効率化優先で豊富なハードウェアリソースを使うようにしている私の経験からはHALライブラリのオーバヘッドが気になったことはありません。
最近のCPUはワンチップの中にLinuxを組み込めるのではないかと思うほどFlashもRAMサイズも大きくなっていて、もともとコードサイズの小さい制御プログラムを書く上では、コードサイズの肥大は無視できるレベルです。

必要以上にCPUの性能が高くなっているのに加えてDMAなど周辺ハードウェアだけでこなせる処理が増えているため、HALライブラリのオーバヘッドによる処理速度の低下に悩まされることも無くなりました。

初期化時に実行するだけのHALライブラリがほとんどで、繰り返し実行する部分は単純なレジスタ処理だけで済むこともあります。

HALライブラリを使わないプログラムは勉強になる

プログラムのベテランなら積極的にHALライブラリを使うべきだと思いますが、HALライブラリの中で行われていることを全く理解していないと、問題にぶち当たったときに全く前に進めない場合があります。

HALライブラリのレジスタに値を設定している部分を参考にして、レジスタに直接値を設定してみて、HALライブラリの処理を理解するのは解りやすく制御プログラミングのトレーニングとしても大いに役にたちます。