はじめに
こちらの記事にて「STM32CubeIDEでTOPPERS/ASPカーネルを動かす」ことには成功しました。
がしかし、単にASPカーネルを取り込んだだけなので、STマイクロのHALドライバが使えません。。。
昔気質のエンジニアであれば、
「ドライバはゴリゴリ書くもんじゃ!!」
なんて言い出しそうですが、時代じゃないですね。楽できるところは楽しちゃいましょう。笑
ということで、これらを同居させる方法を紹介します!
環境
- Ubuntu 16.04 LTS
- 評価用ボード: STM32L4 Discovery kit IoT node - 型番はB-L475E-IOT01A
- STM32CubeIDE 1.0.2
本編
1. ASPカーネル環境構築
先に書いてしまうと、かなり面倒なため、以下に成果物は配置済みです。
面倒な方はasp
ディレクトリごとコピーし、1-3.にスキップしてください。
1-1. 過去資産の取り込み
STM32CubeIDEでTOPPERS/ASPカーネルを動かす - 準備編 - Qiita
https://qiita.com/imagou/items/8e19ed77884af4fb4e71
に従い、
ASPカーネルがビルドでき、かつ正常動作する
ところまで確認してください。
1-2. 追加修正
1-2-1. シンボル定義を削除
(削除する理由はこちらを参照)
まず、リンカスクリプトからhardware_init_hook
を削除。
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
のビルドが通らなくなるので、リンカスクリプトを二重化。
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されています。
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. ビルド・動作確認
先の手順と同様、ビルドが通ること、及び正常動作を確認してください。
2. アプリケーションの独立化
HALドライバ呼び出しのため、OBJ
ディレクトリ配下にあったアプリケーションを独立化させます。
2-1. 作成
OBJ
ディレクトリごとコピーしてMakefile
を書き換えて云々、、、の手順が同じく面倒なので、以下に成果物を配置しました。
application
ディレクトリごとコピーしてください。
2-2. ビルド
ビルドが通ることだけ確認します。ここではコンパイルだけ実施、リンカは動かしていません。
(以下ディレクトリに移動し)
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」押下で、空のプロジェクトが生成されます!
3-1-2. インポート
「RTOS」プロジェクトの上で右クリック - 「Import...」を選択。
「General」 - 「File System」を選び、「Next >」押下。
- 「From directory」で作成済みの「asp」ディレクトリを選択
- すべてのディレクトリ・ファイルにチェック
- 「Create top-level folder」にもチェックを入れる
とし、最後に「Finish」ボタンを押下すると、、、
以下の通り、見事に取り込まれました!
3-1-3. 余計なディレクトリを削除
必須ではありませんが、使わないであろう「Src」「Inc」は右クリックメニューから削除しておきましょう。
(画像はありません、すみません)
3-1-4. ビルドロケーションの変更
プロジェクトの上で右クリック - 「Properties」を開き、「C/C++ Build」メニューを選択します。
- 「Makefile generation」の「Generate Makefiles automatically」のチェックを外す
- 「Build location」の「Build directory」のお尻を「Debug」から「asp/OBJ」に変更
した後、「Apply and Close」を押下。
3-1-5. いざ、ビルド
後は、右クリックメニューから「Clean Project」「Build Project」を実行するだけです。
(場合によっては、コンソールでのmake cleandep/make dependが必要かもしれません)
無事通っていますね!
3-2. アプリケーション
3-2-1. 空のプロジェクト生成
こちらは単なるオブジェクトなので、STM32CubeIDEから「C/C++ project」でもって作成します。
下記画面のように、「C Managed Project」を選択してください。
- 「Project name」は「RTApp」
- 「Project type」は「Empty Project」
- 「Toolcahins」は「MCU ARM GCC」
とし、「Finish」押下で、空のプロジェクトが作成されます。
3-2-2. インポート
[ASPカーネル](#3-1-2-インポート)とやり方は同じです。
インポートするディレクトリは「application」としてください。
3-2-3. ビルドロケーションの変更
こちらは、「Build location」の「Build directory」のお尻を「Debug」から「application」に変更します。
3-2-4. Makefile書き換え
ASPカーネルのパスが変わったので、Makefileを書き換えます。
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が必要かも)
4. 動作確認
ここまででビルドは済んでいるので、ASPカーネル側のみ動作確認します。
4-1. 設定
「RTOS」プロジェクトの上で右クリック - 「Debug As」 - 「STM32 MCU C/C++ Application」を選択。
「asp」が選択されたままの状態で「OK」押下。
以下は、「Disabled auto build」としておいたほうが幸せになれそう。で「OK」押下。
4-1. 動作確認
以降は(ダイアログが出たりしますが、適当にあしらって)ブレークポイントも張ってない手前、勝手にプログラムが動き出すはずです。
先の手順と同様、正常動作を確認してください。
おわりに
次記事も準備編の予定。
STM32CubeIDEでTOPPERS/ASPカーネルとHALドライバを同居 - 準備編 (2) - Qiita
https://qiita.com/imagou/items/29edbaefcc3da5a9c073
参考
(特になし)