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強磁性OPアンプPICCPA常微分方程式モンテカルロ解析ecaljodeトランジスタ状態密度インターフェースDOS定電流スイッチング回路PDS5022半導体シェルスクリプトレベルシフト乱数HP6632AR6452AI2C可変抵抗分散関係トランジスタ技術ブレッドボード温度解析反強磁性確率論バンドギャップセミナー数値積分熱設計非線形方程式ソルババンド構造絶縁偏微分方程式ISO-I2CLM358フォトカプラ三端子レギュレータカオスLEDシュミットトリガGW近似A/Dコンバータ発振回路PC817C直流動作点解析USBマフィンティン半径数値微分アナログスイッチTL43174HC4053カレントミラーサーボ量子力学単振り子チョッパアンプ補間2ちゃんねる開発環境bzqltyFFT電子負荷LDAイジング模型BSch基本並進ベクトルブラべ格子パラメトリック解析標準ロジックアセンブラ繰り返し六方最密充填構造SMPコバルトewidthFET仮想結晶近似QSGW不規則合金VCAMaximaGGA熱伝導cygwinスレーターポーリング曲線キュリー温度スイッチト・キャパシタ失敗談ランダムウォークgfortran抵抗相対論位相図スピン軌道相互作用VESTA状態方程式TLP621ラプラス方程式TLP552条件分岐NE555LM555TLP521マントル詰め回路MCUテスタFXA-7020ZR三角波過渡解析ガイガー管自動計測QNAPUPSWriter509ダイヤモンドデータロガー格子比熱熱力学awkブラウン運動起電力スーパーセル差し込みグラフ第一原理計算フェルミ面fsolve最大値xcrysden最小値最適化ubuntu平均場近似OpenMP井戸型ポテンシャルシュレディンガー方程式固有値問題2SC1815結晶磁気異方性OPA2277非線型方程式ソルバTeXgnuplot固定スピンモーメントFSMPGAc/a全エネルギーfccフラクタルマンデルブロ集合正規分布縮退初期値interp1multiplotフィルタ面心立方構造ウィグナーザイツ胞L10構造半金属二相共存SICZnOウルツ鉱構造BaO重積分クーロン散乱磁気モーメント電荷密度化学反応CIF岩塩構造CapSenseノコギリ波デバイ模型ハーフメタルキーボードフォノンquantumESPRESSOルチル構造スワップ領域リジッドバンド模型edelt合金等高線線種凡例シンボルトラックボールPC軸ラベルグラフの分割トランス文字列CK1026MAS830L直流解析Excel不規則局所モーメントパラメータ・モデル入出力日本語最小二乗法等価回路モデルヒストグラムGimp円周率TS-110TS-112PIC16F785LMC662三次元specx.fifortUbuntu疎行列不純物問題Realforceジバニャン方程式ヒストグラム確率論マテリアルデザインP-10境界条件連立一次方程式熱拡散方程式AACircuitHiLAPW両対数グラフ片対数グラフ陰解法MBEナイキスト線図負帰還安定性Crank-Nicolson法EAGLE関数フィッティング

最新コメント
リンク

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