最近、WMMC の後輩から「レジスタ手打ちを考えているのですが、何かメリットは有るのですか?」という質問を受けます。この場でお答えしておきましょう。ありません。
いや、無くはないのですが、僕のような性格に癖がある人やちょっと複雑になると全てがわからなくなる人には有効だと思います。まぁ一応メリットを列挙しておきましょう。
- ビルド時間短縮(初回のみ)
- マイコンの気持ちになれる(超重要)
- プロジェクトのサイズが小さくて済む
- 気持ちいい
現に僕は何らかのライブラリを使うときは、まずソースコードを読みます。じゃないと中で何やってるかわかりませんからね。マイコンに関してはブラックボックス化は悪だと考えているわけです(自分でブラックボックス化するのは良いことだと思う)。
基本的に、初心者はとりあえずライブラリを使ってしまって、何か変態的な才能に目覚めたら レジスタ手打ち -> アセンブる -> バイナリ手書き -> 書き込みプログラム自作 をすれば良いんじゃないですかね。そのための資料はいくらでも転がっています。分かりづらいものが多いですが。
ということで、この一環として、STM32 向けに公開されている最新の公式ライブラリの内の1つである、HAL から関数を全削除するシェル芸を公開します。なお、このシェル芸を実行しても、便利なレジスタマクロやレジスタ用ビットマクロは削除されません。用意するのは以下のみ。
- シェル
- sed(GNU 版でやりました)
Windows の方は簡単には出来ないので、WSL かなんかをいい感じに駆使してください。
というわけで
コマンドの公開です。HAL には レジスタマクロ、レジスタビット用のマクロ、関数が用意されていますが、そのうち関数を全削除します。
まずは生成したプロジェクト内で HAL が入っているディレクトリを探してください。その中で src
という .c
ファイル本体が入っているディレクトリがありますね。それはまんま関数が入っているので、ディレクトリごと削除してください。更に、1階層上には .chm
とかいうヘルプファイルも入っていて、正直使わないしプロジェクトサイズが大きくなってしまうだけなので、これも削除です。
さて、inc
に入って以下のコマンドたちを実行して、HAL にとどめです。
$ find . -type f | xargs -n1 sed -i '/^[^#]*HAL.*);/d' # HAL_で始まる関数プロトタイプ宣言を削除
$ find . -type f | xargs -n1 sed -i '/^[^#]*LL_.*);/d' # LL_で始まる関数プロトタイプ宣言を削除
$ find . -type f | xargs -n1 sed -i '/^__STATIC.*/,/^}/d' # ヘッダ上に定義されるインライン関数を削除
ですが、(タイトル詐欺ですが)これでもまだ削除しきれていないので、hcd、spi、tim の複数行に渡る関数プロトタイプ宣言を削除します。これで完了です。