(toppers-users 21) Re: 複数タスクのdly_tsk実行後の待ち解除順序について

Hiroaki TAKADA hiro @ ertl.jp
2020年 2月 23日 (日) 05:43:15 JST


亀亀うさぎさん

> ほぼ同じタイミングでdly_tskで待ち状態になったタスクの待ち解除は、FIFOではないのでしょうか?

FIFO順になるとは限りません。TOPPERS新世代カーネル統合仕様書の4.6.1節の
NGKI2343 にそのことが記述されています。

高田広章
名古屋大学

On 2020/02/22 23:26, Kimitsugu Nakao wrote:
> 亀亀うさぎです。
> 
> 複数タスクのdly_tskからの起動順序について質問させていただきます。
> Toppers/ASPをLinux上でシミュレーションで動作させています。
> 
> 同じ優先度のタスク1~3を順番にdly_tsk(3000);で待ち状態にします。
> 次のサンプルだと3つのタスクはほぼ同じ時刻に待ち状態に入りますが、最初に待ち状態に入ったタスク1から順番に待ちが解除されて実行状態になると考えているのですが、そのようになりません。
> 
> コンフィギュレーションファイル
> CRE_TSK(TASK1,{ TA_HLNG, 0, task, MID_PRIORITY, STACK_SIZE, NULL });
> CRE_TSK(TASK2,{ TA_HLNG, 1, task, MID_PRIORITY, STACK_SIZE, NULL });
> CRE_TSK(TASK3,{ TA_HLNG, 2, task, MID_PRIORITY, STACK_SIZE, NULL });
> 
> CRE_TSK(MAIN_TASK, { TA_HLNG | TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
> 
> ソースコード
> void task(VP_INT exinf)
> {
> 
>          syslog(LOG_INFO, "task[%d] delay start.", exinf);
>          dly_tsk(3000);
>          syslog(LOG_INFO, "task[%d] delay end.", exinf);
> 
> }
> 
> void main_task(VP_INT exinf)
> {
>          syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
>          syslog(LOG_INFO, "Main-->実行開始");
> 
>          syslog(LOG_INFO, "Main-->タスクの起動");
>          act_tsk(TASK1);
>          act_tsk(TASK2);
>          act_tsk(TASK3);
> 
>          syslog(LOG_INFO, "Main-->自タスクの終了");
>          ext_tsk();
> }
> 
> 実行結果
> System logging task is started on port 1.
> Main-->実行開始
> Main-->タスクの起動
> Main-->自タスクの終了
> task[0] delay start.
> task[1] delay start.
> task[2] delay start.
> task[0] delay end.
> task[2] delay end. ⇐ タスク1が実行状態にならない!
> task[1] delay end.
> 
> ほぼ同じタイミングでdly_tskで待ち状態になったタスクの待ち解除は、FIFOではないのでしょうか?
> 以上、どなたか上記動作の理解についてご存じの方がいらっしゃれば、よろしくお願いいたします。
> 


More information about the USERS mailing list