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

[前回記事](https://qiita.com/imagou/items/8e19ed77884af4fb4e71)の続きで、いよいよ、、、
**TOPPERS/ASPカーネルをSTM32CubeIDEでビルド・デバッグ可能とします！**

基板立ち上げ時はもちろん、それ以外のトラブル時にも、IDEはとても有用です（言うまでもありませんが）。

要は、既存プロジェクトをどうやって取り込むか？という話でして、IDE毎にやり方・癖がありますが、**STM32CubeIDEは思ったより楽**でした。

# （本編の）本編

## 1. 準備

### 1-1. 環境

基本は[前回記事](https://qiita.com/imagou/items/8e19ed77884af4fb4e71#1-1-%E7%92%B0%E5%A2%83)を踏襲ですが、それら以外。

- 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/83554171-e608-3e73-6182-a84001e8e610.png)

#### 1-2-2. ASP取り込み

[前回記事](https://qiita.com/imagou/items/8e19ed77884af4fb4e71)のASPカーネル（動作確認済みのものを推奨）を取り込みます。

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-25-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/552c8c8d-c49b-3396-fbcc-8e2597521a30.png)

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-25-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b57ae772-1a1e-2207-2c36-b7a3e5486acb.png)

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

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-26-8_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/b0173544-3e4c-0360-c304-da993fd2853a.png)

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-6_16-26-36_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/767227ca-3428-1591-19ff-13d51412bafa.png)

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

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

## 2. ビルド

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

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

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

1. 「Makefile generation」の「Generate Makefiles automatically」のチェックを外す
1. 「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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/91454b31-3eb6-cff3-e646-67577a8a0602.png)

### 2-2. いざ、ビルド

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-10-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/1e775674-eca5-8692-cbd0-aa31c5503199.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/4681e283-2444-25c3-a880-e004af1337b3.png)

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-15-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/8f08e8a2-b64e-47a6-c1b2-2db1ca43f6cf.png)

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

![SnapCrab_Ubuntu (TOPPERS環境構築中) [実行中] - Oracle VM VirtualBox_2019-8-7_10-15-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e6213d15-1a64-4131-4074-a4e3ab725b79.png)

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

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

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

### 3-2. 動かない件、デバッグ

#### 3-2-1. 原因

ビルドロケーションである「OBJ」ディレクトリ配下にある、「asp.syms」を確認してみます。

```Console
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番地）にジャンプ
1. 行方知れず

となっている模様。

**ずばり、GCC ARM Toolchainが新しいと、このような事象となるようです。**

#### 3-2-2. 対策

- シンボル定義を何とかする
- GCC ARM Toolchainをコマンドラインビルドと一緒にする（古いものを使う）

のいずれかとなりますが、ここでは前者を採用、後者は非推奨とします。
（一長一短と思いますが、以降の記事で新しいツールチェインを使う必要があったため）

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

元ファイルをバックアップしてから、シンボル定義を削除してやります。
（`grep`を使いました）

```Console
（以下ディレクトリに移動し）
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ファイルを使用しています。

```console
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. 最終確認

リビルド・デバッグ実行し、[前回記事](https://qiita.com/imagou/items/8e19ed77884af4fb4e71#3-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)同様、正常動作を確認してください（雑）。

# おわりに

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

しかし、このままですとHALが使えないので、例えばLEDを点滅させたいぜーって場合に
**ドライバからゴリゴリ書かねばならず、超絶面倒くさい**
です。

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

**2019/9/19追記**
~~HALとの同居を検討中ですが、ASPカーネルとHALで同名のヘッダがあり苦戦中。~~
~~（名前を変更してコードをゴリゴリ書き換えればいいのですが、スマートでない）~~
何とか解決しました。

# 参考

（特になし）