オリジナルOS「MicrOS」の設計と実装(1) ―― MicrOSの概要とソースの概観

田口 信夫

tag: 組み込み

技術解説 2008年2月 8日

1-4.タスクの動作

● 割り込み時の動作

 システム動作中に発生する可能性のある割り込みには次のものがあります.

  • 正常な割り込み──外部割り込み
            └内部割り込み
  • 異常割り込み

 異常割り込みは,プログラムのミスや電源・メモリの異常などが原因で発生します.異常割り込みは適切に処理しなければなりません.しかしその処理方法はアプリケーション・システムによって異なるので,MicrOSでは処理しません.

 外部割り込みは,周辺機器の状態の変化でRun状態のタスクの有無にかかわらず発生します.内部割り込みはRun状態のタスクがTRAP命令を発行したときに発生します.

 外部割り込みの処理において入り口と出口の共通部分はMicrOSで処理しますが,周辺装置固有の処理はアプリケーション側で用意して,呼び出される構造(関数名はMicrOS側で決めている)になっています(図3).周辺装置固有の割り込み処理で特定のタスクを起動する必要があるときに__activex関数を使います.この関数の中でタスクを切り替える必要があるときは,システム・コントロール・ブロックの中に保存します.周辺装置固有の処理から戻り,割り込みがあったときにRun状態のタスクがなければ,ディスパッチャへ制御を移します.実行中のタスクがあればタスク・スイッチの必要性をチェックして,必要でなければRUN状態だったタスクに制御を戻します.タスク・スイッチが必要なときは,割り込まれたときの状態をTCBにセーブしてReadyに戻されます.

zu03_01.gif
図3 割り込み部の動作

● CA850の割り込み処理をそのまま利用している

 前述の説明で,割り込みの出入り口処理をMicrOSが直接行っていると書きましたが,V850-MicrOSの外部割り込み処理の方法は多少異なっています.これはV850-MicrOSがV850用CコンパイラCA850の外部割り込み処理をそのまま利用しているためです.タスク起動の必要があるときは_activex関数を使う部分まではMicrOS仕様ですが,割り込み処理から戻る直前に__godspio関数をコールします.この関数の中でタスク・スイッチに必要性がチェックされ,不要であればそのまま__godspioをコールした位置に戻ります.この後,CA850の割り込みの出口処理によって割り込まれたタスクに戻ります.タスク・スイッチを行う必要があるときはタスクをReadyに戻しますが,次回に処理を再開するのは__godspioの戻り番地です.TCBにセーブされるCPUはそこに合わせた内容になっています.

● 内部割り込みの使用とレジスタの「非」保存

 システム・コールはタスクの状態を変化させるという点から,「ウェイト系」,「アクティブ系」,「どちらでもない」の3種類に分類できます.「どちらでもない」システム・コールは,処理後はアプリケーション・タスクに戻ります.

 ウェイト系のシステム・コールは,コールしたタスクがWait状態になる可能性のあるものです.アプリケーションの要求に応えられない状態のとき,条件が整うまでコールしたタスクを__wait関数を使ってウェイトさせます.典型的なウェイトの処理は,SCB(後述)にリンクしてから__wait関数をコールする,メモリ・アロケーションやメモリ・ブロックのアサインなどのシステム・コールです.

 アクティブ系のシステム・コールは,ウェイト系のシステム・コールに対応しています.ウェイト系のシステム・コールによってウェイトしているタスクがあり,それを解除する条件が発生した場合,__active関数を使ってそのタスクをReady状態とします.Ready状態となったタスクが__active関数を使用したタスクより高い優先順位を持つとき,タスク・スイッチを行います.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日