マイコンユーザーのさまざまな疑問に対し、マイコンメーカーのエンジニアがお答えしていく本連載。今回は、初級者の方からよく質問される「HAL(ハードウェア抽象化レイヤー)って何?」についてです。
素朴な疑問から技術トラブルなどマイコンユーザーのあらゆる悩みに対し、マイコンメーカーのエンジニアが回答していく連載「Q&Aで学ぶマイコン講座」。
今回は、初心者から多く寄せられる質問です。
マイコンのサンプルプログラムを見ると、周辺機能の初期設定の部分で、直接レジスタに値を書き込まずに間接的な記述で設定している場合がありますが、これは何のために行っているのでしょうか?
なぜ、レジスタに直接設定値を入れずに、間接的な記述で設定を行うのでしょうか? 遠回りをしているように思えますが、何かメリットがあるのでしょうか?
これは、マイコンのプログラムを階層化する際に、上位層のプログラムから周辺機能などのハードウェアを抽象化する(隠す)手法で、HAL(Hardware Abstraction Layer:ハードウェア抽象化レイヤー)と呼ばれています。
HALは、プログラムの移植性を高めるために使用されます。プログラムを移植する際に、周辺機能などのハードウェアが異なる場合でも、HALより上位層のプログラムに変更を加えることなく移植することができます。
STマイクロエレクトロニクス(以下、ST)の汎用32ビットマイコン「STM32ファミリー*1)」や汎用8ビットマイコン「STM8ファミリー*2)」のサンプルプログラムなどのファームウェアライブラリでは、HALを採用しています。本記事では、STM32マイコンのHALの記述を例にして解説します。
図1に、STM32シリーズの汎用IOのポートAの5ビット目(以下、PA5)を反転させるプログラムを示します。図内上の記述は、PA5のデータを示すレジスタ「GPIOA_ODR」の5ビット目と「1」の排他的論理和を直接取る記述です。記述中にハードウェアであるレジスタが見えます。これを図内下のようにHALで記述すると、PA5と反転する動作(トグル:Toggle)だけになり、レジスタが見えなくなります。すなわち、ハードウェアが抽象化されたことになります。
レジスタに直接値を入れる方式だと、レジスタの名前からポートAを操作することは分かりますが、ビットは16進数のビット数を数えなければなりません。しかし、HALで記述するとポートAの5ビット目、すなわちPA5であることがすぐに読み取れます。記述から設定内容を簡単に理解できるのもHALの特長です。
*1)https://www.stmcu.jp/stm32family/
*2)https://www.stmcu.jp/stm8family/
Copyright © ITmedia, Inc. All Rights Reserved.