前回記事の続きで、いよいよ、、、
TOPPERS/ASPカーネルをSTM32CubeIDEでビルド・デバッグ可能とします!
基板立ち上げ時はもちろん、それ以外のトラブル時にも、IDEはとても有用です(言うまでもありませんが)。
要は、既存プロジェクトをどうやって取り込むか?という話でして、IDE毎にやり方・癖がありますが、STM32CubeIDEは思ったより楽でした。
(本編の)本編
1. 準備
1-1. 環境
基本は前回記事を踏襲ですが、それら以外。
-
STM32CubeIDE 1.0.2
https://www.st.com/ja/development-tools/stm32cubeide.html
なおデフォルトでは、GCC ARM ToolchainはIDEと同時にインストールされる、以下ディレクトリ配下のものを使うこととなります。
(先に書いてしまうと、これがトラブルの元でした・・・)/opt/st/stm32cubeide_1.0.2/plugins/
1-2. ASP取り込み
1-2-1. 空のプロジェクト生成
STM32CubeIDEから「STM32 project」を作成します。
- 「Project Name」は適当に(ここでは「ImportAsp」としました)
- 「Targeted Binary Type」は「Static Library」
- 「Targeted Project Type」は「Empty」
1-2-2. ASP取り込み
前回記事のASPカーネル(動作確認済みのものを推奨)を取り込みます。
作成済みのプロジェクトの上で右クリック - 「Import...」を選択。
「General」 - 「File System」を選び、「Next >」押下。
- 「From directory」で作成済みのaspディレクトリを選択
- すべてのディレクトリ・ファイルにチェック
- 「Create top-level folder」にもチェックを入れる
とし、最後に「Finish」ボタンを押下すると、、、
以下の通り、見事に取り込まれました!
1-2-3. 余計なディレクトリを削除
必須ではありませんが、使わないであろう「Src」「Inc」は右クリックメニューから削除しておきましょう。
(画像はありません、すみません)
2. ビルド
ビルドするには多少の細工が必要です。
2-1. ビルドロケーションの変更
プロジェクトの上で右クリック - 「Properties」を開き、「C/C++ Build」メニューを選択します。
- 「Makefile generation」の「Generate Makefiles automatically」のチェックを外す
- 「Build location」の「Build directory」のお尻を「Debug」から「asp/OBJ」に変更
した後、「Apply and Close」を押下。
2-2. いざ、ビルド
後は、右クリックメニューから「Clean Project」「Build Project」を実行するだけです。
無事通っていますね!
3. デバッグ
先に書いちゃうと、
これだけではまともに動かない
のですが、解決までの軌跡もある程度残しておきたいので。笑
3-1. 設定~いったん動かす
おなじみ右クリック - 「Debug As」 - 「STM32 MCU C/C++ Application」を選択。
「asp」が選択されたままの状態で「OK」押下。
以下は、「Disabled auto build」としておいたほうが幸せになれそう。で「OK」押下。
以降は(ダイアログが出たりしますが、適当にあしらって)ブレークポイントも張ってない手前、勝手にプログラムが動き出しますが、、、
起動ログも出ないしコンソールも反応しない
です。こいつを解決せねばなりません!
3-2. 動かない件、デバッグ
3-2-1. 原因
ビルドロケーションである「OBJ」ディレクトリ配下にある、「asp.syms」を確認してみます。
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/OBJ$ head -5 asp.sym
s
00000000 A hardware_init_hook
00000000 A software_init_hook
00000000 A software_term_hook
08000000 T __text
08000000 T _kernel_vector_table
このうち「hardware_init_hook」が曲者で、
関数実体があるのに0番地の絶対シンボル扱い
となってしまっています。
デバッグしてみると、実際には「hardware_init_hook」は1番地のようで、
- スタートアップにて、「hardware_init_hook」が0じゃないから、そこ(1番地)にジャンプ
- 行方知れず
となっている模様。
ずばり、GCC ARM Toolchainが新しいと、このような事象となるようです。
3-2-2. 対策
- シンボル定義を何とかする
- GCC ARM Toolchainをコマンドラインビルドと一緒にする(古いものを使う)
のいずれかとなりますが、ここでは前者を採用、後者は非推奨とします。
(一長一短と思いますが、以降の記事で新しいツールチェインを使う必要があったため)
3-2-2-1. シンボル定義を何とかする
元ファイルをバックアップしてから、シンボル定義を削除してやります。
(grep
を使いました)
(以下ディレクトリに移動し)
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$ grep hardware_init_hook stm32l4xx_rom.ld
PROVIDE(hardware_init_hook = 0);
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$ cp -p stm32l4xx_rom.ld stm32l4xx_rom.ld.org
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$ grep -v hardware_init_hook stm32l4xx_rom.ld.org > stm32l4xx_rom.ld
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$ diff stm32l4xx_rom.ld stm32l4xx_rom.ld.org
9a10
> PROVIDE(hardware_init_hook = 0);
ただし、これだとcfg1_outのビルドが通らなくなります(「hardware_init_hook」がない!と怒られる)ので、Makefileに手を入れてやります。
以下のdiffを参考にしてください。cfg1_outのビルド時は旧ldファイルを使用しています。
user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/OBJ$ diff Makefile.org Makefile
278c278
< CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-T,$(LDSCRIPT)
---
> CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-T,$(LDSCRIPT).org
3-2-2-2. 【非推奨】ツールチェインを変更
ずばり、環境変数PATHから余計なものを消すだけです。
右クリック - 「Properties」 - 「C/C++ Build」 - 「Environment」を開きます。
その後「PATH」を選択し、「Edit」ボタンを押下すると、編集画面となります。
(画像は省略)
先頭の以下2つを、完全に削除すればOKです。
(こちらも省略)
3-3. 最終確認
リビルド・デバッグ実行し、前回記事同様、正常動作を確認してください(雑)。
おわりに
IDEでビルド・デバッグできれば、もう怖いものなどありません!笑
しかし、このままですとHALが使えないので、例えばLEDを点滅させたいぜーって場合に
ドライバからゴリゴリ書かねばならず、超絶面倒くさい
です。
ということで、次回以降で、HALとの同居を紹介したいと思います(まだ手をつけていませんが)。
2019/9/19追記
HALとの同居を検討中ですが、ASPカーネルとHALで同名のヘッダがあり苦戦中。
(名前を変更してコードをゴリゴリ書き換えればいいのですが、スマートでない)
何とか解決しました。
参考
(特になし)