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操作をデバッガ起動直前まで維持すると動作する場合がある。