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


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

 PIC18Fxxxxシリーズでのスタックメモリは、他のPICと同じように、サブルーチンや割込み
時の戻り番地の格納メモリとして使われますが、大幅に機能拡張されました。
これらの拡張内容は下記のようになっています。

(1) スタックレベルが31レベルに拡張された。
  より複雑なプログラム作成が可能になりました。

(2) スタックポインター(STKPTR)が命令で読み書きできるようになった。
  つまり戻り番地をプログラムで変更できるようになりました。

(3) トップスタックの内容が特殊レジスタ(SFR)として読み書きが出来るようになった。
  (SFR名は、TOSU、TOSH、TOSLの3バイト)

(4) PUSH命令で現在PC値をスタックに追加し、POP命令で最後の戻り番地を捨てる
  ことが出来るようになった。

(5) スタックメモリのオーバー、アンダーフローでリセットが発生するようになった。

(6) 別の独立したスタックメモリとして、Fast Register Stackが追加され、割込みかCALL
  命令で使うことで、レジスタの退避復旧をハードウェアレベルで実行するので、
  高速の割込み処理が可能となった。このスタックは1レベルしかない。

これらの機能強化はいずれもスタックを多用する高級言語や、リアルタイムOSなどを
作成するときに便利な機能となっています。

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

このスタックメモリの動作概要は下図のようになります。
まず、スタックメモリとしては、通常のスタックと、Fast Register Stackの2種類があります。
Fast Register Stackは高速割込み処理のために使用される専用スタックで、1レベル
のみです。









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

 このスタックポインター STKPTRの内容は、下図のように、5ビットの現在ポインター
 値と、オーバー、アンダーのステータスとなっています。
 この現在ポインター値が、現在保持しているスタックの最期の格納場所になります。





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

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


【Fast Register Stack】

Fast Register Stackは、特定のレジスタ退避、復旧用の専用のスタックで、1レベル分のみ
用意されており、命令では読み書きできません。
実際に退避されるレジスタは、WREGレジスタ、STATUSレジスタ、BSRレジスタの3個のみ
となっています。
使い方としては下記のような使い方ができます。

(1) 割込みレベルを2レベルとするとき
  高位割込み処理で使い、レジスタの退避、復旧を高速で行うことで、短時間で割込み
  処理を完了することができます。従って、低位割込み処理中にさらに高位割込みが
  入った場合にも短時間で処理できるため、効率良い割込み処理とすることができます。

(2) 優先割込みを使わない場合
  WREG、STATUS、BSRの3つのレジスタの自動退避、復旧用のスタックとして使うことが
  できます。このスタックを使うには、割込みの優先順位をすべて高位としておき、RETURN
  命令には、 RETFIE FAST という命令で戻るようにします。

(3) 割込みを使わない場合
  一般のCALL命令で使うことができ、レジスタの退避、復旧に使うことができます。
  使い道としてはサブルーチン内でこの3つのレジスタを変更しても、戻るときには元の
  値に戻すということが簡単にできることになります。
  このサブルーチンで使うときの書式は下記のようにします。

         CALL  SUB1,FAST
          −−−−−−−
          −−−−−−−
         
    SUB1  −−−−−−−
          −−−−−−−
          RETURN  FAST



   目次ページへ