[STM32メモ]uVisionのプロジェクトをEclipseで編集する

Keil MDKにはフリー(32kBまで)のコンパイラやRTOS、ミドルウェアがついてお得な反面、IDEであるuVisionはEclipseと比べ使いにくく感じる。例えばuVisionでは、Eclipseの関数のコール元を探す機能や、変数の上にカーソルを載せると値が表示されるようなコード解析の機能が無く、あったとしても使いにくい。こうした機能は地味に役立つので、コーディングはEclipseでできるようにしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/7b406ac5-123c-c922-70e4-0ce5e4a1fab6.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/496a773a-baf9-7c43-c632-f1955f8db0d3.png)

#uVisionのプロジェクトをEclipseで編集するには
uVisionはSTM32Cubeの生成するコードを利用するため、インクルードパスの設定やシンボル定義を行っている。その設定をEclipseのCDTプロジェクトに反映すれば、コード解析が使えるようになる。設定をどうすべきかは、以下のようにuVisionのプロジェクト設定を開くことで確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/f83de68a-7c25-ff28-73b5-c6f3f4fee29b.png)

[C/C++]タブの赤枠部に、インクルードパスや定義すべきシンボルが書かれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/c4373fb4-31e4-7528-f56b-94429eab2b85.png)

赤枠部をテキストエディタなどで開くと以下のようになる。インクルードパスが10(相対4、絶対6)と、シンボル定義が2つあることが分かる。これをEclipse CDTプロジェクトに反映する。

```:オプション抜粋
--c99 --gnu -c --cpu Cortex-M0 -g -O0 --apcs=interwork --split_sections

[1]コード生成したファイルのインクルードパス
-I./RTE/CMSIS
-I./RTE/Device/STM32F042F6Px
-I./RTE/Device/STM32F042F6Px/STCubeGenerated/Inc
-I./RTE/_Target_1

[2]KeilPackに含まれるヘッダのインクルードパス
-I<KeilPackインストール場所>/ARM/CMSIS/5.5.1/CMSIS/Core/Include
-I<KeilPackインストール場所>/ARM/CMSIS/5.5.1/CMSIS/Driver/Include
-I<KeilPackインストール場所>/ARM/CMSIS/5.5.1/CMSIS/RTOS2/Include
-I<KeilPackインストール場所>/ARM/CMSIS/5.5.1/CMSIS/RTOS2/RTX/Include
-I<KeilPackインストール場所>/Keil/STM32F0xx_DFP/2.0.0/Drivers/CMSIS/Device/ST/STM32F0xx/Include
-I<KeilPackインストール場所>/Keil/STM32F0xx_DFP/2.0.0/Drivers/STM32F0xx_HAL_Driver/Inc

[3]シンボル定義
-D__UVISION_VERSION="527" -D_RTE_ -DSTM32F042x6

-o .\Objects\*.o --omf_browse .\Objects\*.crf --depend .\Objects\*.d```
```

#Eclipse CDTの設定を作る
上記の値をそのまま設定しても良いのだが、もう少し便利な方法がある。Eclipseでは各種設定に環境変数を使うことができるようになっている。また、設定を保存することもできる。これらを組み合わせ、環境変数を使って汎用化した設定を保存しておけば、プロジェクトや開発環境で変わる部分を環境変数で与えるだけで済むようになるので、設定の手間が省ける。

設定ファイルを作るには、まず以下のようにCDTプロジェクトに対してuVisionの設定に相当するインクルードパス・シンボル定義を行う。ここでは、`KEIL_PACK`と`STM32_MCU`という変数を使用している。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/5493e86f-a772-2c97-0430-494462a22efe.png" width="30%"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/6a520d15-017e-c742-df78-73c84295fde9.png" width="30%">

そして、設定画面下にある[Export Settings...]から、インクルードパスとシンボル定義をXMLファイルに出力する。XMLファイルは以下のような記述にる。新しいプロジェクトを作りたければ、この設定ファイルを流用すれば良い。

```xml:settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<cdtprojectproperties>
<section name="org.eclipse.cdt.internal.ui.wizards.settingswizards.IncludePaths">
<language name="C Source File">
<includepath>RTE/CMSIS</includepath>
<includepath>RTE/_Target_1</includepath>
<includepath>${KEIL_PACK}/ARM/CMSIS/5.5.1/CMSIS/Core/Include</includepath>
<includepath>${KEIL_PACK}/ARM/CMSIS/5.5.1/CMSIS/Driver/Include</includepath>
<includepath>${KEIL_PACK}/ARM/CMSIS/5.5.1/CMSIS/RTOS2/Include</includepath>
<includepath>${KEIL_PACK}/ARM/CMSIS/5.5.1/CMSIS/RTOS2/RTX/Include</includepath>
<includepath>${KEIL_PACK}/Keil/STM32F0xx_DFP/2.0.0/Drivers/CMSIS/Device/ST/STM32F0xx/Include</includepath>
<includepath>${KEIL_PACK}/Keil/STM32F0xx_DFP/2.0.0/Drivers/STM32F0xx_HAL_Driver/Inc</includepath>
<includepath>RTE/Device/${STM32_MCU}</includepath>
<includepath>RTE/Device/${STM32_MCU}/STCubeGenerated/Inc</includepath>

</language>
<language name="C++ Source File">

</language>
<language name="Object File">

</language>
<language name="Assembly Source File">

</language>
</section>


<section name="org.eclipse.cdt.internal.ui.wizards.settingswizards.Macros">
<language name="C Source File">
<macro>
<name>__UVISION_VERSION</name><value>527</value>
</macro>
<macro>
<name>_RTE_</name><value/>
</macro>
<macro>
<name>${STM32_MCU}</name><value/>
</macro>

</language>
<language name="C++ Source File">

</language>
<language name="Object File">

</language>
<language name="Assembly Source File">

</language>
</section>
</cdtprojectproperties>
```

#Eclipse CDTの設定を使う
作成した設定ファイルをプロジェクトにインポートし、2つの環境変数に具体的な値を設定すれば、必要なインクルードパスとシンボル定義が有効になる。`KEIL_PACK`にKeil MDKのパッケージをインストールしたパスと、`STM32_MCU`にマイコンを識別するためのシンボルを設定する。そのためには、CDTプロジェクトのプロパティで、`C/C++ Build > Environment`で、環境変数を追加すればよい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/fe98ace4-a85c-c625-65ac-130a9ca4714c.png" width="50%">
もしEclipse全体で値を設定したければ、`Window > Preferences > C/C++ Build > Environment`から設定すればよい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296170/f1e06ae6-11a9-f794-1bf7-df8d4cca8b5e.png" width="50%">

#まとめ
uVisionプロジェクトを作りEclipseでコーディングするには、uVisionプロジェクトと同様にインクルードパスの設定とシンボルの定義を行う必要がある。Eclipseで環境変数を使って汎用化した設定ファイルを作り、プロジェクトごとに読み込ませ、環境変数の値を設定することで、少ない手間で必要なインクルードパスの設定とシンボルの定義を行うことができ、快適にコーディングできるようになる。

なお、Keil MDKのデバッガはGDBとは違うらしいので、現在のVer5ではEclipse CDT上では動かせない模様。