SSブログ

Smalight OSを使おう 4タスク目 タスクの状態遷移 [Smalight OS]

この記事は、某SNSで書いているものを転載しています。

前回サンプルマニュアルを取得してもらったかと思いますが、その中の「図2-2 タスクの状態遷移図」を見て下さい。
状態は、READY、RUN、WAIT、WAIT-SUSPEND、SUSPENDが有りますが、これは勿論ITRON仕様の
READY、RUNNING、WAITING、WAITING-SUSPENDED、SUSPENDEDに該当します。(状態を表す言葉なので、ITRON仕様の記述の方が用語としては正しい。SUSPENDは、するのではなくされる側なのでSUSPENDED、走っているのでRUNNING等ね。)

更に大きな違いはITRON仕様には存在するDORMANTが無い点です。DORMANTは、タスク生成情報は存在するが、カーネル管理下には無い状態で、それはつまりカーネルにとっては存在しないタスクとする事が出来ます。
但し何時でもact_tskやsta_tskでカーネルの管理下に置かれ、READYやRUNNING状態になる事が出来ます。

DORMANTとWAITを比較しますと、WAITでは必要ならばスケジューラの中で該当タスクの管理情報が読み込まれ、WAITを継続するのか、READYに遷移するのか判断されます。
しかしDORMANTであれば、存在しないタスクの管理情報は検索されず、結果その分だけカーネルの動作が軽くなります。

なぜDORMANTを採用しなかったのか?、勿論実装上の問題だと思いますが、その分だけペナルティにもなる事をご承知ください。まあ実装する時に天秤に掛けて、こちらで良いや!と言う事になったのだと思いますが。

さてsmalight osでは、オブジェクトは全て静的に生成されます。それはconfig.cの中で生成情報を記述していました。
前回の生成情報の記述では、タスクの初期状態として全部のタスクをREADYに設定していました。
以下の記述のところです。

/*------ TCB Status Init -------------------------------------*/
/*
 * Task status Init : CTCB_ST_RDY | CTCB_ST_SLP | ...
 *                   ("slos.h" Refer to for details.)
 */
const UB knl_tcbStInit[KNL_TCB_NUM] = {
  CTCB_ST_RDY,  /* TCB1   */
  CTCB_ST_RDY,  /* TCB2   */
  CTCB_ST_RDY,  /* TCB3   */
};


つまりこの配列の初期化次第で、タスクの起動時の状態を制御できます。但し、起動時に取りえる状態はREADYとWAITだけです。
例えば3番目のタスクのみWAITで起動したい時は以下の様に記述すれば良いのです。

/*------ TCB Status Init -------------------------------------*/
/*
 * Task status Init : CTCB_ST_RDY | CTCB_ST_SLP | ...
 *                   ("slos.h" Refer to for details.)
 */
const UB knl_tcbStInit[KNL_TCB_NUM] = {
  CTCB_ST_RDY,  /* TCB1   */
  CTCB_ST_RDY,  /* TCB2   */
  CTCB_ST_SLP,  /* TCB3   */
};

タスクの終了
ITRON仕様では、何時でも任意のタイミングで自タスクを終了させたり、他タスクを終了させたり出来ます。つまりDORMANTに移行します。しかしDORMANTが存在しないsmalight osでは終了する事ができません。
例えばITRON仕様ならタスク実行関数の記述で以下の様に記述が出来ます。

void tsk01( VP_INT exinf  )
{
  必要な処理;
}


もう少しお行儀良く書くなら、

void tsk01( VP_INT exinf  )
{
  必要な処理;
  ext_tsk();
}


どちらも同じ動作をし、関数から戻ってきた段階でDORMANTとなります。
しかしsmalight osではこの記述は禁物です。必ず無限ループとするか、最終的にはWAITに遷移させます。
無限ループの場合

void tsk01( VP_INT exinf  )
{
  while( 1 )
  {
    必要な処理;
  }
}


WAITに遷移の場合

void tsk01( VP_INT exinf  )
{
  必要な処理;
  slp_tsk();
}

そうそう、勿論今回もお勧め本ね。

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング

  • 作者: 高田 広章, 宿口 雅弘, 岸田 昌巳, 南角 茂樹
  • 出版社/メーカー: CQ出版
  • 発売日: 2004/02
  • メディア: 単行本


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

naka

ITRONとsmalight OSの比較、興味深く拝見させていただいています。

状態名ですが、VxWorksでは、READY, PEND, DELAY, SUSPENDが
基本の4状態です。RUNNING状態がないのは、プリエンティブ優先度スケジューリングでは、READY状態にあるタスクで最高優先度を持つタスクがRUNNING状態になることは分かり切っていますので、ありません。

http://crystal.uta.edu/~ylei/cse5392/data/VxWorksReportv5.doc

以上
by naka (2007-05-03 13:56) 

y.u.

こちらの方面は、何年もご無沙汰だったのですが、また最近遊びたくなってH8/3069Fの三岩ボードを引っ張りだしてきてごそごそやっています。
まず最初はHOSを動かすところまで...ってところですが、gas-2.17からはh8300-hms(coffフォーマット)がサポート外になっているようですね。
elfのみのサポートとなったようです。bfdの方はサポートされていますがこのためにそのままでは開発環境がつくれません。

とりあえずbinutils-2.16.1でcoffのクロス環境、2.17でelfのクロス環境を両方作って試しています。elfでもMakefileとリンカスクリプトを少し修正すれば問題なく使えるように思います。まだ実際に動かしていませんが。
by y.u. (2007-05-06 17:12) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。