STM32CubeIDEでTOPPERS/ASPカーネルとHALドライバを同居 - 準備編 (1)

# はじめに

[こちらの記事](https://qiita.com/imagou/items/1a09d9afecc3f62e22d1)にて「STM32CubeIDEでTOPPERS/ASPカーネルを動かす」ことには成功しました。

がしかし、単にASPカーネルを取り込んだだけなので、STマイクロのHALドライバが使えません。。。

昔気質のエンジニアであれば、
**「ドライバはゴリゴリ書くもんじゃ！！」**
なんて言い出しそうですが、時代じゃないですね。楽できるところは楽しちゃいましょう。笑

ということで、これらを同居させる方法を紹介します！

## 環境

- Ubuntu 16.04 LTS
- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A
- [STM32CubeIDE 1.0.2](https://www.st.com/ja/development-tools/stm32cubeide.html)


# 本編

## 1. ASPカーネル環境構築

**先に書いてしまうと、かなり面倒なため、以下に成果物は配置済みです。**
**面倒な方は`asp`ディレクトリごとコピーし、[1-3.](#1-3-ビルド動作確認)にスキップしてください。**

https://github.com/imagou/QiitaSource/tree/master/toppers/stm32l4xx/asp

### 1-1. 過去資産の取り込み

**STM32CubeIDEでTOPPERS/ASPカーネルを動かす - 準備編 - Qiita**
https://qiita.com/imagou/items/8e19ed77884af4fb4e71

に従い、
**ASPカーネルがビルドでき、かつ正常動作する**
ところまで確認してください。

### 1-2. 追加修正

#### 1-2-1. シンボル定義を削除

（削除する理由は[こちら](https://qiita.com/imagou/items/1a09d9afecc3f62e22d1#3-2-1-%E5%8E%9F%E5%9B%A0)を参照）

まず、リンカスクリプトから`hardware_init_hook`を削除。

```console
user@user-VirtualBox:~/toppers/asp/target/stm32l476discovery_gcc$ grep hardware_init_hook stm32l4xx_rom.ld
PROVIDE(hardware_init_hook = 0);
user@user-VirtualBox:~/toppers/asp/target/stm32l476discovery_gcc$ cp -p stm32l4xx_rom.ld stm32l4xx_rom.ld.org
user@user-VirtualBox:~/toppers/asp/target/stm32l476discovery_gcc$ grep -v hardware_init_hook stm32l4xx_rom.ld.org > stm32l4xx_rom.ld
user@user-VirtualBox:~/toppers/asp/target/stm32l476discovery_gcc$ diff stm32l4xx_rom.ld stm32l4xx_rom.ld.org
9a10
> PROVIDE(hardware_init_hook = 0);
```

また、`cfg1_out`のビルドが通らなくなるので、リンカスクリプトを二重化。

```console
user@user-VirtualBox:~/toppers/asp/OBJ$ cp -p Makefile Makefile.org
user@user-VirtualBox:~/toppers/asp/OBJ$ sed -i -e 's/^\(\s*\)CFG1_OUT_LDFLAGS\(.*\)$(LDSCRIPT)$/&.org/' Makefile
user@user-VirtualBox:~/toppers/asp/OBJ$ diff Makefile Makefile.org
278c278
<   CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-T,$(LDSCRIPT).org
---
>   CFG1_OUT_LDFLAGS := $(CFG1_OUT_LDFLAGS) -Wl,-T,$(LDSCRIPT)
```

#### 1-2-2. ヘッダの名称変更

以下の通り、`stm32l4xx.h`というヘッダがincludeされています。

```console
user@user-VirtualBox:~/toppers/asp$ find . -name stm32l4xx.h
./arch/arm_m_gcc/stm32l4xx/stm32l4xx.h
user@user-VirtualBox:~/toppers/asp$ grep -r stm32l4xx.h
arch/arm_m_gcc/stm32l4xx/MANIFEST:stm32l4xx.h
arch/arm_m_gcc/stm32l4xx/chip_config.c:#include "stm32l4xx.h"
arch/arm_m_gcc/stm32l4xx/stm32l4xx.h: *  @(#) $Id: stm32l4xx.h,v 1.2 2018/11/05 20:31:08 roi Exp $
（略）
```

本ファイルがHALドライバと重複してしまうので、事前に`_renamed_stm32l4xx.h`に変更しておきます。

当然ですが、ファイル名変更だけではビルドが通らないので、中身（include元）も変更してください。
（MANIFESTファイルも変更しなきゃいけない模様。。。）

### 1-3. ビルド・動作確認

[先の手順](#1-1-過去資産の取り込み)と同様、ビルドが通ること、及び正常動作を確認してください。

## 2. アプリケーションの独立化

HALドライバ呼び出しのため、`OBJ`ディレクトリ配下にあったアプリケーションを独立化させます。

### 2-1. 作成

**`OBJ`ディレクトリごとコピーして`Makefile`を書き換えて云々、、、の手順が同じく面倒なので、以下に成果物を配置しました。**
**`application`ディレクトリごとコピーしてください。**

https://github.com/imagou/QiitaSource/tree/master/toppers/stm32l4xx/application

### 2-2. ビルド

ビルドが通ることだけ確認します。ここではコンパイルだけ実施、リンカは動かしていません。

```console
（以下ディレクトリに移動し）
user@user-VirtualBox:~/toppers/application$ make depend
if ! [ -f Makefile.depend ]; then \
        rm -f kernel_cfg.timestamp kernel_cfg.h kernel_cfg.c ; \
（略）
check complete
Generating Makefile.depend.
user@user-VirtualBox:~/toppers/application$ make
arm-none-eabi-gcc -c  -DSIO_PORTID=2 -mlittle-endian -nostartfiles -mthumb  -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -g  -Wall -O2  -DTOPPERS_CORTEX_M4 -D__TARGET_ARCH_THUMB=4 -D__TARGET_FPU_FPV4_SP -DTOPPERS_FPU_ENABLE -DTOPPERS_FPU_LAZYSTACKING -DTOPPERS_FPU_CONTEXT  -DTOPPERS_ROM -I. -I../asp/include -I../asp/arch -I../asp  -I../asp/target/stm32l476discovery_gcc -I../asp/arch/arm_m_gcc/stm32l4xx -I../asp/arch/arm_m_gcc/common -I../asp/arch/gcc   -DALLFUNC  -I../asp/kernel kernel_cfg.c
arm-none-eabi-gcc -c  -DSIO_PORTID=2 -mlittle-endian -nostartfiles -mthumb  -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -g  -Wall -O2  -DTOPPERS_CORTEX_M4 -D__TARGET_ARCH_THUMB=4 -D__TARGET_FPU_FPV4_SP -DTOPPERS_FPU_ENABLE -DTOPPERS_FPU_LAZYSTACKING -DTOPPERS_FPU_CONTEXT  -DTOPPERS_ROM -I. -I../asp/include -I../asp/arch -I../asp  -I../asp/target/stm32l476discovery_gcc -I../asp/arch/arm_m_gcc/stm32l4xx -I../asp/arch/arm_m_gcc/common -I../asp/arch/gcc  sample1.c
```

## 3. STM32CubeIDEへの取り込み

### 3-1. ASPカーネル

#### 3-1-1. 空のプロジェクト生成

STM32CubeIDEから「STM32 project」でもって作成します（ターゲットボードは適当に選択してください）。

- 「Project Name」は「RTOS」
- 「Targeted Binary Type」は「Static Library」
- 「Targeted Project Type」は「Empty」

以上とし、「Finish」押下で、空のプロジェクトが生成されます！

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-17_15-58-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/4831ff83-2863-1b81-13db-53bf724832da.png)

#### 3-1-2. インポート

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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-17_16-3-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/7b8003b2-61bb-3751-d656-b9a82551c1bd.png)

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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-17_16-4-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/7608737b-ab40-7e4f-589d-084d6cb010f1.png)

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

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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-17_16-4-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/759e5538-cac3-48ce-7129-40ab1660c7b6.png)

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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-17_16-5-7_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/47f61bc6-77f5-acc9-0a61-de7729a8a6c7.png)

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

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

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

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

1. 「Makefile generation」の「Generate Makefiles automatically」のチェックを外す
1. 「Build location」の「Build directory」のお尻を「Debug」から「asp/OBJ」に変更

した後、「Apply and Close」を押下。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-18_15-17-27_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/08e8d2ac-f0c9-e811-55d9-71b6b0aacbd7.png)

#### 3-1-5. いざ、ビルド

後は、右クリックメニューから「Clean Project」「Build Project」を実行するだけです。
（場合によっては、コンソールでのmake cleandep/make dependが必要かもしれません）

無事通っていますね！

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-18_15-17-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/d2763827-e381-b975-8197-2f95432b7a0f.png)

### 3-2. アプリケーション

#### 3-2-1. 空のプロジェクト生成

こちらは単なるオブジェクトなので、STM32CubeIDEから「C/C++ project」でもって作成します。

下記画面のように、「C Managed Project」を選択してください。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-14-40_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/0df4bb24-79c5-ca7b-026f-8032779f98c0.png)

- 「Project name」は「RTApp」
- 「Project type」は「Empty Project」
- 「Toolcahins」は「MCU ARM GCC」

とし、「Finish」押下で、空のプロジェクトが作成されます。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-16-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/82a63576-2932-f79e-5279-45e5465fec91.png)

#### 3-2-2. インポート

[ASPカーネル]（#3-1-2-インポート）とやり方は同じです。
インポートするディレクトリは「application」としてください。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-22-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/772c2d10-ca86-7234-bead-194467966184.png)

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

こちらは、「Build location」の「Build directory」のお尻を「Debug」から「application」に変更します。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-23-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/c687026e-653f-9fb1-8e10-7bc153560baf.png)

#### 3-2-4. Makefile書き換え

ASPカーネルのパスが変わったので、Makefileを書き換えます。

```console
user@user-VirtualBox:~/workspace/STM32CubeIDE/RTApp/application$ cp -p Makefile Makefile.org
user@user-VirtualBox:~/workspace/STM32CubeIDE/RTApp/application$ sed -i -e 's/^\(SRCDIR\)\(\s*\)\(=\)\(\s*\)\(.*\)$/\1\2\3\4..\/..\/RTOS\/asp/' Makefile
user@user-VirtualBox:~/workspace/STM32CubeIDE/RTApp/application$ diff Makefile Makefile.org
70c70
< SRCDIR = ../../RTOS/asp
---
> SRCDIR = ../asp
```

#### 3-2-5. ビルド

こちらも、ビルド（コンパイル）が通ることを確認してください！
（同じく、手動でのmake cleandep/dependが必要かも）

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-25-20_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/0640f3c8-3e14-666b-63e6-d839a7ec764b.png)

## 4. 動作確認

ここまででビルドは済んでいるので、ASPカーネル側のみ動作確認します。

### 4-1. 設定

「RTOS」プロジェクトの上で右クリック - 「Debug As」 - 「STM32 MCU C/C++ Application」を選択。

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-30-46_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/c6e3295e-031b-b628-1c9f-029d49024b75.png)


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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-27-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/e688380b-721a-1234-cd19-d2b52178def5.png)

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

![SnapCrab_Ubuntu [実行中] - Oracle VM VirtualBox_2019-10-21_13-29-52_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/eae3bd37-62cb-0767-7c93-a894e09c5df2.png)

### 4-1. 動作確認

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

[先の手順](#1-1-過去資産の取り込み)と同様、正常動作を確認してください。

# おわりに

次記事も準備編~~の予定~~。

**STM32CubeIDEでTOPPERS/ASPカーネルとHALドライバを同居 - 準備編 (2) - Qiita**
https://qiita.com/imagou/items/29edbaefcc3da5a9c073


# 参考

（特になし）