スポンサーサイト

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


PIC16FのためのリアルタイムOSという妄想

ミッドレンジマイコンでマルチタスクを書いていたら、黒歴史を思い出しました。私はPIC16FのためのマルチタスクOSをアセンブリ言語で開発してやろうと考えていた時期があるのです。

その目論見は、当然のことながらPIC16Fの絶対的なリソース不足の前にもろくも崩れ去りました。まあ、高性能CPUのためのオペレーティングシステムなら開発できるのかと言われれば、やはりそんな事はないのですが。


組み込みOSのリアルタイム性


パソコンの数値計算プログラムなどは、その処理速度が速ければ速いほど優れており、高速に計算を終えるため、かたやCPUの処理性能向上、かたやアルゴリズムの改良と地道な努力が続けられています。

一方で、組み込みマイコンプログラミングでは、処理速度が高速であること以上に、確実に所定の時間内に処理が完了することが重要視されます。
言い換えれば、一定時間以内に処理が完了することさえ確実ならば、早く終わらせてしまっても意味が無く、複数のタスクを処理している最中に高優先度のタスクの要求が発生したならば、「すぐに」処理が行われることに重点をおくことが多いと言うことになります。

この「すぐに」というのが「リアルタイム性」と言うことですが、当然ながら「本当に全く間をおかずに」処理を開始することなど不可能です。
そんなわけで、最高優先度のタスクが発生したら、最悪でもX秒以内にそのタスクを開始することを保証する、というのが現実的なリアルタイムOSの役割です。(このX秒の部分がオペレーティングシステムの処理による遅延です。当然短い方が優秀なOSと言うことになります。)

背景にある思想


他の処理をしている最中に、その処理を無理やり中断して別の処理を開始するためのメカニズムはPIC16Fに関しては割り込み以外ありえません。優先度の2段階以下であれば、メインルーチンと割り込みでうまく処理できること、3段階以上ならば多重割り込みが必要になることはミッドレンジマイコンでマルチタスクでも書きました。

PIC16Fは、多重割り込みをサポートする機能を有してはいませんが、割り込みルーチンの内部で、明示的に割り込みを許可することにより多重割り込みのようなことが出来ます。
この考え方を用いて、割り込みルーチンの中に優先度の順にフラグをポーリングするタスクスイッチャを実装すれば、多段階の優先度をサポートするオペレーティングシステムもどきが作れるはずです。

実装


未完成のコードを以下に示します。ファイルの更新日付を信じるならば、"main.asm"の最後の更新は2007年1月1日でした。2年半前の私は正月にもかかわらずご苦労なことです。

現状、人様に見せられる状態ではない上、たぶん、煮ても焼いても食べられません。しかし、これ以上、手をつけるつもりも全く無いので公開してしまいましょう。"macro.inc"のアスキーアートなど我ながら涙ぐましくもあります。



当然バグもたくさんあるでしょう。探す気も起きませんし、報告していただいてもなおす気も起きません。(それ以前に未完成ですが。)

動作に関して、タスクスイッチャの基本的な部分は、後閑哲也さんのPICROSをまねしようと思っていた記憶がかすかにあります。マクロとして定義してあるので、タスクの数だけ展開して使います。

クロック周波数や電源電圧等の回路定数を設定するためのインクルードファイル的なものもあったような気がするのですが、ハードディスクの中に見当たりませんでした。

何故かシリアル送受信は、内部モジュールを使わずにソフトウエアで実現しようとしていたようです。受信時に3入力の多数決をとるコードを書いたような気がするのですが、これも見つかりませんでした。

ひょっとしたら、発掘したソースコードは最新のものではないのかもしれません。

問題点


結論から書くと、PIC16Fは絶望的にRAMが足りません。

最初に限界を迎えるであろうことが予想されるリソースは、ハードウエアスタックでした。
なぜならば、システムの根幹を支えるのが擬似多重割り込みであり、割り込み1つに対してスタックを1つ消費するからです。
PIC16Fのハードウエアスタックは8段階までしかなく、PUSH/POPに類する命令が一切存在せず、プログラムからスタックに干渉する手段が無いため逃げ場もありません。

このハードウエアスタックをすべて割り込み(タスクスイッチャ)のために使うことを考えると、サブルーチンの戻り番地は他の汎用レジスタに保存する必要があります。そこで、汎用レジスタをソフトウエアスタックとして使うためのマクロをいくつか書き、CALL/RETURNの代用としてJUMP/BACKというマクロを書きました。

"charlcd.asm"や"7seg.asm"などはJUMP/BACKで書いたサブルーチンのサンプルです。

しかしながら、非割り込みサブルーチンの戻り番地をPICの汎用レジスタ(RAM)に保存するとしても、ハードウエアスタックが8段階しかないと言う事実は変わりません。また、スタック構造を実装したおかげで、汎用レジスタ(RAM)もどんどん使われてしまいます。
オペレーティングシステムの基礎の勉強などしたことが無い素人目にも、リソースの管理が必須であることは自明でした。

では、どうやってリソースを管理するか?セマフォ?メッセージ渡し?
リソースが足りないがために、リソース管理をしなければならないのに、そのリソース管理にリソースが必要なんて・・・と思ったあたりで、バカバカしさが限界を迎えました。

大切なのはバランス感覚


なんというか、「ぼくのかんがえたさいきょうのがんだむ」的な痛さ・恥ずかしさを感じます。肝心なのは目標を達成すること、そのために合理的な手法は何であるか考えること、そのことを見失ってはいけません。

ネット上の質問掲示板では、「出来る限り低ノイズの電源」だとか「限りなく低ひずみの発振器」だとか言う荒唐無稽な書き込みをよく見かけますが、これもその類です。頑張ったけど要求された性能を満たさなかったというのはあきらめるほかありませんが、要求された性能を過剰に超える性能のものを作っても疲れるだけです。

そう考えると、後閑哲也さんのPICROSはよく出来ています。本当に感心します。

さて、汎用的なオペレーティングシステムは誇大妄想でしたが、割り込みルーチン内でわざと割り込み許可を行う手法自体は有用です。電気自動車用データロガーもこの手法を用いればプログラムだけで3段階の優先度を処理できると思います。

最後に


最後になりましたがお礼を。ミッドレンジマイコンでマルチタスクで2009-09-01に非公開でコメントを下さった方、内容には触れませんが、ありがとうございます。

関連エントリ




参考URL




フィードバック



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

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


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


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


tag: PIC 

comment

Secret

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度モンテカルロ解析常微分方程式トランジスタodeDOSインターフェースPDS5022定電流スイッチング回路分散関係半導体シェルスクリプトレベルシフト乱数HP6632A可変抵抗トランジスタ技術R6452AI2C温度解析ブレッドボードバンドギャップ確率論反強磁性セミナーバンド構造数値積分偏微分方程式非線形方程式ソルバ熱設計絶縁三端子レギュレータISO-I2CA/DコンバータシュミットトリガフォトカプラカオスPWscfGW近似LM358LEDマフィンティン半径発振回路USB数値微分TL431PC817Cサーボアナログスイッチ直流動作点解析補間カレントミラー74HC4053bzqltyチョッパアンプFFT2ちゃんねる開発環境量子力学単振り子電子負荷VESTAQuantumESPRESSO標準ロジックパラメトリック解析ブラべ格子イジング模型アセンブラLDA基本並進ベクトルBSchSMPTLP621失敗談六方最密充填構造コバルト位相図QSGWGGAスイッチト・キャパシタewidth状態方程式VCAキュリー温度繰り返し最適化仮想結晶近似不規則合金熱伝導gfortran相対論抵抗FETMaximaQuantum_ESPRESSOcygwinランダムウォークラプラス方程式スピン軌道相互作用スレーターポーリング曲線マントルシュレディンガー方程式ZnO自動計測QNAP固有値問題ダイヤモンドデータロガー井戸型ポテンシャルTLP552CIFxcrysdenゼーベック係数熱力学条件分岐MCU最小値UPS格子比熱最大値ガイガー管平均場近似過渡解析Writer509スーパーセルFXA-7020ZR差し込みグラフ第一原理計算テスタ起電力OpenMP三角波ubuntuLM555NE555ブラウン運動詰め回路ハーフメタルawkfsolveUbuntuフェルミ面TLP521トランスMAS830LPGACK1026OPA2277フィルタトレーナーバトルEAGLEノコギリ波負帰還安定性ナイキスト線図MBEP-10LMC6622SC1815CapSenseAACircuitPIC16F785入出力固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式ヒストグラム確率論初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型磁気モーメント電荷密度重積分SIC不純物問題擬ポテンシャル状態図cif2cellPWgui二相共存ウルツ鉱構造edeltquantumESPRESSOフォノンリジッドバンド模型スワップ領域BaO岩塩構造ルチル構造マテリアルデザインspecx.fフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデル文字列ポケモンGO熱拡散方程式HiLAPW両対数グラフ片対数グラフ陰解法Crank-Nicolson法ifort境界条件連立一次方程式グラフの分割軸ラベルヒストグラム不規則局所モーメントスーパーリーグ円周率Gimp凡例線種シンボルトラックボール

最新コメント
リンク

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