IAR組込講座 2014年1月号 Cortex M(ARMマイコン) のレジスタ構成について www.iar.com CortexM3のレジスタ構成 MSP PSP R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13(SP) R14(LR) R15(PC) xPSR PRIMASK 汎用的に使えるレジスタ R0~R12 さらに、R0~R7までを下位レジスタ R8~R12までを上位レジスタと呼びます。 R13はスタックポインタとして使用します。 2つ有り切り替えて使用することができます。 R14は関数の返りアドレスを保存するリンクレジスタとして使 用します。 R15はプログラムの実行アドレスを示すPCに使用します。 xPSRは実行状態を示します。演算結果フラグ、割り込み番号、 使用する命令セット(Thumb系か否か)。 NMIとHardFault割り込みの許可・禁止を制御する NMI以外の割り込みの許可・禁止を制御する FAULTMASK www.iar.com BASEPRI 特定の優先度または低い割込みを禁止 CONTROL 使用するスタックの指定、特権/ユーザ・レベル。 PSR:プログラム・ステータス・レジスタ • 3つのステータスレジスタが組み合わさって表示。 31 30 29 28 27 N Z C V Q 26:25 24 15:10 T ICI/IT ICI/IT 9 9:0 例外番号 xPSR アプリケーションPSR N Z C V Q 例外番号 ICI/IT T 割込みPSR 実行PSR ICI/IT ビット 説明 ビット 説明 N 負 ICI/IT Z ゼロ 中断可能で中断後から継続可能な命令(ICI)ビット、 IF-then命令の実行状況ビット。 C キャリーまたはボロー T Thumb状態 V オーバーフロー 例外番号 プロセッサが操作している例外を示す。 Q スティッキ飽和フラグ www.iar.com 特権モードとスタック • CONTROLレジスタの0ビットを操作することで、特権→ ユーザに変更可能。 1 31 0 0:スレッドモード特権(reset時) 1:スレッドモードでユーザ状態 CONTROL 0:スレッドモードでデフォルトスタック(MSP)を使用 1:スレッドモードで代替スタック(PSP)を使用 特権 ユーザ 割込み/例外 ハンドラモード メインプログラムを実行 スレッドモード スレッドモード すべてのレジスタ/特殊レジスタ NVIC,SysTick, SCBなどの周辺 にアクセスできる スペシャルレジスタへのアクセ スに制限。 NVIC、SysTick、SCBにアクセ スできない。 www.iar.com CortexM0+,M3,ARM7のレジスタの違い • CortexM系とARM系はかなり異なります。 TDMI(ARM V4T) 割込みの設定 が増加 R0~R15は同様に見えるが、 動作モードによって切り替えられるため 割込み時の動作がCortexM系と異なる。 www.iar.com 関数呼び出し時のレジスタの使い方 • 関数の引数 • 32ビット以下の変数であれば、R0~R3を使用し、 • 4つを超える場合にはスタックを利用する。 • 詳細は、EWARMのC/C++開発ガイド • 関数の返り値 • 32ビットの場合は、R0を使用。 • 64ビットの場合は、R0+R1を使用。 www.iar.com をご覧ください。 Thumb2の関数呼び出し/戻りパターン例 • 関数を呼ぶときにはBL命令を用います。 0x1950: 0x9800 LDR 0x1952: 0xf7ff 0xffe3 BL 0x1956: 0x9000 STR • R0, [SP] f1 R0, [SP] 引数をR0に入れてBL命令でラベルf1に ジャンプ、このときLRに戻りアドレス 0x1956(+1)がセットされる。 関数から戻るときはいろいろですが、BX,POPなどが使用されます。 f1: 0x191c: 0x1c40 0x191e: 0x4770 ADDS BX R0, R0, #1 LR f2: 0x1920: 0x1922: 0x1926: 0x1928: www.iar.com 0xb580 0xf7ff 0xfffb 0x1c40 0xbd02 PUSH BL f1 ADDS {R7, LR} POP {R1, PC} R0, R0, #1 BX命令は、LRの内容にジャンプ (PCにセット)する。 スタックに積んだLRを POP命令で直接PCにセットする。
© Copyright 2024