/      English

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() 参照)
1Debug ビルド時の設定です。PRINTFprintf_関数(libTWENETmcu)を用います。_putchar() の再定義を行わない場合SERIAL_bTxChar(0, c); が呼び出されます。TWENETxxxライブラリの Debug 設定もこの値です。
2Release ビルド時の設定です。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操作をデバッガ起動直前まで維持すると動作する場合がある。