概要
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つ用意されています。飽和演算については章末の用語解説を参照してください。
実行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
飽和演算
飽和演算とは、演算結果が規定された値を超えた場合に、その規定値に固定(クリッピング)する演算です。最小/最大値のクリッピングにより変数のオーバーフローを防ぎ、ソフトウェアのレンジチェックによるCPUの負荷を軽減します。
一般に下図に示すような信号処理に使われます。例えば入力信号を増幅するときに、出力が規定された範囲を超えた場合に飽和することにより、信号のひずみを小さくする時に使われます。また、データ変換にも使用可能です。32ビット整数値を16ビット整数値に変換したい場合にも使えます。ただし、Cコンパイラが飽和演算命令をサポートしていない場合がありますので、確認が必要です。その様な場合は、アセンブラで記述しなければなりません。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。