スタックメモリアーキテクチャ


【スタックメモリアーキテクチャの概要】

 スタックメモリはサブルーチンや割込み時の戻り番地の格納メモリとして使われ
ますが、PIC18シリーズでは、大幅に機能拡張されました。
これらの拡張内容は下記のようになっています。
これらはいずれもリアルタイムOSを作成する時に便利な機能となっています。

(1) スタックレベルが31レベルに拡張された。

(2) スタックポインター(STKPTR)が命令で読み書きできるようになった。

(3) トップスタックの内容が特殊レジスタ(SFR)として読み書きが出来るようになった。
  (SFR名は、TOSU、TOSH、TOSLの3バイト)
(4) PUSH命令で現在PC値をスタックに追加し、POP命令で最後の戻り番地を捨てる
  ことが出来るようになった。
(5) スタックメモリのオーバー、アンダーフローでリセットが発生するようになった。

(6) Fast Register Stackが追加され、高速の割込み処理が可能となった。

【スタックメモリの構成】

まずスタックポインターレジスタ(STKPTR)は下図のようになっていて、5ビットの
現在ポインター値と、オーバー、アンダーのステータスを持っています。






【動作概要】

このスタックメモリの動作概要は下図のように(1)から(4)となります。







(1) 通常の基本動作
  CALL命令か割り込みにより戻り番地を、STKPTRの次のスタックに格納しSTKPTRを
 +1する。
 このとき、同時にTOSU、TOSH、TOSLにも戻り番地がコピーされる。
 逆にRETURN関連命令で現在のSTKPTRにあるアドレスをPCに移し、STKPTRを−1
 する。 同時に、TOSU、TOSH、TOSLの内容が次のスタック内の内容に変更される。

(2) PUSH、POP命令による動作
 PUSH命令により、現在のプログラムカウンタ(PC)の内容がスタックに格納され
 STKPTRが+1される。同時にTOSU、TOSH、TOSLにもコピーされる。
 POP命令の実行により、STKPTRの値が−1されて現在戻り番地は破棄されます。
 その結果、TOSU,TOSH,TOSLの内容は次のスタック内の内容に更新される。

(3) TOSU、TOSH、TOSLのアクセス
 通常のSFRのレジスタとして読み書きができる。
 PUSH、POP命令を使って順次格納、取り出しの処理が可能となる。

(4) Fast Register Stackのアクセス
  このスタックは高速割込み処理を実現するために、特定のレジスタ退避、復旧用の
 専用のスタックで、1レベル分のみ用意されており、命令では読み書きできません。
 実際に退避されるレジスタは、WREGレジスタ、STATUSレジスタ、BSRレジスタの
 3個のみ
 となっています。
 このスタックを使うのは、「Fast Interrupt Return」として設定した割込み処理か、
 サブルーチンCALL命令でのみしか使えません。
 通常の使い方は、高低両レベルの割込みを使っているとき、低レベルの割込み処理中
 に高レベルの割込みを処理するとき、レジスタ退避復旧を別にして高速化、処理継続性
 を高めることを目的として使います。
  (Fast Interrupt Returnの詳細は、割込みのページで説明しています。)



   目次ページへ