SSブログ

Smalight OSを使おう 8タスク目 タスク管理を使う2 [Smalight OS]

この記事は、某SNSで書いているものを転載しています。
今回は、前回やり残したタスク管理機構の「tslp_tsk」です。μITRON仕様にも、同じサービスコールが存在します。

しかしこのサービスコールは既にサンプルプログラムで何度も登場しているので、使い方に付いては既に把握して居らっしゃるかと思います。

このサービスコールは、その名前をご覧頂ければ判る様に、自タスクを待ち状態に遷移する「slp_tsk」に、時間管理機能を付加したもので、先頭の"t"が時間管理機能を表しています。
引数は単位をmsとした相対時間であり、符号付き32bitで表現されますので、最大は0x7fffffffとなります。しかし前から思うのですが、現在のシステムタイマーの値からの相対時間なので、ロールオーバーしちゃったらどうなるんでしょうかね。

動作を説明しますと、このサービスコールを発行することで、自タスクをRUNからWAITに遷移させます。
基本的に「slp_tsk」である事から、別のタスク等から起床要求を受けると、READYに遷移してしまいます。
この辺がμITRON仕様の「dly_tsk」と異なる所で、タスクがこのサービスコールから帰って来た時、その要因をリザルトコードで調べる処理が、場合に拠っては必要となります。
また、他タスク等からの起床要求を受けなかった時は、引数の相対時間が経過した後のシステムタイマーの更新タイミングで起床されます。

※「dly_tsk」は、自タスクの実行を引数の時間だけ遅延させ、時間が来たらREADYに遷移する。

リザルトコードとして取り得る値は、
E_OK:正常終了。起床要求を受けて待ち状態が解除された時、このリザルトコードが返ります。
E_TMOUT:ポーリング失敗(引数に TMO_POL(=0) を設定)、またはタイムアウト(相対時間が経過)した時、このリザルトコードが返ります。

ではサンプルプログラムを作成して、実際に体験してみましょう。
コンパイラの設定は、
  SYSTIMEを有効
config.cの設定は、
  tsk01:優先度1、起動時READY
  tsk02:優先度2、起動時READY
  SYSTIM_CYCLIC_TIMは10
ユーザー初期化関数uinitの設定は、
  システムクロック10MHz
  Raタイマー割り込み周期10ms

/***********************************/
/*** reset process               ***/
/***********************************/
void uinit(void)
{
  /* initialize */
  pd2 = 0xff;
  /* Processor clock init  */
  init_clock();		
  /* systime initialize  */
  systim_init();
  /* cyclic timer initialze  */
  init_timerRA();
}

tsk01、tsk02

void tsk01( void )
{
  W ercd;

  ercd = tslp_tsk( 1000 );

  if( ercd == E_OK )  /*起床要求を受けた時*/
    p2_0 = 0;  /*ここにブレークポイントを設定*/
  else  /*タイムアウトした時*/
    p2_0 = 1;  /*ここにブレークポイントを設定*/

  slp_tsk() ;
}

void tsk02( void )
{
#if 1
#else
  wup_tsk( TID_1 );
#endif
  while( 1 ) ;
}


オンチップデバッカーを起動し、tsk02の#if~#else文の条件を変更して、tsk01のブレークポイントのどちらで停止するか試してみて下さい。

まずtsk01が先に起動し、tslp_tskで時間を設定した上で、WAITに遷移しています。

次にtsk01がWAITに遷移した為に,tsk02がREADYからRUNに遷移し、実行を始めます。
この時#if 1ならば、何もせずに無限ループに入ります。
tsk01は何処からも起床要求を受けなかったので、タイムアウトでtslp_tskから抜けて来ます。
その結果、条件式のelse側の処理が行われる事となります。

#if 0とした時は、tsk02はtsk01の起床要求を発行します。
そうするとtsk01はWAITからREADYに遷移しますが、サービスコールの中で実行中のタスク(tsk02)と優先度が比較され、当然tsk01の方が優先度が高い事から、実行中のタスクが切り替えられるプリエンプトが発生し、その時のリザルトコードからE_OK側の処理が行われます。

やはりこれですね。(ループ中)

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 浜原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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