リアルタイムOSの内部構造を見てみよう!

第02回 TOPPERS/ASPカーネルの仕様解説

前回は,ITRON仕様とTOPPERS/ASPカーネルの概要について見てきました.今回は,ASPカーネルの仕様解説を行います.JSPカーネルから変わっていない内容でも,タスクのスケジュール規則,処理単位,遅延ディスパッチ,コンフィギュレーション手順等,知っておいていただきたい内容については解説しました.
また,ASPカーネルで拡張された,割込み優先度マスクの概念,優先度データキュー機能の概要,割込み処理モデルと割込み管理機能についても解説します.(割込み処理モデルの詳細は後日解説します.)
まず,基本的な用語と、タスクの状態の解説を行います.すでにご存じの方は、とばしてください。

» Read More

.廛螢┘鵐廛謄ブな優先度ベーススケジューリング
優先度の高いタスクが実行可能になると,優先度の低いタスクが実行途中でも,タスク切り替えがおこる.というスケジューリング方法です.
FCFS(First Come First Served)方式スケジューリング
同優先度のタスクは,先に実行できる状態に(実行状態または実行可能状態)になったタスクを先に実行するスケジューリング方法です.
<補足>
・優先度割付けは静的が基本ですが,優先度を動的に変更する機能(chg_pri)も用意されています.

このスケジューリング規則を理解するために,以下の2つの例で説明をします.

1,タスクがプリエンプトされた場合
2,タスクが待ち状態になった場合



1.タスクがプリエンプトされた場合

優先度1のタスクA,優先度3のタスクE,優先度2のタスクB,C,Dがこの順序で起動された後の優先順位を【図2-3】に示します.
今後,優先順位の図の中では,以下のように実行状態のタスクと,実行可能状態のタスクは色で識別します.



;

【図2-3最初の状態の優先順位】





タスクAが終了


次に優先順位の高いタスクBが,実行状態に遷移します.【図2-4】


【図2-4タスクA終了後の優先順位】




タスクAが再び起動


タスクBはプリエンプトされて実行可能状態に戻ります(→プリエンプティブな優先度ベーススケジューリング)が,この時タスクBは,タスクCとタスクDのいずれよりも先に実行できる状態になっていたことから,優先度2の優先順位は変わりません(→FCFS方式スケジューリング).【図2-5】




【図2-5 タスクA起動後の優先順位】


2.タスクが待ち状態になった場合



【図2-6 最初の状態の優先順位】



タスクBが待ち状態になる



タスクの優先順位は,実行できるタスクの間で定義されるため,タスク間の優先順位は次のようになります.【図2-7】


【図2-7 タスクBが待ち状態になった後の優先順位】




タスクBが待ち解除


タスクBは,タスクC,Dのいずれよりも後に実行できる状態になったことから,同じ優先度を持つタスクの中で最低の優先順位となります.(→FCFS方式スケジューリング).【図2-8】



【図2-8 タスクB待ち解除後の優先順位】

処理単位:カーネルが管理するオブジェクトの中で,対応するプログラムがあるもの

処理単位には以下のものがあります.
・タスク
・割込みハンドラ
  割込みサービスルーチン(ISR)
  タイムイベントハンドラ(周期ハンドラ,アラームハンドラ)
・CPU例外ハンドラ
・初期化ルーチン,終了処理ルーチン
 
では,次に各処理単位の優先順位を見ていきましょう.
各処理単位と,ディスパッチャは,次の順序で優先順位が高い仕様となっています.
1.割込みハンドラ
2.ディスパッチャ
3.タスク
(CPU例外ハンドラの優先順位については,ここでは省略します.)

割込みハンドラの優先順位は,ディスパッチャよりも高いことから,割込みハンドラが動いている間は,タスク切り替えは起こりません.これを遅延ディスパッチといいます.
遅延ディスパッチについて,【図2-9】を用いて説明します.



【図2-9 遅延ディスパッチ】

タスクAが実行中に,割込みハンドラAが起動し,さらに割込みハンドラAより優先度の高い割込みハンドラBが起動する多重割込みが発生したとします.割込みハンドラBの中で,現在実行中であるタスクAより優先度の高い,タスクBを実行可能状態にするサービスコールを発行します.この段階でディスパッチャが起動して,タスクBが実行状態になりそうな気がしますが,割込みハンドラはディスパッチャより優先順位が高いですから,すべての割込み処理が終了するまで,ディスパッチャの起動は保留されます.すべての割込みハンドラの処理が終了してはじめて,ディスパッチャが起動し,タスクBが実行状態になります.このように,割込みハンドラ起動中に,ディスパッチャの起動が保留されることを遅延ディスパッチといいます.
4-1 コンテキスト

区別すべきコンテキストは,タスクコンテキストと,非タスクコンテキストの2つです.
タスクコンテキストとは,タスクの処理の一部とみなすことができるコンテキストの総称です.
非タスクコンテキストとは,タスクコンテキストに含まれないコンテキストの総称で,割込みハンドラやCPU例外ハンドラなどが含まれます.
この2つの違いを実装上の違いと,仕様上の違いから見ていきましょう.
まず,実装上大きく違う点は,タスクコンテキストはそれぞれ自分のスタックを持っていて,それを使います.それに対して,非タスクコンテキストは,全体でひとつのスタックを共有して使っています.
次に,仕様上違う点ですが,タスクは待ち状態に入ることができますが,非タスクコンテキストは,待ち状態に入らない仕様です.(非タスクコンテキストは状態を持ちません.)割込みハンドラなど非タスクコンテキストは,起動したらとにかく処理を最後までやりとおす事が使命です.したがって,非タスクコンテキストからは,待ち状態に入るようなサービスコールは呼び出すことができません.このようにタスクコンテキストと非タスクコンテキストでは,呼び出せるサービスコールが違います.

4-2 システム状態

CPUロック状態
すべての割込み(カーネルの管理外のものを除く)が禁止され,ディスパッチも起こりません.

▲妊スパッチ禁止状態
ディスパッチが起こらない状態です.割込みは発生します.

3箙み優先度マスク 
これも,ひとつのシステム状態で,ASPカーネルで拡張された点です.(TOPPERS標準割込み処理モデル(後日解説予定)に準拠)
割込み優先度マスクという変数値を,常にOSが保持していて,この値より高い優先度の割込みのみを受け付けます.
この割込み優先度マスクが0の時,これはいずれの割込みもマスクされない状態で,「割込み優先度マスク全解除状態」といいます.
割込み優先度マスクが0でないときは,いずれかの割込みを受け付けない状態です.そして,この割込み優先度マスク全解除状態でない時というのは,自分をその優先度まで引き上げたことと同じ意味合いになります.【図2-10】つまり,割込みの一部を禁止したということは,割込みよりさらに優先度の低いディスパッチもおこりません.



【図2-10 割込み優先度マスク 2の状態】

ぅ妊スパッチ保留状態
何らかの理由で,ディスパッチが起こらない状態のことです.以下の4つの場合にディスパッチ保留状態になります.
・非タスクコンテキスト実行中
・CPUロック状態
・割込み優先度マスクが全解除状態でない
・ディスパッチ禁止状態
基本的に,サービスコール名はxxx_yyyという形式です.xxxは操作方法を表し,yyyは操作対象を表します.たとえば,act_tskといった具合です.その他には,zxxx_yyyという形のサービスコールもあります.たとえば,非タスクコンテキストから呼び出すためのサービスコールは先頭にiをつけることで,タスクコンテキストから呼び出せるサービスコールと区別しています.(例.iact_tsk)
その他には,先頭にp,tがついたサービスコールもあります.
(例)
rcv_dtq  :データキューからの受信
prcv_dtq :データキューからデータを受信しにいき,データがなければ待ち状態にならずに戻ってくる.
trcv_dtq :データキューからデータを受信しにいき,データがなければ待ち状態になり,指定時間を超えると戻ってくるタイムアウト機能付き.

静的APIは,オブジェクトの生成情報や,初期状態などを決めるために,システムのコンフィギュレーションファイル中に記述します.
サービスコール(全部小文字で表現)と同等の機能を持つ静的APIは,サービスコール名を大文字とした名称とし,パラメータも同一としています.このようにできるだけ,わかりやすく,サービスコールと静的APIの両方を覚えなくてもいいような方針で作成されています.

静的APIの例
CRE_TSK(ID tskid,{ATR tskatr,VP_INT exinf,FP task,PRI itskpri,SIZE stksz,VP stk}});

CRE_TSKに対応するサービスコール
ER ercd = cre_tsk(ID tskid,T_CTSK *pk_ctsk);
サービスコールでは,様々な属性を格納した構造体へのポインタを引数にしていますが,静的APIでは,構造体の属性をそれぞれ引数としています.これは,静的API発行時には,構造体の実体がまだメモリ上にないからです.
コンフィギュレーションは,コンフィギュレータが行います.
システムコンフィギュレーションファイルに,必要なオブジェクトを生成するための,静的APIを記述します.それをコンフィギュレータが解読し,カーネル構成・初期化ファイルおよびヘッダファイルを自動生成します.



カーネル構成・初期化ファイルには,タスク初期化ブロック(後日詳細を解説します.)などが定義されます.一方,ヘッダファイルには,自動的に割り振られたオブジェクトIDのマクロが生成されます.このヘッダファイルをインクルードすることで,直接的にID番号を指定するのではなく,マクロを使用してサービスコールを発行できます.
(例 act_tsk(TASK1))
ASPカーネルには以下の機能があります.

タスク管理機能
タスク付属同期機能
タスク例外処理機能
同期・通信機能
セマフォ,イベントフラグ,ミューテックス
データキュー,優先度データキュー,メールボックス
メモリプール管理機能
固定長メモリープール
時間管理機能
システム時刻管理,周期ハンドラ,アラームハンドラ
システム状態管理機能
割込み管理機能
CPU例外管理機能
システム構成管理機能

ここでは,ASPで新たに取り入れられた,優先度データキューと割込み処理モデルについて解説します.

<優先度データキュー>
優先度データキューは,データに優先度をつけることができます.データを優先度順に並べ替えて保持しています.

ここで,ASPで新たに,優先度データキューが取り入れられた経緯をお話しします.
まず,メールボックスという機能があります.これは,データキューと違って,可変長のメッセージを送るための機能です.送るデータが可変長ですので,送り側でメッセージ領域を用意し,そのポインタを送る方式です.その送信側が用意する領域の中に,カーネルがリンクに用いるための領域があります.そのアプリケーションが用意した領域をカーネルがリングバッファのようにつないでいくといったことをしています.
このような仕組みですから,メールボックスはデータキューと違って,フルにならない(送信側が待ち状態にならない)というメリットがあります.一方で,このアプリケーションで確保した先頭の領域をカーネルが使用するので,アプリケーションが誤ってこの部分を書き換えてしまうと,カーネルの中で無限LOOPに陥る可能性があります.保護機能拡張仕様では,このようなことが発生しては問題ですので,同じ仕様ではメールボックスの機能を,そのまま採用できません.そのため,μITRON4.0仕様,保護機能拡張(PX仕様)では,カーネルの用いる管理領域を分離するように,メールボックス仕様を変更しました.つまりアプリケーションで用意した先頭数バイトを使わずに,カーネル内にあらかじめ用意した領域を使うようにしたわけです.しかし,そうすると従来のメールボックスと互換性がなくなります.たとえば,メールボックスがフルになって送信側が待ち状態になることがあります.つまり,snd_mbx(メールボックスの送信サービスコール)の振る舞いが変わってきてしまうのです.
今後メモリ保護機能付きカーネルもASPを拡張する形で作成する予定ですので,ASPカーネルではメールボックスはそのままの仕様で残します(使用は推奨しない)が,優先度付きで送ることができる機能を別に作ろう.ということで優先度データキューが追加されました.

<割込み処理モデルと割込み管理機能>
割込みが発生すると,カーネル内の出入り口処理を経由して,アプリケーションが登録した割込みサービスルーチン(ISR),または割込みハンドラが呼び出されます.ISRや割込みハンドラはタスクよりも優先して実行されます.アプリケーションでは,プロセッサの割込みアーキテクチャに依存せずに記述できるISRを用意するというのが,基本的な使用方法です.ISRを使用すると,プロセッサのアーキテクチャを詳細に知らなくても割込みプログラムを記述できます.たとえば,割込みを,レベルトリガにするかエッジトリガにするかの選択をどのレジスタに設定するか.を知らなくても,割込みを設定できます.ISRが使用できないような特殊な場合には,割込みハンドラを使用するという使い分けをします.

割込み管理機能のAPI
DEF_INH : 割込みハンドラの定義
ATT_ISR : 割込みサービスルーチンの登録 
CFG_INT : 割込み要求ラインの属性の設定
→割込み要求ラインの優先度,レベルトリガかエッジトリガか,初期状態で割込みをマスクするか.などを指定できる.
DEF_ICS : 非タスクコンテキスト用のスタックの設定
dis_int : 割込みの禁止
ena_int : 割込みの許可
chg_ipm : 割込み優先度マスクの変更  
get_ipm : 割込み優先度マスクの参照


割込み処理モデルについては,後日詳細を解説します.


次回は,実装にあたってのもう少し具体的な方針についてお話します.