【スタックメモリアーキテクチャの概要】
スタックメモリはサブルーチンや割込み時の戻り番地の格納メモリとして使われ
ますが、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の詳細は、割込みのページで説明しています。)