(toppers-users 3848) SSP 同一実行優先度のディパッチアルゴリズムの機能の追加

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2012年 1月 30日 (月) 15:52:54 JST


 こいさんです

同一優先度で過負荷になった場合ディスパッチされないタスクが発生する問題の、一つの対策案です。

・ 同一優先度のディパッチアルゴリズムを追加できるようにrun_task()を変更して見ました。

void run_task(uint_t ipri)
{
 uint_t next_pri; /* 次に実行開始するタスクの起動時優先度 */
 uint_t saved_pri; /* 呼び出し元タスクの起動時優先度 */

 next_pri = ipri;
 saved_pri = runtsk_ipri;

 runtsk_ipri = tinib_epriority[next_pri];
 do {
  /* CPUロック解除 */
  t_unlock_cpu();
  /* タスク実行開始 */
  (*((TASK)(tinib_task[next_pri])))(tinib_exinf[next_pri]);
  if (t_sense_lock()) {
  }else {
   t_lock_cpu();
  }
  disdsp = false;
  /* ビットマップクリア. */
  primap_clear(next_pri);
  if(primap_empty())break;
  if((saved_pri < (next_pri = search_schedtsk()))){
   break;
  }else if((saved_pri == (next_pri = search_schedtsk()))){
//   runtsk_ipri = samePri();
   break;
  }else{
   runtsk_ipri = tinib_epriority[next_pri];
  }
 } while(1);

 runtsk_ipri = saved_pri;
}
この修正でsample1は従来と同様に動作するはずです。samePri();に同一実行優先度のディパッチアルゴリズム処理を組み込めは、その他は従来と変わりません。アルゴリズムの修正には起動優先度も必要でしょう。runtsk_ipriをunionにして起動優先度、実行時優先度を保存します。_kernel_tinib_epriorityで隣接する同一実行優先度タスクをラウンドロビンに修正するのは容易だと思っています。ラウンドロビンはFCFSでは有りませんが、サービスされないケースは回避できます。

・
別件ですが、基本的にrun_taskはロック解除で動作させたいと思っています。ディパッチ関連でロックが必要なのはready_primapのsetとclearなので(読み出しはロック不要)、ここだけロックすればよいはずです。runtsk_ipriに2つの情報を含めた場合、個別にアクセスすればロックが必要になりますが、unionで同時にアクセスすれば回避できるでしょう。うまくやれば、act_taskのキュー処理追加も容易に出来ると思っています。
Cortex-M3に限るなら、ビットバインドエイリアスを使えばready_primapのsetとclearをロックを使わずにアトミックに実現できます。ロック時間の短縮は、確証はありませんが、出来そうな気はしています。
SSP程度の機能なら、色々面白い作り方が有ると思っています。

以上
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20120130/6a9efb58/attachment.html>