命令セットの概要
Cortex-M3の命令セット
従来のArmプロセッサはArm命令(32ビット)とThumb命令(16ビット)の2つの命令セットを採用していました。しかし、Cortex-M3はArm命令セットを採用せず、Thumb命令セットの新版であるThumb-2命令セットを採用しています。
Thumb-2命令セットは従来のThumb命令セットバイナリ互換で、従来のThumbプログラムを再コンパイルせずにそのまま動作します。
Thumb-2は16ビットと32ビットの混在命令セットで、従来のThumb命令では採用できなかった命令が追加されています。そのためArm命令でしか記述できなかった特権命令が存在し、Arm命令が無くてもすべての処理が記述できます。
また、ビット操作命令、除算命令やテーブル分岐命令なども追加されています。
テーブル分岐命令
テーブルを使い、変数の値に基づいてプログラムフローを制御するのは、高級言語で一般的な機能です。これは、ArmおよびThumb命令セットについても当てはまります。
Armは高性能コードに使用されることが多く、コンパイラがサイズを犠牲にして速度を優先したコードシーケンスを選択する傾向があります。逆にThumbコンパイラは、パックデータテーブルを使ったコードシーケンスで、組み合わせたコードとテーブルが使用するメモリを最小限に抑える傾向があります。
Thumb-2コア技術では、両方のテクニックの長所を組み合わせたテーブル分岐命令を使用します。このため、パックデータに使用する命令数が最小限となり、極めて少ないコードおよびデータフットプリントで最大限の性能を発揮します。
IT – if then –
Arm命令セットには、すべての命令を条件付きで実行する機能があります。この機能は、コンパイラが短い条件節を構成するコードを生成する際に有効です。しかし、Thumb 16ビット命令のエンコードスペースには、この機能を維持するのに十分なスペースがないため、Thumbコンパイラにこの機能はありません。
しかしThumb-2コア技術には、同様のメカニズムを提供する命令があります。このIT命令は、ステータスレジスタに含まれる1本以上の条件フラグに基づいた条件コードのうち、1つの条件コードに基づく最大4本のThumb命令ブロックが生成可能です。これにより、ThumbコードがArmコードに近いレベルの性能を発揮します。
Arm | Thumb | Thumb-2 |
---|---|---|
LDREQ r0,[r1] | BNE L1 | ITETE EQ(if then命令) |
LDRNE r0,[r2] | LDR r0, [r1] | LDR r0, [r1] |
ADDEQ r0, r3, r0 | ADD r0, r3, r0 | LDR r0, [r2] |
ADDNE r0, r4, r0 | B L2 | ADD r0, r3, r0 |
— | L1 | ADD r0, r4, r0 |
— | LDR r0, [r2] | — |
— | ADD r0, r4, r0 | — |
— | L2 | — |
上記の例では、Armコードが16バイト、Thumbコードが12バイト、Thumb-2コア技術コードが10バイトを使用しています。Armコードは実行に4サイクル、Thumbコードは4~20サイクル、Thumb-2コア技術コードは4または5サイクルかかります。Thumbのサイクル数は、分岐が正確に予測されるかどうかによって決まります。Thumb-2コア技術の場合、IT命令を分岐命令と同様にフォールドできるため、サイクル数が5から4に減っています。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。