テンプレート使用法(2):分析とテンプレート組込み

第2回は、LCDアプリ分析とテンプレートへの追加方法の説明です。

ドライバとアプリ分離:先ず、LCD制御ソフトを、ドライバ処理とアプリケーション処理(以後アプリ処理と略す)に分けて考えます。ドライバ処理とは、制御対象がLCDコントローラのソフトです。アプリ処理は、ドライバ処理を使ってLCDに出力する文字列を設定するソフトのことです。

LCDドライバ処理:LCD表示を行うには、マイコンピン初期設定、LCDコントローラのパワーオン処理、LCDコントローラ初期設定、LCD表示データ書込みの4種の処理が必要です。そこで、各処理をそれぞれ関数化し、条件によりこの4ドライバ関数に分岐します。これらのドライバ処理をテンプレートへ組込むと、下図(左側)のようになります。

LCDアプリ処理:ドライバ処理で準備が完了したLCDコントローラに対して、LCDで表示する文字列を設定する関数です。コンローラ準備完了判断や、通常表示と、エラーを表示する場合などの条件で分離することを考慮すると、下図(右側)のようになります。

ポータル関数の構成
ポータル関数の構成

ドライバ処理もアプリ処理も、テンプレートへ組み込む形は同じです。ポータル関数でインタフェースRAMの値によって条件分離し、各イベント処理を実行します。各イベント処理後にインタフェースRAM値を変更し、次回の条件分岐に備えます。

インタフェースRAM:関数間の変数をRAMに展開したものをインタフェースRAMと呼びます。RL78/G13やG14には、アクセス頻度が高い変数は、ショート・ダイレクト・アドレッシングsreg領域(FFE20~FFEB3 の147バイト)へ配置すると高速化が図れます。引数で記述する場合に比べ、関数単体デバックが簡単になるメリットがあります。

処理が遅い周辺回路の対処:最近のマイコンは高速動作です。しかし、LCDコントローラなどの周辺回路は、マイコン動作に比べ、とても遅いという問題があります。この遅さに対して、マイコンのポーリングや割込みを使う方法で解決できます。しかし、今回のLCD接続は、リード動作ができないので、これらは使えません。第2の方法は、周辺回路動作完了まで、マイコン側の処理に待ち時間を入れる方法です。サンプルプログラムなどでは、この方法を多く用います。マイコン処理は簡単ですが、無駄に時間を消費しますので、高速マイコンに効果的な方法とは言えません。

第3の方法が、タイムシェアリングを使う方法です。周辺回路の動作を設定した後は、マイコンに別処理を行わせ、周辺回路の処理が完了したころを見計らってさらに追加処理をする方法です。第2の方法より、効率的にマイコンを使えますが、処理完了のころあいを見積もることが大切です。見積もりが上手くいけば、多重処理ができるので、高速マイコンの特長を活かせたソフトができます。リアルタイムOSも、簡単に言うとこの方法を使っています。プログラマの処理完了の見極めが不要で、タスク切換えをOSが行ってくれます。が、それなりの大容量RAMが必要で、4MB程度のRAMでは足りませんし、使いこなしの知識や経験も必要です。また、無料OSもありますが、有料版はコストアップになります。

タイムシェア間隔固定:提供テンプレートは、タイムシェアリング間隔が、予め決まっています。ドライバ処理起動用に、250ms/1ms/10ms/100ms/1s、アプリ処理起動用には、1ms/10ms/100ms/1sです。つまり、この間隔で、遅い周辺回路の処理完了を見積もって、割り振れば良い訳です。間隔が決まっていますので、リアルタイムOSよりは効率が下がりますが、オーバーヘッドは少なくなります。

LCDコントローラの場合は、パワーオン処理に5ms、表示クリアに1.64ms、その他の処理に40us(いずれも最大値)が必要です。そこで、ドライバ処理のポータル関数は10ms間隔、アプリ処理のポータル関数は1s間隔に割り振りました。40usの処理待ちは、タイムシェアリングせずに、時間消費で対応しました。テンプレートに組込んだドライバポータル関数を下図に示します。

テンプレートへ組込んだドライバポータル関数
テンプレートへ組込んだドライバポータル関数

リアルタイムOSに比べれば効率が低下しますが、テンプレートは、少ないRAM使用量で、高速マイコンの特徴を活かした多重処理を、簡単に実現できることが判ると思います。

コメントを残す