FreeRTOSでプロファイル取得に失敗
投稿:2012-03-06
LCDの表示とか、インチキsprintfとか色々と機能を追加してきましたので、これらの性能を知りたくなりました。
プロの開発者としては、作った時に把握できてなければなりません。
私は素人なので、ちっとも把握できませんからツールに頼ります。
そのツールの名は「プロファイル」。
おそらくあなたは誤解してると思いますけれど、この名前は20年以上前から使われていますので、こっちが先です(苦笑)。
ワンチップマイコンでプロファイルをとれるのか、世の中進んでるなあ。
仕事でワークステーション用アプリケーションの製品開発中(いつの時代だ?)に、ヒーコラ言いながらプロファイルをとっていた頃が懐かしい。
プロジェクトのプロパティにあります。
スケルトンではビルドがReleaseとDebugの2個、そこにもう1個Profileを追加してあります。
このチェック、2個あるけどよくわからないので2個ともチェックしておこう。
このままビルドすると「オプション-ffunction-sectionsが邪魔」とメッセージが出ますので削除します。
これは使う関数だけをプログラムに入れるオプションなので、オプションを削除すると使わない関数もプログラムに入ってきます。 すると芋づる式に色々な関数が次から次へと入ってきて、かの有名な「_sbrk()」も入ってきます。 で、これの定義がなくて名称未解決となりプログラムが完成しません。 prvListTaskWithinSingleList()→sprintf()→_sbrk()という訳でsprintf()を呼ぶのはprvListTaskWithinSingleList()だけのようです。 この関数を定義するのはFreeRTOSConfig.hのconfigUSE_TRACE_FACILITYが1の場合なので、これを0にしておきます。
#define configUSE_TRACE_FACILITY 0 // デフォルトは1、prvListTaskWithinSingleListがsprintfを呼んで_sbrk要リンクを抑止
※プロファイルを取る時で、オプション-ffunction-sectionsを削除した場合に限りprvListTaskWithinSingleListが残ります。
これでコンパイルするとリンクで__gnu_mcount_ncが名称未解決、中身が空の関数を用意して解決しました。実行するとHardFault_Handler()で停止(涙)。
これは使う関数だけをプログラムに入れるオプションなので、オプションを削除すると使わない関数もプログラムに入ってきます。 すると芋づる式に色々な関数が次から次へと入ってきて、かの有名な「_sbrk()」も入ってきます。 で、これの定義がなくて名称未解決となりプログラムが完成しません。 prvListTaskWithinSingleList()→sprintf()→_sbrk()という訳でsprintf()を呼ぶのはprvListTaskWithinSingleList()だけのようです。 この関数を定義するのはFreeRTOSConfig.hのconfigUSE_TRACE_FACILITYが1の場合なので、これを0にしておきます。
#define configUSE_TRACE_FACILITY 0 // デフォルトは1、prvListTaskWithinSingleListがsprintfを呼んで_sbrk要リンクを抑止
※プロファイルを取る時で、オプション-ffunction-sectionsを削除した場合に限りprvListTaskWithinSingleListが残ります。
これでコンパイルするとリンクで__gnu_mcount_ncが名称未解決、中身が空の関数を用意して解決しました。実行するとHardFault_Handler()で停止(涙)。