Cortex M

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にセットする。