STM32CubeIDEでTOPPERS/ASPカーネルを動かす - 本編


前回記事の続きで、いよいよ、、、
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 >」押下。

  1. 「From directory」で作成済みのaspディレクトリを選択
  2. すべてのディレクトリ・ファイルにチェック
  3. 「Create top-level folder」にもチェックを入れる

とし、最後に「Finish」ボタンを押下すると、、、

以下の通り、見事に取り込まれました!

1-2-3. 余計なディレクトリを削除

必須ではありませんが、使わないであろう「Src」「Inc」は右クリックメニューから削除しておきましょう。
(画像はありません、すみません)

2. ビルド

ビルドするには多少の細工が必要です。

2-1. ビルドロケーションの変更

プロジェクトの上で右クリック - 「Properties」を開き、「C/C++ Build」メニューを選択します。

  1. 「Makefile generation」の「Generate Makefiles automatically」のチェックを外す
  2. 「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番地のようで、

  1. スタートアップにて、「hardware_init_hook」が0じゃないから、そこ(1番地)にジャンプ
  2. 行方知れず

となっている模様。

ずばり、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で同名のヘッダがあり苦戦中。
(名前を変更してコードをゴリゴリ書き換えればいいのですが、スマートでない)
何とか解決しました。

参考

(特になし)