スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


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

処理性能がさほど高くないミッドレンジのマイコンを利用して、時間的要求がさまざまなタスクを上手に処理しようとする場合、単純なメインループ(+割り込み)のアーキテクチャでは苦しくなることがあります。
具体的には、私がここ数週間取り組んでいた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カウンター
カテゴリ
ユーザータグ

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

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。