(toppers-users 1550) Re: タスクの二重起動防止

Masaki Muranaka monamour @ monaka.org
2004年 7月 18日 (日) 22:38:12 JST


On 2004/07/17, at 23:13, Ko Tanikawa wrote:
> 同じタスク ID のものが2重起動することはない,と言うこ
> とですね。

はい。その通りです。

> タスク ID を変えれば,
>
> CRE_TSK(TASK1, { TA_HLNG, (VP_INT) 1, task, MID_PRIORITY, STACK_SIZE, 
> NULL });
> CRE_TSK(TASK2, { TA_HLNG, (VP_INT) 2, task, MID_PRIORITY, STACK_SIZE, 
> NULL });
> CRE_TSK(TASK3, { TA_HLNG, (VP_INT) 3, task, MID_PRIORITY, STACK_SIZE, 
> NULL });
>
> みたいに,関数そのものは共用できるんですよね?

共用できます。

小難しく説明すると、こんな感じです。

タスクというのは、実行コンテキストを抽象化したものと言えます。
実行コンテキストというのは、ある時点での実行状態を再現できる情報の束です。
具体的にはプログラムカウンタやレジスタ(スタック)が保持する情報に該当します。
// task.h あたりからカーネルソースを追いかけてみると、
// これらのレジスタの値を保持している構造体を見つけることができます。
//// 見つけなくてもITRONプログラミングはできます。

1つのタスクIDには1つの実行コンテキストが対応付きます。多重起動するためには
実行コンテキストがが2個必要なので、ので、同じタスクIDでの多重起動は
起こりえないということになります。

一方、タスクとは実行コンテキストを抽象化した以上のものではないので、
他のタスクがどこを実行していようが制約を受けません。
ですから、エントリルーチンを一緒にしても問題はありません。

…うーん。やっぱり小難しい。;-)

POSIXやWin32と対比して説明すると解りやすい? と思ったのですが、POSIXやWin32の
プロセス-スレッドモデルを理解する方がさらに難しいじゃん、ということに思い至り、
断念しました。解りづらくてごめんなさい。

--
from もなか