Previous: 12. デバッグ |
Up: 12. デバッグ |
Next: 12.2. デバッガ |
「printfデバッグ」と通称されているデバッグ手法があります。これは要は、プログラムの実行状態をprintf文で表示するということなのですが、あるタイミングでの変数の内容を表示したり、特定の条件分岐に入ったかどうかを示したりします。
プリミティブな手法ですが、後述のデバッガを使えない場合、たとえば本書の環境でJTAGインターフェースを使用せずにUSB経由でプログラムをアップロードしている場合には、プログラムの実行状態を判断する有用な手段となります。プログラムの実行状態をGPIOから出力してLEDを点滅させたりする方法もあるのですが、表現できる情報の量と質が違います。
もっともPCとは違い、組み込みマイコンの場合、通常はディスプレイが接続されていません。特にSTM32のような低価格のマイコンだとなおさらです。そこでprintfデバッグをする場合には、通常はPCとシリアル通信インターフェース経由で接続し、PC上のターミナルにprintfの実行結果を表示させます。
なお標準ライブラリ関数のprintf関数は浮動小数点出力ができる等非常に多機能なのですが、その分コードサイズが大きくなっています。このクラスのマイコンであれば浮動小数点の計算機能自体備えていないものが多いので、無駄に容量を消費することになります。そこでprintfと同等の機能を持つデバッグ用の出力用関数を用意することが多いです。本書の環境ではシリアル通信用のprintf関数としてcprintf関数(COM Print Formattedの意です)を用意しました。詳しくは本編を参照してください。
気をつけないといけないのは、シリアル通信は時間がかかるのでマイコンのプログラムルーチンの実行速度に影響を与えてしまうという点です。本書のcprintf関数の実装では、バッファ等を利用していませんので、送信文字数に比例した時間がかかります。特に割込み処理内で使用すると、他の割込みやメインルーチンへの影響が大きいです。本書ではサンプルプログラムの実行結果を確認するためにcprintf文を割込み処理内外で多用していますが、本道ではないことに留意してください。
こういったデバッグ用の関数を利用したときには、製品化する時点で抜き忘れないようにしましょう。余分な情報が出力されたりして、セキュリティ上の問題となることがあります。これを防止するためにはDEBUGマクロが定義されているときだけprintf関数を実行するといったルーチンにすることもできます。
コラム 12?1 scanf関数
PC用のC言語プログラミング入門書でよく利用される関数にscanf関数があります。標準入力(通常はキーボード)から入力されたデータを取得するというものです。組み込み開発でもこれが使えるとよいのですが、マイコンにはそもそもキーボードすら付いていません。そこでprintfのときと同じく、デバッグ用途であれば、シリアル通信を介して入力情報を取得することになります。本書でもこれができるように、ごく簡易なものですが関数を用意しました。詳しくは本編を参照してください。 |
Previous: 12. デバッグ |
Up: 12. デバッグ |
Next: 12.2. デバッガ |