(toppers-users 768) Re: 割込みハンドラ出口処理について

SHUKUGUCHI Masahiro ms89019 @ mms.co.jp
2003年 3月 11日 (火) 14:51:00 JST


かりやさま

宿口ともうします。私が認識している範囲で回答します。

> 1.M68K, CPU 依存部、割込みハンドラ出口処理
>     (cpu_support.s : ret_int)
>      この処理で、(runtask == NULL) の場合(実行中のタスクがない)で、
>      schedtsk に何らかのタスクが設定されてこの処理が実行された時、
>   dispatcher に飛ぶ前 NULL をポインタとしたエリアにアクセスする事
>      になりませんでしょうか?  特に、0番地当たりがROMエリアに割当て
>      られている場合CPU例外が起きてしまうのではないでしょうか?

ご指摘の処理 cpu_suppoert.S の dispatch: は、カレントタスクが存在する
状態、即ち runtask!=NULL の状態で呼出されますので、ご指摘の問題は発生
しません。

次のカレントタスク(RUNNINGタスク)が存在しない場合は、STOP命令が実行
されますね。

> 2.最低優先順位の番号について
> 
>   標準で16が最低優先度です。ready_queue 配列は確かに16個の配列を
>   用意してありますが、この ready_queue 配列のアクセス時、TCB に保存
>   してある priority 値をダイレクトにインデックス値としている為、
>   最低優先順位のタスクを作ると ready_queue[16] というアクセスが発生
>      してしまう。インデックスとして(priority - 1)を使用しないといけない
>      のではないでしょうか?

内部処理で、ご指摘の処理に変換されています。即ち、最高優先度が0、
最低優先度が1 になっています。この処理は task.h のマクロで実施されて
います。

task.h の(多分)49行目あたり
/*
 *  タスク優先度の内部表現・外部表現変換マクロ
 */
#define INT_PRIORITY(x)		((UINT)((x) - TMIN_TPRI))
#define EXT_TSKPRI(x)		((PRI)(x) + TMIN_TPRI)

取急ぎ。

宿口雅弘