(toppers-users 2328) M32Cのディスパッチ処理について

松井 岳章 T.Matsui @ abilit.co.jp
2006年 2月 27日 (月) 11:58:14 JST


こんにちは
アビリット(株)松井と申します

現在製品にTOPPES1.4.2を載せて動作テスト中なんですが、過負荷時
にどうも妙な動きをするのでカーネル内部を調べたました。
その時に疑問がわきましたので質問をします。

状況)
タスクA,Bがありまして、優先度はA>Bの状態です。
タスクAは何らかのイベント待ちの状態でタスクBの実行中に
割り込み処理でタスクAの待ちが解除された場合を仮定します。


タスクA待ち時のスタック領域
SP→
  r0〜fb(汎用レジスタ・アドレスレジスタ・SB・FB)
  PC(プログラムカウンタ)

タスクB割り込み発生時のスタック領域
SP→
  r0〜fb(汎用レジスタ・アドレスレジスタ・SB・FB)
  PC(プログラムカウンタ)
  FLG(フラグレジスタ)

M32C・M16Cは割り込み発生時はフラグレジスタをスタック領域に退避
するため若干スタック領域に差異があります。
この状態でスタックポインタをタスクAの領域に変更して割り込み処理
から復帰するとプログラムカウンタの下の値をフラグレジスタに格納
しますし、そもそもスタック領域がおかしなことになります。


上記のようなことが起こっていればタスクは暴走してもおかしくはないの
ですが、実機の動作を見ていると、通常時は何の問題も無く動いています。

どなたかこの考えの誤っている点があれば指摘して頂きたいのですが。
よろしくお願いします。

--
アビリット(株) CR事業本部 開発部 量産設計グループ
TEL 06-6243-2846 FAX 06-6243-2849
松井 岳章 Matsui Takeyuki
T.Matsui @ abilit.co.jp