ミッドレンジマイコンでマルチタスク

処理性能がさほど高くないミッドレンジのマイコンを利用して、時間的要求がさまざまなタスクを上手に処理しようとする場合、単純なメインループ(+割り込み)のアーキテクチャでは苦しくなることがあります。
具体的には、私がここ数週間取り組んでいたWEM菅生用電気自動車のデータロガーの設計方針の失敗談です。

そういえば、大体似たようなことを以前senshu先生の掲示板に書きました。
少ピンマイコン用組込みOSのメリット


ごめんなさい


数週間ほど、私はWEM菅生に向けてデータロガーを設計・製作していましたが、ちょっとだらだらとしすぎて、完成に至りませんでした。単純にやる気と時間が不足していただけと言う話もありますが、電気自動車に全く興味が無い人にとっても読んでもらえるように概念的な話を書きます。

ロガーの仕様


電気自動車レース用データロガーなので、最低限計測しなければならないデータは「速度」「ラップタイム」「電流」「電圧」です。レギュレーションは2時間耐久レースに分類されるものなので、スタートからの「経過時間」も必要です。
これらのデータをドライバーが読み取れるように「表示」し、ログとしてメモリに「保存」する。これが、ロガーの仕様の核です。

ラップタイマと速度計はレシプロカル方式の周波数カウンタのようなものなので、エッジの検出からタイマの読み込みまでのタイムラグはできるだけ小さい方が好ましいです。このため、ラップタイマと速度計のプログラム全体の中での時間的要求(優先度)は最高です。

ADCのサンプリングレートは、1~10sps程度の超低速でかまわないので、優先度は高くありませんが、取りこぼしがあっては困ります。また、ドライバーのための表示器の更新レートは、「経過時間」の表示を0.1s単位まで見せるとすると、10HzとなるのでADCのサンプリングレートと同等となります。

メモリは、何を使ってもよいのですが、あとでPCをつかって処理することを考えると、SDカードにFATファイルシステムを使って書き込むのがポピュラーです。SDカードにSPIモードで書き込むのはかなり遅いので、ADCのサンプリングや表示機の表示のタスクをSDカーへの保存タスクよりも、一段階優先度を上げたいと考えます。

そんなわけで、優先度の割り振りは以下の三段階となりました。

  1. 速度計・ラップタイマ・経過時間
  2. ADC・表示機への表示
  3. ログデータの保存


優先度に応じたCPUの割り振り


すべてのタスクの優先度が高くないプログラムの場合は、単純にメインループの中ですべての処理が賄えます。

この単純なアーキテクチャに加えて、少数の高優先度のタスクがあるアーキテクチャでは、高優先度のタスクを割り込み処理とすれば、上手に処理することができます。
このメインループ+割り込みのアーキテクチャでは、優先度が上位と下位の2種類に分けられる場合に使われます。

これらの2パターンは、マイコンのプログラムをしている人なら無意識のうちにやっている手法です。そして、多くの場合これだけでうまく処理ができます。更に言うなら、これらの2パターンでうまく処理できるようにシステム全体を考える方が、難しいことをするより多分楽です。

しかし今回のロガーの例では、優先度が3段階必要なので、なんとか上手くごまかさなければなりません。以降は上手くごまかすための方法を思いつく限り列挙しました。

多重割り込みアーキテクチャ


多重割り込み機能を持ったマイコンを選べばスマートに実装できます。
上位割り込み・下位割り込み・メインループで三段階の優先度を賄うことができます。

実を言うと、以前PIC18F452を使って失敗しました。
多重割り込みに関してエラッタが出ていたことに気づかなかったのです。
以下、PIC18FXX2 Rev. B2 Silicon/Data Sheet Errataからの引用です。

4. Module: Interrupts
Under certain conditions, the use of dual priority
interrupts may cause a program instruction to be
skipped entirely. This has only been observed
when both of the following apply:
  • Both high and low interrupts are enabled, and
  • A high priority asynchronous interrupt occurs in

the following cycle after any low priority
interrupts.
The event causes the stack to get pushed twice,
and will eventually result in an overflow.


とはいえ、これは多重割り込みが正常に動作するマイコンなら、上手くいくはずの方法です。

ハードウエアで処理する


今回のロガーの例では優先度の高い処理は、処理内容自体は単純なもので、速度計・ラップタイマともに、トリガ信号を検出した瞬間のタイマの値をキャプチャするだけです。
ハードウエアの処理だけで、最高の優先度の処理を賄ってくれるのなら、CPUはそれ以外の2段階の優先度を持つプログラムだけですみます。

今回はPSoCのデジタルブロックにその役割を果たしてもらおうと考えていました。
できなかったのは単純に私の実力不足だと思います。

複数のCPUで処理する


優先度の異なる処理の一部を、他のハードウエアに分担してもらうと言う考え方自体はひとつまえの「ハードウエアで処理する」と同じです。処理の一部を他のマイコンに負担してもらうことを考えます。

今回の例で言うならば例えば、一番処理が重いSDカードへの書き込み処理を別のマイコンへ追い出します。メインのマイコンでは、データのサンプリング等を行い、書き込むべきデータを書き込み専用の別のマイコンにシリアル通信で送ります。

プログラマーの能力と言うのが、どれだけ限られたりソースに対して処理を詰め込めるのかで決まるのだとすれば、この方法は一番初級者でも上手くいく方法であろうと思います。

リアルタイムマルチタスクOS


マルチタスクOSというとずいぶんと大層に思えますが、PIC16F程度の単純なマイコンでは、ちょっと処理の単位をタスクとして意識しながらメインループを組むだけでもそれらしいものになります。2ちゃんねる電気・電子板のPICにOSは必要か?のはじめの方(PIC16Fより高度な18,24,32,dsPIC等がメジャーになる前)の書き込みはこの考え方のエッセンスです。

ただし、多重割り込み機能もスタックへのユーザによる操作もできないPIC16Fの場合は、タスクが自発的にタスクスイッチャへの復帰をすることが要求されます。
結局のところ、1つのタスクが長時間CPUを拘束してしまうと、リアルタイム性が失われてしまいます。この問題に対して、PICで有名な後閑哲也さんのPICROSをみると、タスクを複数のステージに分割することで1つのタスクが長くなりすぎないようにしているようです。とはいうものの、このステージの分割は人間がコーディングの段階で行わなければならないことなので、OSを使う/使わないの問題とは余り関係がありません。

参考URL




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。


tag: PIC PSoC 

comment

Secret

No title

引き受けておきながら凸凸も信頼性抜群に悪くてごめんなさいmm

現役時代とちがって、車体も離れたところにあるし
一人作業になってしまうから
「やる気」の継続も思いのほか大変なんだよね

グリッドスタートで1週以上する動画を撮りたいので、来年もやろうかなーっとは思ってるけど

Re: No title

のさん、こんばんは。

回路に取り組む前に、エネマネとか、バッテリの特性とか、作戦とかについて教えて欲しいなと思ったり思わなかったり・・・です。

インプット・キャプチャ

この部分だけコメントします。

> エッジの検出からタイマの読み込みまでのタイムラグはできるだけ小さい方が好ましいです。

フリースケール社のMCUに内蔵されているタイマの場合は、エッジを検出した時刻を記憶する「インプット・キャプチャ」という機能があります。時刻は、タイマ・チャネルごとに個別のレジスタに記憶されていますので、後からゆっくりと確認することができます。もちろん、エッジの発生と同時に割り込みも発生しますが、エッジの発生が頻繁でなければ、ポーリングでも対応できると思います。
こういう機能って、普通だと思っていたのですが、標準的な仕様ではないのかな?
他のMCUの勉強もしなくちゃね。

Re: インプット・キャプチャ

のりたんさん、おはようございます。

インプットキャプチャの機能は、PSoCにも間違いなく存在するはずです。私が上手いこと使えなかっただけで・・・。
ただ、古~いPIC(例えばPIC16F84Aなど)にはインプットキャプチャが無いものもあるようですね。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCOPアンプPICCPA強磁性常微分方程式モンテカルロ解析odeトランジスタ状態密度インターフェーススイッチング回路ecaljPDS5022DOS定電流半導体シェルスクリプト乱数レベルシフトHP6632Aブレッドボード分散関係温度解析R6452Aトランジスタ技術I2C可変抵抗反強磁性セミナー数値積分確率論偏微分方程式バンド構造非線形方程式ソルババンドギャップ絶縁熱設計シュミットトリガLEDA/Dコンバータ三端子レギュレータLM358ISO-I2CGW近似カオスフォトカプラマフィンティン半径TL431数値微分PC817Cアナログスイッチ直流動作点解析発振回路USBサーボカレントミラー74HC4053パラメトリック解析LDAbzqltyチョッパアンプ量子力学FFT2ちゃんねるアセンブラBSch開発環境電子負荷ブラべ格子イジング模型補間基本並進ベクトル標準ロジック単振り子キュリー温度繰り返しMaxima状態方程式失敗談相対論スピン軌道相互作用FETランダムウォーク熱伝導六方最密充填構造コバルトewidthTLP621GGAQSGW不規則合金位相図抵抗SMPcygwinラプラス方程式スレーターポーリング曲線gfortranスイッチト・キャパシタ詰め回路TLP552三角波格子比熱TLP521条件分岐LM555MCUNE555QNAPマントルテスタ過渡解析FXA-7020ZRダイヤモンドデータロガーガイガー管自動計測Writer509UPSシュレディンガー方程式ブラウン運動awk差し込みグラフ熱力学平均場近似仮想結晶近似VCAfsolve井戸型ポテンシャルVESTA起電力スーパーセルOpenMP第一原理計算ubuntu固有値問題L10構造OPA2277interp12SC1815fccウィグナーザイツ胞面心立方構造フィルタジバニャン方程式ヒストグラム確率論マテリアルデザインspecx.f等高線正規分布PGAフェルミ面非線型方程式ソルバ初期値固定スピンモーメントスワップ領域ルチル構造リジッドバンド模型edeltquantumESPRESSO岩塩構造BaOSIC二相共存ZnOウルツ鉱構造フォノンデバイ模型c/aノコギリ波全エネルギーFSMTeXgnuplotmultiplotハーフメタルCapSense半金属合金結晶磁気異方性Ubuntu文字列入出力TS-110TS-112疎行列Excel直流解析ヒストグラム円周率不規則局所モーメントトラックボールPC等価回路モデルパラメータ・モデルキーボードRealforce三次元マンデルブロ集合フラクタル化学反応重積分縮退日本語最小二乗法関数フィッティングGimpMAS830LHiLAPW熱拡散方程式両対数グラフナイキスト線図負帰還安定性陰解法Crank-Nicolson法P-10クーロン散乱境界条件連立一次方程式片対数グラフEAGLEPIC16F785LMC662トランスシンボルCK1026線種凡例MBEAACircuitグラフの分割軸ラベルifort

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ