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カウンター
カテゴリ
ユーザータグ

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

最新コメント
リンク

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