専用プログラムステータスレジスタ(PSR)

専用プログラムステータスレジスタ

概要

Cortex-M3には特殊レジスタとして、「専用プログラムステータスレジスタ(PSR)」と呼ばれるプログラムの実行状態を示すレジスタがあります。一般的には、コンディション・コード・レジスタ(CCR)のような名前でマイコンに搭載されていますが、Cortex-M3では一般的なCCRの機能に加えて、特殊命令の実行結果や割り込みの状態を知ることができます。

専用プログラムステータスレジスタ(PSR)は、システムレベルのプロセッサステータスを表し、次の3つのカテゴリに分けられます。

  • ●アプリケーションPSR(APSR)
  • ●割り込みPSR(IPSR)
  • ●実行PSR(EPSR)

これらは、個別のレジスタとして、または3つすべての組み合わせとして、ステータスレジスタと汎用レジスタ間の移動命令(MRS/MSR命令)を使用してアクセスできます。全部一緒にアクセスするときにxPSRというコマンド名を使います。
記述例を以下に示します。

例1:APSR

APSRのN、Z、C、V、Qだけ読み出したい場合は以下のように記述します。これで、APSRの内容がレジスタ3に格納されます。
 MRS  r3 , APSR ;

例2:IPSR

IPSRの割り込み番号だけ読み出したい場合は以下のように記述します。これで、IPSRの内容がレジスタ1に格納されます。
 MRS  r1 , IPSR ;

例3:xPSR

xPSR全部を読み出したい場合は以下のように記述します。これで、xPSRの内容がレジスタ2に格納されます。
 MRS  r2 , PSR ;

例外処理の間PSRはスタックにストアされます。

アプリケーションPSR(APSR)

APSRの各ビットの説明をします。

  • ①Nはネガティブ・フラグです。演算結果が「負」または、「より小さい」場合に1が立つフラグです。
    • 1 = 結果が「負」または、「より小さい」
    • 0 = 結果が「正」または、「より大きい」
  • ②Zはゼロ・フラグです。演算結果が0の時に1が立ちます。
    • 1 = 結果が0
    • 0 = 結果が0でない
  • ③Cはキャリーまたはボローフラグです。演算結果にキャリーが発生したりボローが発生すると1が立ちます。加算、減算等の命令でCを一緒に計算することができます。
    • 1 = キャリーまたはボローあり
    • 0 = キャリーおよびボローなし
  • ④Vはオーバーフロー・フラグです。オーバーフローが発生すると1が立ちます。
    • 1 = オーバーフローあり
    • 0 = オーバーフローなし
  • ⑤Qはスティッキ飽和フラグです。飽和演算で演算中に飽和が発生すると1が立ちます。Cortex-M3には符号ありとなしの飽和演算の命令SSATとUSATが2つ用意されています。飽和演算については章末の用語解説を参照してください。
図1

実行PSR

第4回:命令セットの概要」で、「IT(if then)命令のような、Thumb16ビット命令のエンコードスペースには、十分なスペースがないため、Thumbコンパイラになかった機能の命令がThumb-2命令で追加された」と記述しました。その様な命令の実行状態が「実行PSR」に入ります。このレジスタには、ICT/ITの共有するフィールドとThumb状態ビットの2つのフィールドが含まれます。

ICI

割り込みされた複数ロードおよび複数ストア命令用の中断可能で中断後から継続可能な命令(ICI)(Interruptible-Continuable Instruction)フィールドです。複数ロード(LDM)操作および複数ストア(STM)操作は割り込みで中断可能です。EPSRのICIフィールドには、中断が発生した箇所から複数ロードまたは複数ストアを継続するために必要な情報が保持されています。すなわち、LDMまたはSTM転送中に割り込みが発生すると複数転送は中断されます。この時、ビット[15:12]に複数転送のオペランドになっているレジスタの次の番号を記憶します。割り込み処理が終った後、プロセッサはビット[15:12]に格納されているレジスタに復帰して転送を再開します。

If-Then(IT)命令用の実行状態フィールド

ここには、If-Then ブロック内の命令数および実行条件が含まれています。

Thumb状態ビット(T-bit)

Thumb-2命令セットの16ビット命令が実行されているときにT-bitが立ちます。Thumb状態とは従来のARMコアで16ビット命令を実行する状態です。従来のARMコアでは、32ビット命令のARM命令と16ビット命令のThumb命令がありました。そして、コアはどちらの命令を実行するかで状態を切り替えなければなりませんでした。ARM命令を実行する状態をARM状態、Thumb命令を実行する状態をThumb状態と呼んでいました。

Cortex-M3の16ビット命令はThumb命令とは完全に互換性がありますが、ユーザーから見るとARM状態とThumb状態の区別はありません。すなわち、Thumb-2命令セットではThumb命令と完全互換の16ビット命令と新しい32ビット命令を実行する状態を切り替える必要はありません。完全に16ビットと32ビットの混在命令セットです。

割り込みPSR

現在アクティブになっている例外の割り込み処理ルーチン(ISR)番号が入っています。例外の番号は以下の様になっています。

  • ベースレベル= 0
  • NMI = 2
  • SVCall = 11
  • INTISR[0] = 16
  • INTISR[1] = 17
  • INTISR[15] = 31
  • INTISR[239] = 255
図2