Index: EcnlProtoTool/trunk/asp3_dcre/kernel/task.c
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/kernel/task.c	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/kernel/task.c	(revision 429)
@@ -6,5 +6,5 @@
  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  *                              Toyohashi Univ. of Technology, JAPAN
- *  Copyright (C) 2005-2014 by Embedded and Real-Time Systems Laboratory
+ *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
  *              Graduate School of Information Science, Nagoya Univ., JAPAN
  * 
@@ -113,4 +113,5 @@
 		p_tcb->actque = false;
 		make_dormant(p_tcb);
+		p_tcb->p_lastmtx = NULL;
 		if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) {
 			make_active(p_tcb);
@@ -232,5 +233,6 @@
  *
  *  実行すべきタスクを更新するのは，実行できるタスクがなかった場合と，
- *  p_tcbの優先度が実行すべきタスクの優先度よりも高い場合である．
+ *  p_tcbで指定されるタスクの優先度が実行すべきタスクの優先度よりも高
+ *  い場合である．
  */
 #ifdef TOPPERS_tskrun
@@ -256,8 +258,13 @@
  *  実行できる状態から他の状態への遷移
  *
- *  実行すべきタスクを更新するのは，p_tcbが実行すべきタスクであった場合
- *  である．p_tcbと同じ優先度のタスクが他にある場合は，p_tcbの次のタス
- *  クが実行すべきタスクになる．そうでない場合は，レディキューをサーチ
- *  する必要がある．
+ *  実行すべきタスクを更新するのは，p_tcbで指定されるタスクが実行すべ
+ *  きタスクであった場合である．p_tcbで指定されるタスクと同じ優先度の
+ *  タスクが他にある場合は，そのタスクの次のタスクが実行すべきタスクに
+ *  なる．そうでない場合は，レディキューをサーチする必要がある．
+ *
+ *  自タスクに対してこの関数が呼ばれるのは，タスクディスパッチ可能状態
+ *  に限られる．またこの関数は，非タスクコンテキストから呼ばれることは
+ *  ないため，p_runtskとp_schedtskは必ず一致している．そのため，p_tcb
+ *  とp_schedtskが一致するときは，必ずタスクディスパッチ可能状態である．
  */
 #ifdef TOPPERS_tsknrun
@@ -325,12 +332,14 @@
  *  タスクの優先度の変更
  *
- *  タスクが実行できる状態の場合には，レディキューの中での位置を変更す
- *  る．オブジェクトの待ちキューの中で待ち状態になっている場合には，待
- *  ちキューの中での位置を変更する．
- *
- *  実行すべきタスクを更新するのは，(1) p_tcbが実行すべきタスクであって，
- *  その優先度を下げた場合，(2) p_tcbが実行すべきタスクではなく，変更後
- *  の優先度が実行すべきタスクの優先度よりも高い場合である．(1)の場合に
- *  は，レディキューをサーチする必要がある．
+ *  p_tcbで指定されるタスクが実行できる状態の場合には，レディキューの
+ *  中での位置を変更する．オブジェクトの待ちキューの中で待ち状態になっ
+ *  ている場合には，待ちキューの中での位置を変更する．
+ *
+ *  実行すべきタスクを更新するのは，(1) p_tcbで指定されるタスクが実行
+ *  すべきタスクであった場合には，優先度を下げた（または優先度が変わら
+ *  なかった）時，(2) p_tcbで指定されるタスクが実行すべきタスクでなかっ
+ *  た場合には，変更後の優先度が実行すべきタスクの優先度よりも高いか同
+ *  じ時（同じ場合に更新が必要になるのは，実際には，mtxmodeがtrueの場
+ *  合のみ）である．(1)の場合には，レディキューをサーチする必要がある．
  */
 #ifdef TOPPERS_tskpri
@@ -367,7 +376,6 @@
 			}
 			else {
-				if (mtxmode ? newpri <= p_schedtsk->priority
-							: newpri < p_schedtsk->priority) {
-					p_schedtsk = p_tcb;
+				if (newpri <= p_schedtsk->priority) {
+					p_schedtsk = (TCB *)(ready_queue[newpri].p_next);
 				}
 			}
