コアレジスタ、割り込みと例外処理

コアレジスタ

Cortex-M7のコアレジスタ構成はCortex-M3/M4と同じです。(Cortex-M編 第11回参照

図1

13本の汎用レジスタR0~R12

データ処理や間接アドレッシングに用います。

スタックポインタ(SP)R13

スタックの場所を示します。SPプロセス(PSP)とSPメイン(MSP)のバンク切り替えになっています。

リンクレジスタ(LR)R14

サブルーチンの(関数が呼ばれた)場合の、戻り先アドレスが入ります。

プログラムカウンタ(PC)R15

現在実行されている命令のアドレスを指します。

プログラムステータスレジスタ(xPSR)

Cortex-M7の状態を示します。内部は3つに分かれています。演算結果の状態(ゼロ、負値等々)を示すアプリケーションPSR、割り込みの状態を示す割り込みPSR、Thumb-2命令の実行状態を示す実行PSRです。

プライオリティマスクレジスタ(PRIMASK)

PRIMASKレジスターは設定可能な優先順位によって、すべての例外をマスクします。

フォールトマスクレジスタ(FAULTMASK)

FAULTMASKレジスターはNon-Maskable割り込み(NMI)を除いて、すべての例外をマスクします。

ベースプライオリティマスクレジスタ(BASEPRI)

BASEPRIレジスターは、例外処理のための最小の優先順位を定義します。BASEPRIがゼロでない値に設定される時には、それは同じまたはそれよりも下の優先順位によってBASEPRI値として、すべての例外をマスクします。

制御レジスタ(CONTROL)

制御レジスタは、ソフトウェア実行のための使われるスタックと特権レベルをコントロールします。

割り込みと例外処理

概要

Cortex-M7でもCortex-M3/M4と同じように、統合ネスト型ベクタ割り込みコントローラ(NVIC: Nested Vectored Interrupt Controller)を搭載しており、割り込み処理は少ないオーバーヘッドと割り込み性能の最適化が行われています。

例えば、コンテキストの自動保存と自動復元、後着、テールチェイン、コンテキストの保存と並行した命令フェッチです。テールチェイン、後着、横取りなどについての詳細は「Cortex-M編 第15回」を参照ください。

Cortex-M7の割り込みオーバーヘッドは12サイクルで、これはTCM(Tightly Coupled Memory)を用いたゼロウエイトメモリシステムとAXIMからのフェッチでキャッシュがヒットしない場合を想定しています。FPUを使った場合は、さらに数サイクルかかります。(通常の場合のスタック動作に加えて、S0~S15レジスタとFPSCRもスタックされます。)
また、Cortex-M7では低消費電力モードの制御も行います。

統合ネスト型ベクタ割り込みコントローラの機能

  • ●外部割り込みは1から240まで設定可能です。
    具体的な割り込みの割り当ては、マイコンベンダーのインプリメンテーションで設定されますので、各製品の仕様書を確認してください。多くの場合は、製品展開を考慮して、「予約」を設定している場合があります。
  • ●0から255までの割り込み優先順位のレベルが設定可能です。
    これも、マイコンベンダーのインプリメンテーションで設定されますが、実際に256レベルの割り込み優先順位を設定できるマイコンは少なく、最大16レベル程度の製品がほとんどです。さらに、この割り込み優先順位はソフトウエアで、変更可能ですので臨機応変に変更可能です。具体的な設定方法は「Cortex-M編 第16回」を参照ください。
  • ●レベル検出&パルス検出をサポート
    コア自体は両方サポートしていますが、これも、マイコンベンダーのインプリメンテーションで設定されます。
  • ●外部NMI(Non-Maskable Interrupt)をサポートします.
  • ●ウェイクアップ割り込みコントローラ(WIC)はUtra-low power sleep modeサポートを提供。
  • ●プロセッサはその状態を例外処理開始時に自動的にスタックして、終了時に自動でスタックから取り出します。そのため命令実行によるオーバーヘッドがありません。これは遅延時間の短い例外処理を提供します。
  • ●ユーザーは、特権モードからはNVICに完全にアクセスできますが、構成制御レジスタ( Configuration and Control Register)を許可すると、ユーザモードで割り込みを保留することもできます。それ以外のユーザモードアクセスでは、バスフォールトを引き起こします。
  • ●すべてのNVICレジスタは、ワードアクセスのみです。

低消費電力モード

  • ●WICがインプリメントされていると、Utra-low power sleep modeサポートが可能になります。WICはベンダーオプションです。搭載されているかどうかは、製品の仕様書を確認してください。
  • ●プロセッサとNVICが割り込みを識別し、優先度を付けることを、WICに任せ、 Utra-low power sleep modeに入ることを可能にします。
  • ●WICが使われる時には、ユーザはシステムコントロールレジスターのSLEEPDEEPをイネーブルにします。
  • ●プロセッサは、 WFI(Wait For Interrupt)、 WFE(Wait For Event)、 SEV(Send Event)命令を実行します。
  • ●さらに、プロセッサはSLEEPONEXITの使用もサポートします。
    そして、 例外ハンドラから「スレッドモード」に戻る時に、プロセッサコアをスリープモードに入れます。

レベル割り込みとパルス割り込み

  • ●プロセッサはレベルとパルス割り込みの両方をサポートしています。
    これもマイコンベンダーがサポートするかしないかを決めますので、サポートされているかどうかは、製品の仕様書を確認してください。
  • ●レベル割り込みは、デバイスにアクセスするISRによってクリアされるまで、アサートされ続けます。
  • ●パルス割り込みは、エッジモデルの一種です。エッジは、非同期のままではなく、Cortex-M7クロックの立ち上がりエッジでサンプリングされる必要があります。
  • ●レベル割り込みの場合、割り込みルーチンから戻る前に信号がアサート解除されないときは、割り込みは再保留され、再度アクティブになります。これはFIFOおよびバッファベースのデバイスの場合に特に有用です。これにより、それらのデバイスが余分な作業なしに、1つのISRによって、または起動の繰り返しによってドレインされることが保証されるのが理由です。これは、デバイスは空になるまで信号をアサートのまま保持することを意味します。
  • ●パルス割り込みは、ISRの間に再アサートすることができます。このため、割り込みが同時に保留中とアクティブの両方の状態になる場合があります。
    もし割り込みがまだ保留中の間に、別のパルスが到着するした時は保留が継続されます。ISRの実行は1つの割り込みだけです。パルス割り込みは、ほとんどの場合外部信号によって、一定の間隔で発生する、または繰り返し発生する信号に使用されます。

ベクタテーブル

ベクトルテーブルは基本的にCortex-M3/4と同じです。スタックポインタの初期値、開始アドレス、例外ハンドラー用の例外ベクターを含みます。各ベクタのLSBが1ならばThumbコードの例外ハンドラーを示します。

図2

スタック構成

浮動少数点ルーチンを使用している場合, Cortex-M7プロセッサは、例外処理の際に、通常のスタック動作に加えて、自動的に浮動小数点演算の状態をスタックします。具体的には、32ビット単精度レジスタ(S0-S31)とステータス及び設定用のFPSCRレジスタがスタックされます。

図3

CMSISを使ったNVIC制御

CMSISを使ってNVICを制御する場合の例を示します。

CMSIS function Description
void NVIC_EnableIRQ(IRQn_Type IRQn)a 割り込み/例外処理の有効化
void NVIC_DisableIRQ(IRQn_Type IRQn)a 割り込み/例外処理の無効化
void NVIC_SetPendingIRQ(IRQn_Type IRQn)a 割り込み/例外処理のペンディングステータスを1にセット
void NVIC_ClearPendingIRQ(IRQn_Type IRQn)a 割り込み/例外処理のペンディングステータスを0にクリアー
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)a 割り込み/例外処理のペンディングステータスの読み出し。ペンディングステータスが1に設定される場合、この機能は0でない値を返す。
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)a 設定可能なプライオリティを持つ割り込み/例外処理のプライオリティを1にセット
uint32_t NVIC_GetPriority(IRQn_Type IRQn)a 設定可能なプライオリティを持つ割り込み/例外処理のプライオリティの読み出し。この機能はリターン現在のプライオリティレベルを返す。