STM32Cube系ライブラリ移植への道
と
いうわけでSTマイクロの苦情隔離場でbugという文字が乱舞するいわくつきのSTM32Cube系
ライブラリへの移行を順次開始しました!
NUCLEO-F030板
NUCLEO-F401板
NUCLEO-F334板
おしまい。ぁー憑かれた…
すみません冗談です冗談!春先にも少し触れてすでにこれちょっと微妙だと判断を下した
STM32CubeF4をはじめとするCube系ライブラリは今までの"標準ペリフェラルライブラリ"
とは互換性が全くなく、バグも多数報告されていたのでねむいさんも移植に難色を示して
いました。が、最近発売されたNucleo系のボードに搭載された新しいMCUはもはや過去の
ライブラリには未対応となっており、事態を重く見たねむいさんもようやく重い腰を上げた
わけでございます。早く座らせてくれ。
(※以下、縮めて"HALライブラリ"と呼称します)
実はここ数か月でHALライブラリへの移行準備自体は着々と進めていて、その第一歩と
して手持ちのNucleo板のプロジェクトのライブラリを一気に移行していました。
現在手持ちは写真のとおり(って見た目同じですが) F030,F401,そしてF334の3つです。
それらのプロジェクトはごくごく基本的な動作のみを網羅した小規模なプログラムに
とどめていたのでまだ難易度は低く、移植の感触をつかむのにはうってつけでした。
私の公開しているプロジェクトは全てこちらの手順に準拠しているので移行後も不自由
なく同じようにビルドできるものを目指しました。
移行にあたってねむいさん的ポリシーは以下の要素に。
1.プロジェクトのディレクトリ構造は従来の物から大きく崩さない
まぁ鉄則ですね。ケアレスミス防止目的でもあります。
互換性を重視しすぎて不便になるのも本末転倒なので変えるべきところは変えます。
2.HALライブラリに依存する箇所をなるべく作らない
これも鉄則ですね〜。またライブラリ大変更されたら目にも当てられないですし。
抽象化のためにサイズが激増する冗長なコードがやたらと多いので分解・簡略化して
別途作ったほうがいいです。一方でHALライブラリ使った方が分かりやすい周辺機器
の初期化の箇所は割り切って利用していきます。
ぇ?それじゃHALライブラリ使ってる意味無いだろですって!?
無いですよ。
3.STM32CubeMXで生成されたひな形は利用しない
STM32CubeMXは各開発環境ごとにHCLK/PCLKの初期化コードを含むひな形を自動
作成するJAVAで作成されたプログラムを指します。ねむいさんの環境はGCCのコマンド
ラインビルドに属する極めて原始的なものなのでひな形をそのまま利用できません。
CubeFxのアーカイブにサンプルコードが収録されてるのでCubeMX使わずともそれ見たら
殆ど事が足ります。おまけに生成されたコードが現状バグだらけでまったく信用出来ない
ので100000000000000000000歩譲ってHCLKやI2C/I2Sクロック周波数の初期設定に
軽く参考にする程度です。
4.メモリリソースはなるべくていうか絶対に許さ浪費しない!
HALライブラリでは抽象化を上げるためインスタンスという概念が追加されています。
それに付随する構造体が馬鹿でかいサイズなのでF0系ではSRAM領域を圧迫されすごく
苦しくなります…なるべくグローバル変数で確保はしないように心がけましょう。
上記の点を念頭に入れて再構成したプロジェクトと従来のプロジェクトでビルドした
バイナリファイルのサイズの比較してみました。比較対象基板はF030板のです。
*STM32 StdPeriphDriver(STM32F030R8T6_NUCLEO_20140326.7z)
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 7216 0 7216 1c30 main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
7096 120 328 7544 1d78 main.elf
*STM32 HAL Driver(STM32F030R8T6_NUCLEO_20140702.7z)
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 7916 0 7916 1eec main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
7796 120 412 8328 2088 main.elf
orz
フラッシュもSRAMも使用領域ががっつり増えてやがるorz
HAL Driverのスタートアップは"__libc_init_array"のリンクがあるのでC++の対応を
すててこれを取っ払ってみました
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 7828 0 7828 1e94 main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
7708 120 412 8240 2030 main.elf
焼け石に水orz
SRAMを減らさなければ…
HALのSysTick関数"HAL_GetTick"は_weakで切られていてオミットできるのでやってみた
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 7820 0 7820 1e8c main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
7700 120 408 8228 2024 main.elf
フラッシュメモリで8バイト、SRAMは4バイト減りましたが焼け石に(ry
bss領域がインスタンスの確保で100byteも増えやがるのはF0系でかなり痛いんですよね〜。
こいつを追い出してみました。
Built Object Informations:
=== Total Binary Size ===
text data bss dec hex filename
0 7776 0 7776 1e60 main.hex
=== Verbose ELF Size ===
text data bss dec hex filename
7656 120 300 8076 1f8c main.elf
雄々ッッ!!BSS領域が元より減りましたよ♥
もぅいいわこれで…もちろんスリムになってもちゃんと動作してます♥
※最初に取り除いた"__libc_init_array"はC++な人のためにリンクを復活させてリリースしてます。
今回の検証に当ってHALライブラリを使用したexampleの中で構造体の一部の要素が
未設定により起こる不具合がみつかりましたがまぁライブラリ自身の不具合じゃない
のでスルーで…(ねむいさんのプロジェクトでは明示的に初期化してます!)
そして話が冒頭の文章に戻るわけです。
ひとまずNUCLEO系板はすべて移行して最適化完了ですが残るDiscovery系の板のは
どうしようか考え中です。特にSTM32F4のいつものは多数のペリフェラルを使用して
いるので移植は本当に腰据えて一気に攻め上げないとバグを生んでしまいますからね…
しかしいずれは通らなければならない道だと思います。FATFSのSDIOとDMAの処理の
移植が峠になりそうです。
連絡・質問・免責は↑のリンクを
↓SNSもやってます↓
- ARM/STM32 (97)
- OpenOCD (25)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- AVR (6)
- FPGA (4)
- GPS/GNSS (18)
- MISC (62)
- Wirelessなアレ (16)
- ブラウザベンチマーク (28)
- 日本の自然歩道 (18)
- Windows10対応軽量シンプルな環境でARMマイコンをInsightとOpenOCDを使ってデバッグする(2020年度版)
⇒ ねむい (06/15) - いろいろ試す39(with2019年反省会)
⇒ ねむい (01/03) - いろいろ試す39(with2019年反省会)
⇒ ひかわ (01/02) - いろいろ試す39(with2019年反省会)
⇒ ひかわ (01/01) - OpenOCD小ネタ24 -ビルドするときの小ネタとかも-
⇒ あぷろ (12/27) - OpenOCD小ネタ24 -ビルドするときの小ネタとかも-
⇒ ねむい (12/20) - OpenOCD小ネタ24 -ビルドするときの小ネタとかも-
⇒ あぷろ (12/13) - OpenOCD小ネタ24 -ビルドするときの小ネタとかも-
⇒ ねむい (12/11) - OpenOCD小ネタ24 -ビルドするときの小ネタとかも-
⇒ あぷろ (12/11) - STM32H7を使ってみる4 -キャッシュ・ワンダリング(中篇)-
⇒ ねむい (11/27)
- Windows10対応軽量シンプルな環境でARMマイコンをInsightとOpenOCDを使ってデバッグする(2020年度版)

- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (7)
- May 2009 (14)
- January 1970 (1)

