printf について (デバッグ, シリアル出力)
printf について (デバッグ, シリアル出力)
printf について (デバッグ, シリアル出力)について記述しています。
printf について (デバッグ, シリアル出力)
printfライブラリ
TWENETライブラリ内で使用する printf() 処理です。詳細は TWENETmuc/printf を御覧ください。
デバッグ用の PRINTF
NXP提供のfslライブラリではPRINTF()マクロを用いてデバッグ出力を行い、リリース時はコンパイル対象から外すようになっています。TWENETライブラリでも、PRINTF()を利用できるようにコードを調整していますが、fslライブラリの機能そのままではありません。
PRINTF()マクロの呼び出し先は上述のprintf_()です。GETCHAR()マクロなど入力には非対応です。
JN518x SDK2.6.3,2.6.4 での NewLib, NewLibNano ではデータ出力の化けや抜けなどが見られ、適切な振る舞いをしません(バッファリングに関する問題と考えられる。RedLib では当該現象がみられないが C/C++ 混在プロジェクトでは使用できない)。このため PRINTF() マクロを libTWENETmcu/printf 内の printf_() 関数を用いるように変更しています。
SDK_DEBUGCONSOLE 定義
SDK_DEBUGCONSOLE の値によって振る舞いが変わります。ビルド対象のアプリケーション内の PRINTF() の振る舞いが変更されます。
| 値 | 内容 |
|---|---|
| 0 | デバッグコンソール(Semihost)へ出力されます(この手続は非常に低速です)。 ※ この出力を有効にするためには libTWENETmcu(Debugビルド)の SDK_DEBUGCONSOLE=0設定を行いライブラリの再ビルドを行い、アプリケーションコード中で_putchar(-1) を周期的(16ms程度)に呼び出す必要があります。(サンプル Samp_bare_MMAC 中に定義された SysTick_Handler() 参照) |
| 1 | Debug ビルド時の設定です。PRINTFはprintf_関数(libTWENETmcu)を用います。_putchar() の再定義を行わない場合SERIAL_bTxChar(0, c); が呼び出されます。TWENETxxxライブラリの Debug 設定もこの値です。 |
| 2 | Release ビルド時の設定です。PRINTFはコンパイル対象から外され、またprintf_()は何も出力しません。printf_()を用いる場合は_putchar(int)を再定義してください。TWENETxxxライブラリの Release 設定もこの値です。 |
- libTWENETmcuライブラリ中の
_putchar()は weak リンク指定です。アプリケーションコード中に定義した_putchar()が優先されます。 - TWENETxxx ライブラリ中の
PRINTF()を有効にする場合は、アプリケーション内のSDK_DEBUGCOSOLEと同じ定義を行い、ライブラリの再ビルドが必要です。
SWO について
TWENETmcu/source には SWO 向けの出力コードが含まれます。この機能については正式サポートは行いませんが、コード内の記述等を以下に解説します。
- ソース中は
-DDEBUG-DSERIAL_PORT_TYPE=1の定義を行った部分が SWO 関連処理としている。この定義を行うとPRINTF()の出力はSWOのITMに出力されるようにコード調整している (main/retarget_itm.c,main/retarget_putchar.c)。 - SWOのポートは PIO14 としている。
- SWOを有効にしてデバッグが開始しないことが多い。ISPピン(PIO5)=LO操作をデバッガ起動直前まで維持すると動作する場合がある。