Keilコンパイラ5プロジェクトのKeilコンパイラ6への変換
概要
STM32CubeMXは、すべてのマイクロコントローラに対してKeilコンパイラ6(armclang)プロジェクトの生成をサポートしているわけではありません。 こうしたシナリオにおいてKeilコンパイラ6をTouchGFXで使用するには、以下の手順を実行してプロジェクトを変換する必要があります。
変更を元に戻す必要が生じた場合に備えて、この手順を実行する前にプロジェクトをバックアップしておくことを推奨します。
STM32CubeMXでのツールチェーンの変更
まず、STM32CubeMXの[Project Manager]タブでツールチェーンをMDK-ARMに変更します。これによってKeilプロジェクトが作成されます。 次にコードを生成します。
TouchGFX Designerでのコード生成
ボタンまたはキーボード上のF4キーを押すことで、TouchGFX Designerからコードを生成し、TouchGFX固有のコードをプロジェクトに追加します。
Keilスキャッタ・ファイルの変更
Keilがプロジェクトのリンクのために使用するスキャッタ・ファイルでは、TouchGFXによって作成されたバッファが初期化されないようにするための微調整が必要です。通常バッファは外部RAMに配置されていて、ブート時にはアクセスできないためです。
プロジェクトのMDK-ARMサブフォルダにある.sctファイルに目を通して、プロジェクトで使用されるバッファを特定し、 オブジェクト名の前に.bssを追加します。
これらのオブジェクトはTouchGFX_Framebuffer、Video_RGB_Buffer、Nemagfx_Memory_Pool_Buffer、Nemagfx_Stencil_Bufferと呼ばれますが、プロジェクト内で必ずしもすべてが使用されるわけではありません。
更新後のスキャッタ・ファイルの例
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x24000000 0x00080000 { ; RW data
.ANY (+RW +ZI)
}
RW_HYPERRAM 0x70000000 UNINIT 0x00FFFFFF {
*.o (.bss.TouchGFX_Framebuffer)
*.o (.bss.Video_RGB_Buffer)
}
}
LR_EROM1 0x90000000 0x2000000 { ; load region size_region
ER_EROM1 0x90000000 0x2000000 { ; load address = execution address
*.o (ExtFlashSection)
; *.o (TextFlashSection)
; *.o (FontFlashSection)
}
}
Keilプロジェクトのオプションの変更
Keil uVisionでプロジェクトを開き、プロジェクト設定に移動します。このためには、右側のリストの2つ目のアイテムを右クリックして[Options for Target xxx]を選択するか、上部にある[Project]メニューをクリックして[Options for Target xxx]を選択します。そして、[target]タブで以下の設定を選択します。
- コンパイラを[Use default compiler 6]に設定
- [Use MicroLIB]を無効化
[C/C++]タブで以下の設定を選択します。
- C言語をC11、C++をC++11に設定
- short enums/wcharを無効化
- コード・サイズが小さい場合に推奨される最適化は-Oz
FreeRTOSが使用されている場合は、ポートを、Keilコンパイラ6と互換性があるgccに変更する必要があります。 gccポートはTouchGFXによって使用されるのでプロジェクト内で使用可能ですが、Keilプロジェクトの生成が選択されたときにSTM32CubeMXによって生成されるものではありません。
変更するには、最初の手順としてポートのインクルード検索パスを変更します。 インクルード・パスのテキスト・フィールドの横にある[...]をクリックします。
「../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS」で始まる行を見つけます。 次に、「..」の後に「/gcc」を追加し、「RVDS」を「GCC」に変更します。
Cortex M7の一部のリビジョンについて、FreeRTOSはCortex M4fポートの使用を推奨しています。 これはSTM32H7シリーズのチップに適用されるので、元の検索パスに反映させる必要があります。
Keilプロジェクトに含まれたファイルの変更
TouchGFXライブラリとリンクできるようにするには、プロジェクトに含まれているファイルをKeilコンパイラ6と互換するバージョンに変更する必要があります。 このためには、ファイル・ツリー(「Lib」カテゴリにある)でtouchgfx_core.libファイルを見つけ、親フォルダを右クリックして[Add Existing File to Group xxx]をクリックします。
[Project folder]/Middlewares/ST/touchgfx/lib/core/[Architecture]/Keil6.xに移動して、touchgfx_core_wchar32.libを追加します。
この場合、[Architecture]にはマイクロコントローラの実際のアーキテクチャを指定します。 不明な場合は、既存のライブラリの場所を確認してください。
次に、ファイル・ツリーで古いライブラリ参照を見つけ、これを右クリックして[Remove File xxx]をクリックします。
FreeRTOSを使用する場合は、port.cファイルを置き換える必要もあります。 「Middlewares/FreeRTOS」の下でこのファイルを見つけ、前述のように削除します。 次に、[Project folder]/gcc/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/[FreeRTOS architecture]にある新しいport.cファイルをインポートします。
この時点でプロジェクトを正常にコンパイルできるようになります。
参照用にこの状態のプロジェクト・フォルダのコピーを作成することをお勧めします。STM32CubeMXとTouchGFXの両方での再生成によって変更の一部が元に戻る可能性があるからです。