ARMと私

ARMと私
中森 章
公開版(後悔版?)
注目ポイント
• ARM1のトランジスタ数、25000トランジスタ。
• 80286 → 134000トランジスタ
• 68000 → 68000トランジスタ
• 競合(していたのか?)CPUと比べて遥かに少ないトランジスタ数。
• 自ずと低消費電力に ⇒ ARMは最初から低消費電力CPUだった。
• 最初のチップは電源が繋がれておらずI/Oの漏れ電流で動作してい
た。(如何に電力を食わないかの例?)
注目ポイント
• Apple社が手を差し伸べた背景はSteve Jobの解任かも。
• Apple社は製品に対するビジョンを失っていた。
• Steve JobsはNeXTを立ち上げた。
• AppleはNewtonプロジェクトが極秘裏に進行
• ARMの存在を見逃す
• AT&TのCRISPプロセッサ(Hobbit)を使用予定
• PDAプロジェクトが進行(うまく行ってなかった?)
• Newton
→予算無し
• Jobsが離れなかったらNewtonは生まれず、ARMの発展もなかったかも…
• 1990年にApple経営陣のリストラがきっかけ
• John SculleyにリクルートされたRobin SaxbyがARMのライセンス商売を構想。
• 11月27日にApple、Acorn、VLSI TechnologiesのジョイントベンチャーAdvanced RISC
Machinesが設立(2015年はARM設立25周年)。
• Newtonプロジェクトは他のPDAプロジェクトと合体し、Hobbitをプロセッサとして世の
中に出た。
注目ポイント
• 大転機
• 1993年、TIがライセンシになる。
• 1980年代から1990年代にかけてエリクソン、モトローラ、ノキアが携帯電話分野で
対決。
• エリクソンとモトローラがベースバンドのDSP獲得目的でTIを採用。
• ノキアは(TIの紹介で)ARMに頼るしかなかった。→残り物に福があった?」
• ARMにとってノキアはARM610を大幅に性能向上させたARM7で商談獲得を試みて
いたがうまく行ってなかった。
• メモリ効率を重視する16ビットメモリに最適な命令セット(Thumb)を実装することで
成約。
• これはノキアが16ビットのH8を従来使用していたことが理由。
• ARMは16ビット長命令のThumbを開発し、ARM7の命令デコード時に32ビット長命令に変換
して実行する方式を考案してノキアの要求に応えた。
• ノキアの16ビット幅のメモリ使用時、ARMネイティブと比べて65%のコードサイズで160%の
性能を達成。
• これを切掛けにARM7は広く知れ渡り、1993年にはTIもARMとライセンス契約を結んだ。
私のARM歴
MIPS派だった私がいかにしてARMに関わるようになったのか?
まぁ、仕事の都合なんですけどね。
ARMに興味をもったきっかけ
• 『コンピュータアーキテクチャ入門』を執筆した頃からか?
• 最初にARMを見たときの感想
• 条件分岐フラグが存在する
MIPSアーキテクチャ
• 条件実行がある
と比較した場合の個
• 分岐遅延スロットがない
• 除算命令がない
人的な感想です。
• 連続レジスタ転送命令がある
• PCをアーキテクチャ的に扱える
⇒これらの特徴の殆どはARMv8では削除された
ARMv8-Aには文化の香りがしない(個人的な感想です)
フツーの命令セットアーキテクチャになってしまった!
仕事とARM
• Cortex-A9も、基本は、ARM11を脱していない
• ARM11を採用した最初のSoC開発以降は、いわば「手成り」でSoC開発。
• ワクワク感はない。
• 技術の新規性はあまり感じなかった
そんなときに…
• Cortex-Mには感動した!
• 基本的には無駄のない作り。Cortex-M4でいったん完成。
• 設計思想にチグハグ感もあるけど、試行錯誤なんでしょうね
• Coretex-M0/M0+にあるべき機能がCortex-M3/M4にしかない
Cortex-Mの話
個人的な仕事の話は詳しくはできないので、さっさとCortex-Mの話題に移ります。
Cortex-M 8不思議
• Thumb命令で対ARM性能160%の謎
• スタックポインタが8バイトアラインでないといけない謎
• Cortex-M0は最小のコアという嘘
• PCが実行する命令の2命令先を指す謎
• IPレジスタの存在意義
• ビット・バンドで周辺レジスタのビット7-0しかアクセスできない?
• スタンバイ時にSysTickタイマが動作する謎
• NVICの割り込みクリアは面倒臭い
ThumbがARMの160%の性能?
• ARMの資料ではThumbはARMに比べて約80%の性能→ではなぜ、
160%になったか?
• 答え。メモリのビット幅が16ビットだったから。
• 32ビット長命令(ARM)は命令フェッチに2倍の時間がかかる。逆によ
く160%で留まった。
スタックポインタを8バイトアラインする謎
• CCR.STKALIGNが1の場合、割り込み/例外発生時、スタックポインタ
が8バイト境界にアラインされる。このビット、Cortex-M0/M0+/M7で
は1固定で、Cortex-M3/M4では変更可能(初期値は1)。
• スタックポインタが8バイトアラインされる理由は、AAPCS(Procedure
Call Standard for the ARM Architecture)で規定されているため。
• AAPCSは、個々にコンパイルおよびアセンブルされたモジュールを連
携させるために従う必要があるレジスタの使用方法とスタックの規則
を定義する。
• つまり、スタックポインタが8バイトにアラインされてないと、C/C++のリ
ンクがうまく行かない場合がある(実行時に暴走する?)。
スタックポインタを8バイトアラインする謎
• 全プログラムをアセンブラで記述する場合に、このような制限はない。
アセンブラで記述したプログラムから、C/C++で記述されたプログラ
ムを呼び出す場合は必須。
• この話は少し眉唾。Cortex-M3/M4のみ可能かも。
• アセンブラで記述時も、割り込み/例外発生時にスタックポインタが
強制的に8バイトアラインされるので、スタックの不整合が発生する
恐れあり。
• コンパイラはスタックポインタが8バイトアラインになるようなコードを
常に生成するということです。
Cortex-M0が最小のコアだと主張する謎
• ARM® Cortex®-M0プロセッサは、提供中のARMプロセッサの中で最も
小さいプロセッサです。
• Cortex-M0プロセッサは、ゲート数が非常に少ないことから、アナロ
グ信号デバイスやミックスド シグナル デバイスにも使用できます。
• 以上はARMのサイトより
• http://www.arm.com/ja/products/processors/cortex-m/cortex-m0.php
•嘘はいけません!
Cortex-M0が最小のコアだと主張する謎
ARMの公式サイトで発表されたコア面積:
Cortex-M0+
0.035㎜2(90LP)/0.009㎜2(40G)
Cortex-M0
0.04㎜2(90LP)/0.01㎜2以上(40G)
公式見解でも
Cortex-M0+の方が
面積小といっている
なのに…
PCが2命令先を指している謎
• CISCの感覚では、PC(プログラムカウンタ)は実行している命令を指す。
• ARMはPCを直接操作できる珍しいアーキテクチャ。
• しかし、命令実行時のPCは2命令先を指している(Thumbでは4バイトさき
を指す)。
• これは、ARMの最初の実装が3段パイプラインであることに由来する。
• しかし、最近の実装ではCPUは3段パイプラインとは限らない。PCが2命令
先を指す意味もない。
• これは互換性維持のため、
• 逆に、PCを参照した場合、必ず2命令先のアドレスを得られるような工夫
がなされている。
PCが2命令先を指している謎
PC
A
命令A
命令B(A+4)
命令C(A+8)
A+4
Fetch A
A+8
Decode A
Fetch B
A+12
A+16
Execute A
Decode B
Execute B
Fetch C
Decode C
Execute C
オペランドのアドレス計算はデコード・ステージで行われる。
命令AがPCを参照する場合、デコード・ステージのPCの値は2
命令先を指している。
IPレジスタの存在意義
• IPとは「intra procedure call scratch register」の略でARMモードから
Thumbモードに移行する場合に使用する一時レジスタ
PCのLSBを1にセットすれ
• ARM→Thumb
ばThumbモードへ移行
•
00008068 <__foo_from_arm>:
8068:
e59fc000
ldr
ip, [pc]
; 8070
<__foo_from_arm+0x8>
806c:
e12fff1c
bx
ip
直接PCにロード
8070:
foo | 1
PCに分岐すれば2命令
しないのが新た
先にジャンプ。そこは既
Thumb→ARM
な謎
にARMモード
00008074 <__bar_from_thumb>:
8074:
4778
bx
pc
8076:
46c0
nop
; (mov r8, r8)
8078:
eafffff0
b
8040 <bar>
ビット・バンドで参照不能なビットがある?
• ビット・バンドはCortex-M3/M4に付随するオプション機能。SRAM領域や周辺のレジスタに対して
ビット単位のアクセスが可能になる。
• 32ビットのエイリアス領域が、それぞれの1ビットに対応する(最下位ビットのみ有効)。
• SRAMはともかく、ビット・バンド経由で周辺レジスタへアクセスする場合は注意が必要。
• 周辺レジスタはアクセス可能なビット幅が規定されている場合がある。例えば、APB下にぶら下
がっているレジスタは32ビットでのアクセスしかできないのが普通。
• ビット・バンドのエイリアス領域へのアクセスはレジスタへのアクセス可能サイズで行う必要があ
る。
• そうでない場合、結果は不定。
• 例えば、32ビットアクセスしかできない周辺レジスタに対して、ビット・バンドのエイリアス領域か
らは8ビットアクセスする場合、レジスタの値が壊れる恐れがある。
スタンバイ時にSysTickが停止しない謎
• スタンバイ時(WFI実行時)にSysTickタイマは停止するというのは各マニュアルに
記載されている。CPUクロックで動作するため。
• しかし、WFIからSysTick割り込みで起動できる場合がある。それはCPUがデバッ
グモードにいる場合。
• 例えば、プログラムをフラッシュにダウンロードする場合、CPUはデバッグモード
になる。ダウンロード直後ではデバッグモードのままなので、WFI命令を実行中
でもSysTickタイマは動き続ける。
• しかし、一度リセットを入れると、WFI命令実行時にSysTickタイマは(仕様通りに)
停止してしまう。リセット後はデバッグモードではななくなる。
• プログラムのダウンロード直後にプログラムの挙動をテストする場合は要注意。
• 評価ボード依存です。評価ボードでSysTickが動いていても、スタンドアロンで動
作させると動作しないかも。
NVICの割り込みクリアは面倒臭い
• NVICには、パルス割り込みとかレベル割り込みとの区別はない。
• ただし、割り込み発生要因にはパルス割り込みの場合とレベル割り込み
の場合がある。
• 割り込みを1クロック以上活性化すると割り込みはNVIC内にラッチされる。
• ラッチされた割り込みは、割り込みハンドラへの分岐時にクリアされるが、
その時点で割り込みが活性化されていた場合(割り込み発生要因がレベ
ル割り込みの場合)、NVICに再度割り込みがラッチされてしまう。
• 多くはレベル割り込みなので、割り込みハンドラでは当該割り込みの発生
要因を停止し、NVICの割り込みをクリアする手順が必要。
• 割り込み停止が、NVICの割り込みクリアに間に合わず、クリアしたはずな
のに割り込みが再度保持される場合も往々にしてあるので、割り込みが
確実にクリアされたことの確認が必要。
《おまけ》レジスタバイパスの実験
• レジスタバイパスとは
• ある命令のオペランドが先行する命令で書き換えられるとき、レジスタファイ
ルに書き込まれていない結果をバイパスしてリードすること。
• パイプライン処理の副産物
adds r0,r4,r4
adds r1,r0,r0
adds r2,r1,r1
adds r3,r2,r2
adds r4,r3,r3
F
レジスタライト
レジスタリード
D
E
WB
F
D
E
結果がパイパスされる
WB
《おまけ》レジスタバイパスの実験
Cortex-M0+
Cortex-M4F
Cortex-M7
Cortex-A9
バイパスによる遅れ
(サイクル数)
0
0
1
1
バイパスする命令数
0
0
1
3