(toppers-users 484) Re: 非タスクコンテキストでのサービスコールの遅延実行

Tatsuhiko Matsukawa KFC00725 @ nifty.ne.jp
2002年 8月 21日 (水) 08:37:34 JST


高田様、コメントいただきありがとうございます。

> > 非タスクコンテキストからのサービスコールを遅延実行にすることで、ITRON
> > のサービスコール以外のクリチカルセクションを持つ関数(malloc等)も、全割
> > り込み禁止やセマフォー等を用いることなく、簡単にスレッドセーフに実装す
> > ることができるという利点があります。
>
> これは、なぜでしょうか? ご説明いただけると幸いです。

あれっ、私がなにか勘違いしていますかね。

複数のタスクでmallocが使われている場合、ひとつのタスクでmallocを
実行中にタスクが切り替わり、他のタスクでmallocが実行されると
ヒープメモリの管理テーブルに不整合が生じる可能性があります。
これを防止するには、
  (1) mallocをセマフォーやミューテックスで排他制御する
  (2) malloc中にタスクが切り替わらないようにする
         (2-A) 割り込みを禁止する
         (2-B) dis_dspでディスパッチを禁止する
         (2-C) 非タスクコンテキストのサービスコールを遅延する期間にする
の方法があると思います。
malloc自身に再入状態にならない限りタスクの切り替えを妨げないように
する必要があるのであれば(1)の方法をとりますが、これは非常にオーバ
ーヘッドが大きくなります。
(2-A)は、当初の課題の割り込み応答時間に影響を与えます。
(2-B)と(2-C)を比べた場合、Xstormy16の場合、遅延実行に用いようと
している割り込みの禁止・許可はそれぞれ1命令(2clock)でできるため、
オーバーヘッドを気にすることなく、簡単にできます。

************************
松川竜彦
KFC00725 @ nifty.ne.jp
************************