Edited at

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」は適当に

  • 「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」のお尻に「/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. ツールチェインを変更

ずばり、環境変数PATHから余計なものを消すだけです。

右クリック - 「Properties」 - 「C/C++ Build」 - 「Environment」を開きます。

その後「PATH」を選択し、「Edit」ボタンを押下すると、編集画面となります。

先頭の以下2つを、完全に削除すればOKです。


  • /opt/st/stm32cubeide_1.0.2/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.7-2018-q2-update.linux64_1.0.0.201904181610/tools/bin

  • /opt/st/stm32cubeide_1.0.2/plugins/com.st.stm32cube.ide.mcu.externaltools.make.linux64_1.0.2.201907030841/tools/bin


3-2-2-2. シンボル定義を何とかする

以下ファイルの以下行(雑)を削除してしまえばよいでしょう。

user@user-VirtualBox:~/workspace/STM32CubeIDE/ImportAsp/asp/target/stm32l476discovery_gcc$ grep hardware_init_hook stm32l4xx_rom.ld

PROVIDE(hardware_init_hook = 0);

ただし、これだとcfg1_outのビルドが通らなくなります(「hardware_init_hook」がない!と怒られる)ので、Makefileに手を入れるしかなさそうです。


  • *.ldを2種類用意する?

  • aspのビルド時にだけ、動的に*.ldを書き換える?

  • cfg1_outをビルドしないようにする?

いずれにしても、面倒くさいですね。笑


3-3. 最終確認

リビルド・デバッグ実行した後に、前回記事同様に、正常動作を確認してください(雑)。


おわりに

IDEでビルド・デバッグできれば、もう怖いものなどありません!笑

しかし、このままですとHALが使えないので、例えばLEDを点滅させたいぜーって場合に

ドライバからゴリゴリ書かねばならず、超絶面倒くさい

です。

ということで、次回以降で、HALとの同居を紹介したいと思います(まだ手をつけていませんが)。

2019/9/19追記

HALとの同居を検討中ですが、ASPカーネルとHALで同名のヘッダがあり苦戦中。

(名前を変更してコードをゴリゴリ書き換えればいいのですが、スマートでない)


参考

(特になし)