マイコンカーラリー printfデバッグ (2) デバッグの準備

printfデバッグに使うシリアルポート

printfデバッグをおこなうためにはマイコンボードの情報をPCに出力する仕組みが必要となります。
マイコンカーラリーに使うボードにはプログラム書き込みのためのシリアルコネクタがあり、そのシリアル経由で通信することが出来ます。

ボード上のprintfサポートライブラリ

PC上で走るアプリケーションの場合何も考えなくてもprintfの結果は画面に表示されますがボードで走るプログラムの場合はprintfの結果をシリアルポートから出力する機能をライブラリがサポートしていることが必要です。
マイコンカーラリーのライブラリにprintf_lib.cが用意されていてこの中に書き込みコネクタのUART0からデータを出力する機能がサポートされています。

通信速度について

printfデバッグで情報を取り出すときにまず考えておかなければならないのはシリアル送信に要する時間です。
シリアル通信ではスタートビット+8ビットデータ+ストップビットの10ビットでアルファベット一文字(1バイト)が送信できます。
例えば通信速度が9600bpsでは1秒に 最大(9600/10)=960文字送ることが出来ます。
マイコンカーラリーのプログラムは1ms毎の制御をしていますが1msに一文字も送ることが出来ないので9600bpsでは1ms毎の割り込みには対応できません。

マイコンカーラリーで使うR8C/38Aに設定できる最大通信速度は1250000bpsで、この場合1秒間に1250000/10=125000文字、1msあたり125文字の送信が可能です。

例えばデータとして次のように10個の16ビットデータを16進数で送る例では
1A80,334B,F7C3,78EF,224A,68C1,FF00,DE0A,1322,98B3[cr]

50文字の送信となり送信に必要な時間は1ms/125*50=0.4msで、プログラムループで送信待ちを行うと0.4msの間プログラムの処理時間を占有されてしまいます。
マイコンカーラリー用のライブラリでは送信割り込みを使った通信がサポートされていて、通信処理のプログラム占有時間を大幅に削減できるのでこれを使うことにします。

PC用のターミナルソフト

PC用ターミナルソフトとしては定番のTeraTermという良くできたソフトがあるのですが、私はDelphiで開発したJTW32という自作のソフトを使っています。
もとはH8シリーズのプログラム書き込みツールとして作ったものですが今ではデバッグ用ターミナルとして機能拡張して使っています。
(ここからJTW32がダウンロード出来ます)※インストーラはありません、任意のフォルダに解凍して実行するだけで使えます。

第一の理由は1.25Mbps,3Mbpsという通信速度をサポートしているターミナルソフトが無いことです。
最近のPCでは無くなったRS232Cポートは物理的にサポートされている最大速度が115200bps程度でしたが、USBシリアルコンバータを使う場合はFTDIのICを使ったもので最大3Mbpsの通信をおこなうことが出来ます。

第二の理由は例えばカンマ区切りデータをグラフ表示して簡易オシロスコープ的な使い方をするなど自分が欲しいと思う機能を追加して作業能率を上げることが出来るからです。
そのかわり機能がごちゃごちゃし過ぎて取っつきの悪いソフトになっていることは否めません。

サポートしている通信速度

カンマ区切りデータのグラフ化

マイコンカーラリー printfデバッグ (1) printfデバッグが活躍する時

printfデバッグ vs デバッガ

組込み分野の本格的な開発に必須なツールとみなされているものにインサーキットエミュレータ(デバッガ)があります。
一昔前は安いものでも数十万円、ちょっと本格的なものだと一桁上の金額を用意しないと入手できないものでしたが今はマイコンにデバッグ用のハードウェアが組み込まれるようになり数千円の書き込みツールでもデバッガ機能を使えるようになりました。

このデバッガは専用のデバッガソフトで任意の位置で実行中のプログラムを止めて変数の状態やCPUの内部レジスタの値等を確認できます。
このように一見便利そうなデバッガですが開発の現場でいつも活躍しているかというと、実際にはprintfなどを使って情報をターミナルやLCDに表示するprintfデバッグの方が活躍していたりします。
マイコンカーラリーでよく使われているSDカードに走行時のセンサ情報などを記録して後から解析する手法も広義のprintfデバッグに含まれます。

私がprintfデバッグに使っているJTW32というターミナルアプリはDelphiという開発環境を使い、JTW32の開発では殆どDelphiのデバッガに頼っています。
しかし組込開発の場合はデバッガを使わずにprintfデバッグばかり使います。

ではどうして組込開発ではデバッグ専用のツールであるデバッガよりもprintfデバッグの方が活躍しているのでしょうか、

デバッガの特徴

1.ターゲットボードとデバッガソフトが走るPCを書き込みツール等で接続して使用する。

2.ブレークポイントを設定したところでプログラムを停止し、変数、CPUレジスタ、プログラムカウンタ等の詳細な情報を見ることが出来る。

printfデバッグの特徴

1.ターゲットボードとPCを通信ケーブルで接続し、プログラム中にprintf文を挿入して情報を出力する。

2.プログラム実行中の情報を連続的に観察することが出来る。

デバッグ手法の違い

デバッガはプログラムのステップ送りも出来ますがプログラムを停止してその時点の様々な情報を取り出せるのに対し、printfデバッグでは特定の情報を出力するprintf文を書くことでプログラム実行中の情報を取り出すことが出来ます。

一見、デバッガの方が便利なように見えますしPC上のアプリケーション開発ではデバッガが大活躍してくれるのですが、マイコンカーラリーなど制御プログラムの開発では初期のハードウェアデバッグ以外ではデバッガの出番は無くなってしまいます。
その理由は組込分野の制御プログラムでは、センサから入ってくるダイナミックなデータにどのように対応するかがデバッグ時の主な問題点だからです。
マイコンカーラリーなら走行時に刻々変化するラインセンサからの情報に対してどのように制御パラメータを作っていくかが課題となるためダイナミックなデータ情報こそがデバッグに必要となります。

走行時に限らずスイッチの読み込みや周辺の制御でプログラムリストをいくら眺めても問題解決の糸口が発見できない場合にもprintfデバッグは活躍します。

stm32F765VGT6+STM32CubeMXでfatfsを動かしてみる

SDカードのファイル読み書きに興味があったので最新のCortex-M7マイコンstm32F765VGT6の試用を兼ねてこんな基板を作ってテストしてみました。

基板の実装後STM32CubeMXで新規プロジェクトを作成してSDMMC対応のピンをアクティブにし、クロック等を設定してFreeRTOSとfatfsを追加してTrueSTUDIO対応のプロジェクトを生成し、JDEでプロジェクトを読み込みGCCでコンパイルしたところSDIO回りのプログラムに全く触ることなくあっさり動いてしまいました。

STM32CubeMXのライブラリにはelm-chanが書かれたと思われるとても判り易い日本語マニュアルが入っています。
openocd関連で困ったときにいつもお世話になるブログのねむいさんも技術サポートされているようで、日本発のフリーソフトがグローバルで愛用されているのは嬉しい気分でした。

ただひとつ引っかかったのはSDMMCの設定でSDMMC clock devide factorがデフォルトの0(48MHz/2=24MHz)では書き込みが出来ず、1に設定(48MHz/3=16Mhz)することで動作したことです。
ねむいさんのブログにこの件について触れてあったので最新のstm32F765ならクリアできるかと思っていましたが無理だったようです。
ねむいさんのところには最高クロックで動作するライブラリも置いてあるようですが今回は高速シリアルで送ったデータをSDカードに書き込むだけの用途なので、とりあえずOKとします。

上図の基板を作った背景はマイコンカーラリーでデバッグのために走行データを記録するためです。
マイコンカーラリーではレギュレーションによりマイコンにはR8C/38A(最高クロック20MHz)を使わなければなりません。
R8C/38AでSDカードに書き込むためのライブラリが提供されていますが最高速度3m/s以上で走るためには最低でも1ms単位の正確な制御ループが必要でありSDカードへの書き込み処理で10ms近い処理時間が必要なR8C/38Aのライブラリを使うと走行が不安定になる原因になりますし、1ms単位の記録は不可能です。

R8C/38Aは1Mbps前後の最高通信速度が使えるようなのでシリアル通信で約100kByteのデータを送出することが出来、データ一組を4桁の16進数+’,’として10以内のデータなら1ms単位で記録できることになります。