FreeRTOSでSEGGER SystemViewを使う
FreeRTOSで複数のタスクを使ってアレコレするようになってくると、それぞれのタスクがどのような順番、タイミングで処理されているか、脳内シミュレートでは追えなくなってくる。結果、正確にバグを追えなくなってくる。
せっかくSegger J-Linkを使っているのだから、ツールの恩恵は受けないと宝の持ち腐れとなってしまうため、導入してみた。
導入環境はPop! OS 20.10、使用している開発環境はMCUXpresso
導入
https://gyazo.com/0121b22d901e34e872d5fd072f3f345a
このときに、SystemView Target sourcesも一緒にダウンロードしておく。こちらは、後でMCUXpressoのプロジェクトに加えたりで必要。
code:dpkg
cd Downloads (ダウンロードしたディレクトリに移動)
sudo dpkg -i SystemView_Linux_V330_X86_64.deb (SystemViewのインストール)
unar SystemView_Src_V330.zip (ソースの展開)
いちおう、公式にドキュメントはあるが、サラっとしすぎなため、以下、詳細な手続き。 プロジェクトへのソース類のコピー
下記のような感じで、必要なファイルをプロジェクト内にコピーする。
MCUXpressoから導入できるFreeRTOSの最新バージョンがv10.3.0だったため、Sample/FreeRTOSV10内のファイルをプロジェクトにコピーしているが、ここは各自の環境に合わせる。ファイルを入れるディレクトリ名も分かりやすいようにSEGGER、SystemViewとしたが、好きな名前で構わない。
code:copy-files
mkdir SEGGER
mkdir SystemView
cp ~/Downloads/SystemView_src_V330/SEGGER/SEGGER*.h SEGGER
cp ~/Downloads/SystemView_src_V330/SEGGER/SEGGER*.c SEGGER
cp ~/Downloads/SystemView_src_V330/Config/*.h SystemView
mkdir SystemView/Config
mkdir SystemView/Config//Cortex-M
cp ~/Downloads/SystemView_src_V330/Sample/FreeRTOSV10/Config/Cortex-M/*.c SystemView/Config/Cortex-M
cp ~/Downloads/SystemView_src_V330/Sample/FreeRTOSV10/SEGGER_SYSVIEW_FreeRTOS.* SystemView
ヘッダー類を置いたディレクトリをIndculesに加えるのを忘れないように。。。
https://gyazo.com/f17751a6b2829e8c3c6edf4e70f95e61
FreeRTOSのカーネルにパッチを合てる
Sample/FreeRTOSV10の中にPatchというディレクトリがあり、パッチファイルもあるのだが、このパッチファイルがFreeRTOS v10.0.0用のため、v10.3.0にはこのパッチファイルを適用できない。そのため、今回はパッチファイルを見ながら手作業でパッチを合てた。
Sample/FreeRTOSV10には2種類のパッチファイルが入っているが、参考にしたのはFreeRTOSV10_Core.patchのほう。
大した量ではないので、該当するコードで追記もしくは変更する箇所を見つけて、エディットしていく。ただし、tasks.c
は変更箇所がある関数が異なっていたりするため、慎重に。
Git Gistに手作業で適用した変更から作成したパッチファイルを上げとく。
ヘッダー/ソースの変更
FreeRTOSConfig.hの最後の方?に#include "SEGGER_SYSVIEW_FreeRTOS.h"を加える。
FreeRTOSConfig.hにあるINCLUDE_xTaskGetIdleTaskHandleを0から1に変更する。
FreeRTOSConfig.hに#define INCLUDE_pxTaskGetStackStart 1を追記する。
main()の中とか、テキトーな初期化処理のところでSEGGER_SYSVIEW_Conf()を呼ぶ。
SystemViewを使って解析
この変更を行なって、無事にビルドが通り、実機に書き込みできれば自身のプロジェクトにSystemViewを組み込めているハズ。SystemViewを立ち上げて、TargetメニューからStart Recordingをクリックして、JLink経由で実機に接続して、SystemViewに、ばーっと何か表示されはじめればOK。