[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(itron-club 1649) 割り込み処理 の実装方法



  木元です。現在、趣味でM32102上にμITRONを作っていますが、割り込みス
タックの扱いについて疑問がわきました。

  M32102はRISC型の組み込み向けプロセッサで、64KBのSRAMと8KBのコード
キャッシュを内蔵しています。私が使っている環境では外部に8MBのSDRAMがあ
ります。汎用レジスタは32BIT×16本で、内2本がSP(スタックポインタ)とLP(リ
ンクポインタ:リターンアドレス格納用)に使われます。特殊レジスタにはDSP
用のアキュームレータが64BIT、PC(プログラムカウンタ)が32BIT、PSW(プロセッ
サステータスワード)が16BIT、そのほかEIT用のスタックや退避用レジスタが
あります。

 μITRON実装の要件は以下のとおりです。タスク・割り込みハンドラはCで書
きたい、多重割り込みは必須、割り込み間隔は16μ秒、割り込みハンドラ数は
2、タスク数は2、タスクはREADY状態が必須、といったところになりました。
ここから派生して、できればOSもCで書きたい、OSはTRAPで呼び出す、という
のも出てきました。

# 作っているのが特殊再生のできるツインCDプレーヤーで、60kHzほどのサン
# プリング周波数でオーディオイベントを供給する必要があります。このため、
# D/Aにシリアル送信しているDMAからの割り込みが16μ秒、あとはタイマー
# 割り込みが10m秒、それぞれのドライブに対応したタスクが1つずつ、とい
# う構成です。今のところ、同期は共有変数でおこなっています。シリアルは
# ポーリングを予定しています。

 M32102は、EITが発生した時点で割り込みスタックに切り替わるようになっ
ています。しかし、タスクのコンテキストをタスクスタックに積むように作っ
た場合、割り込みハンドラ内でタスクスイッチすると、割り込みハンドラから
リターンするときに、割り込みスタックからタスクスタックにコンテキストを
積みなおす必要があります。私は、ネストしていない最初の割り込みについて
は、タスクスタックにタスクのコンテキストを積むようにしました。また、シ
ステムコール呼び出し時にも、割り込みハンドラと同じ形でコンテキストを積
むようにしました。これにより、タスクスイッチはユーザスタックの切り替え
のみで済むようになりましたが、これは一般的なやりかたなのでしょうか。あ
るいは、割り込みハンドラの先頭で割り込みスタックに切り替わるCPUに適した
やりかたがあるのでしょうか。

pai_