LoginSignup
10
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-07

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

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-23-25_No-00.png

1-2-2. ASP取り込み

前回記事のASPカーネル(動作確認済みのものを推奨)を取り込みます。

作成済みのプロジェクトの上で右クリック - 「Import...」を選択。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-25-21_No-00.png

「General」 - 「File System」を選び、「Next >」押下。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-25-37_No-00.png

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

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

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-26-8_No-00.png

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

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-26-36_No-00.png

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」を押下。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_9-59-42_No-00.png

2-2. いざ、ビルド

後は、右クリックメニューから「Clean Project」「Build Project」を実行するだけです。
無事通っていますね!

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-10-21_No-00.png

3. デバッグ

先に書いちゃうと、
これだけではまともに動かない
のですが、解決までの軌跡もある程度残しておきたいので。笑

3-1. 設定~いったん動かす

おなじみ右クリック - 「Debug As」 - 「STM32 MCU C/C++ Application」を選択。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-15-5_No-00.png

「asp」が選択されたままの状態で「OK」押下。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-15-21_No-00.png

以下は、「Disabled auto build」としておいたほうが幸せになれそう。で「OK」押下。

SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-15-56_No-00.png

以降は(ダイアログが出たりしますが、適当にあしらって)ブレークポイントも張ってない手前、勝手にプログラムが動き出しますが、、、

起動ログも出ないしコンソールも反応しない

です。こいつを解決せねばなりません!

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

参考

(特になし)

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2