Armの歴史
Armの誕生
Armは、当初(1983年~85年ごろ)、英国ケンブリッジのAcorn Computers Limitedで開発されました。それは商用に開発された最初のRISCマイクロプロセッサです。1990年Advanced RISC Machines Limitedは、Armテクノロジの利用拡大を目的に設立されました。以来、Armは世界中の多くの半導体メーカにライセンスされています。
当時、Acorn Computers Limited で働いていたエンジニアの話によると、Advanced RISC Machines Limited設立の発表は、何が起こったのか、すぐには理解できなかったそうです。とにかく「何か大きな変革が起きたみたいだ」と感じたそうで、時間が経つにつれて、現実が把握できたそうです。
RISCマイクロプロセッサと言うのは、後ほど詳しく説明いたしますが、簡単に言うと、「一つの命令が実行する動作は簡単だが、高速に実行させるため、組み合わせて一連の動作を効率良く実行する。」という理論にもとづいたプロセッサです。1980年頃にスタンフォード大学、カリフォルニア大学バークレー校の研究課程で生まれました。RISCプロセッサには当時賛否両論ありましたが、ArmはRISCプロセッサ発表の5年後くらいに開発されていて、驚くほど早い対応だったといえます。
Acorn Computers Limited時代にArm1~3が開発されました。Advanced RISC Machines Limitedになっての初めての製品はArm6です。その後、携帯電話で需要の高かったArm7が開発されます。その為、事実上のArmのスタート製品はArm7と言われています。その後、機能を向上しながらArm8、Arm9、Arm10、Arm11と次々と製品が展開されました。
Armコアは機能だけではなく、コストや低消費電力も重視しながら開発されています。その為、同じ性能の他社のコアに比べると、安価で、消費電力が少ないというメリットもユーザにもたらしてくれます。
Armのビジネスモデル
Armは半導体の製品は作りません。従って販売も行っていません。
CPUのIPを設計し、そのIPのライセンスを半導体サプライヤーと契約し、契約した半導体メーカが製品を製造し、販売します。 そして、Armに元のIPのライセンス料と、製造した各チップまたはウエハーのロイヤリティを支払います。世界の半導体およびシステムのリーディング企業がArmとライセンス契約をしており、Armのパートナー企業としてネットワークを構成しています。
現在、パートナーは900社以上で、 250億個を超えるプロセッサが製造され、出荷数は1日あたり1600万個以上です。これらの数字が、Armが世界標準のCPUであることを顕著に表しています。面白いことに、独自コアの製品しか作っていない半導体メーカ(Armから見ると、競合他社になります)でも、Armのライセンスだけは持っているというメーカも多々あります。
Armのライセンスを持っている半導体メーカはArmのホームページを見ると一覧がありますので、一度ご覧になることをお勧めします。その数の多さに驚くことと思います。
最初は得体の知れないCPUだったArm
Armは半導体の製造を行っている企業とライセンス契約を行わないとビジネスが成り立ちません。そこで、設立当初は世界中の大手半導体メーカに売り込みを行いました。
私の知り合いに実際にArmの売り込みに対応したエンジニアがいます。彼は当時、韓国の大手半導体メーカのR&DでCPUのアーキテクチャの研究/設計をしていました。ある日突然、Armがやってきてライセンス契約をしないかと持ちかけられて驚いたそうです。正直言って、そんな得体の知れない企業は信じられないので、話だけ聞いて契約はしなかったそうです。
その時は現在の様に世界中に普及するとは思ってもみなかったと、マッコリを飲みながら話してくれました。
Armのロードマップ
Armのクラシック製品
前頁で述べたように、ArmプロセッサはArm1から始まりましたが、事実上のスタートと言える製品はArm7です。今でも世界中で使われています。Arm7から機能を上げながら、Arm8、Arm9と製品が展開されました。しかし、その中でも人気のある製品と、あまり人気の出なかった製品があります。例えば、Arm8はArm7の改訂版で高機能でしたが、次に出てきたArm9に置き換えられて、非常に短命だったと聞いています。
Arm9は未だに人気が有り広く普及しています。それほどArm9が優秀だという証拠ですね。以下に、人気のある製品で今でも市場で使われているコアの特徴を挙げます。
Cortex登場
Arm11ファミリの次のコアはArm12ではなく、Cortexファミリになります。Armは携帯電話市場で急成長しましたが、現在、携帯電話以外の幅広い用途(高性能なデジタル家電から産業機器まで)に使われるようになり、幅広い性能と機能をカバーする必要が出てきました。そこで、性能や機能に関係なくCortexというファミリで統一し、用途別にアーキテクチャを定義しました。それがCortex-A、Cortex-R、Cortex-Mです。
Cortexにも色々製品がありますが、代表的な製品の主な特徴を以下に挙げます。
RISCとCISC
RISC
Reduce Instruction Set Computerの頭文字をとったものです。日本語で言うならば「縮小命令セットコンピュータ」になるでしょうか?
一つ一つの命令が実行する動作は簡単ですが、高速に実行させるため、組み合わせて一連の動作を効率良く実行するという概念で、1980年頃にスタンフォード大学、カリフォルニア大学バークレー校の研究課程で生まれ、PattersonとDitzelによって発表されたアーキテクチャです。 それまでは、一つの命令に色々複雑な仕事をさせて、効率を上げるという考え方(CISC)が主流だったので、マイコン関係者の中では驚きでした。
一つの命令の実行時間を最短にするために、命令の長さを固定にして、パイプラインという概念を採用しました。パイプライン処理は、色々な処理を段階に分割し、部分的に並列処理を行うものです。見かけ上、1クロック1命令実行を実現することができます。 ただし、条件分岐などでは、パイプラインが途切れてパイプライン障害が発生し、命令実行効率低下が起きますが、Armでは分岐投機(分岐先の予測)の機能を盛り込むことによって、パイプライン障害を最小限に抑えています。
RISCの概念は、ユーザーのメリットだけでなく、マイコンを開発する側にもメリットがあります。命令セットが簡単で単一クロックサイクル実行ですので、内部の論理が比較的簡単に作れます。マイコンを開発する手間が少なく、開発期間が短くて済みます。短期間で、新製品を市場に投入できるというわけです。
CISC
Complex Instruction Set Computerの頭文字をとったものです。RISCに対抗して言うならば、「複雑命令セットコンピュータ」になるでしょうか?一つの命令が一連の複雑な動作を実行して、マイコン全体の実行効率を上げるという概念です。マイコンの起源はCISCマイコンの概念からスタートしています。命令のフォーマットや実行時間は、各命令によって異なります。決まっていません。とにかく1命令で、できるだけの仕事をしようというものです。
RISCに比べると、命令セットは複雑になるので、マイコンを開発する手間もかかります。しかし、1命令の担う仕事が多いため、少ない命令数で多くの仕事をこなし、ROMのコード効率が良くなるという利点があります。
RISC
本文で「RISCは、1980年頃にスタンフォード大学、カリフォルニア大学バークレー校の研究課程で生まれ、PattersonとDitzelによって発表されたアーキテクチャ」だと説明しました。この時のRISCの論文は簡略化され科学雑誌に掲載されました。そして、多くのマイコン関係者が読みました。
私も、当時マイコンの設計者だったので、設計チームのみんなでこの論文を読み、RISCについて議論しました。 RISCの基本概念になる「簡単な命令を高速に実行させ、それを組み合わせて一連の動作を効率良く実行する」については、今までに無い発想でしたので、ほとんどの人が驚きました。そして、本当かどうか半信半疑でした。なにしろ、その時点では、実証する製品が無いのですから…。
しかし、「命令の長さを固定にして、パイプラインという概念を採用する」という部分は、ほとんどの設計者が疑問を持ちました。分岐命令などは、一つ前の命令の演算結果に依存して分岐しますので、分岐先が、事前にフェッチしておいたアドレスから、変わってしまう場合が生じるからです。この時、パイプライン処理では、またフェッチをし直さなくてはなりません。この様なパイプライン障害が発生すると、 1クロック1命令実行の概念が適応できません。さらに、命令自体の機能が簡単なので、非常に効率の悪い結果を生み出すことになります。これが大きな障壁となって、RISCの実現化は難しいと考えられていました。(少なくとも私のチームでは)
しかし、RISCマイコンは論文の発表後すぐに製品化されました。ArmもRISC発表後、5年くらいでRISCの概念を取り入れた製品を発表しました。そして、Arm11で、RISCの欠点であるパイプライン障害の被害を最小に抑える分岐投機(分岐先の予測)の機能を盛り込んでいます。 現在のCortexには、すべてのシリーズで分岐投機の機能が採用されています。それでもパイプライン障害を完全になくすことはできませんが、命令の実行効率はかなり改善されています。
Cortex
Cortex
Cortexには、Cortex-AとCortex-RとCortex-Mがあります。AはApplication、RはReal time、MはMicrocontrollerの各々の頭文字からとりました。もうお気付きだと思いますが、並べるとArmになります。今回はCortex-Mについて詳しく述べるのが目的なので、Cortex-AとCortex-Rを深く掘り下げませんが、以下簡単に説明しておきます。
Cortex-A
Cortex-AのアーキテクチャはArmv7-Aになります。代表的なシリーズとしてはCotex-A8等があります。処理能力は2.0DMIPS/MHzで、 Cortexの中では最高性能です。180nmプロセスを使った場合の想定で、最大1GHzで動作できる設計になっています。最近は90nmプロセスの製品も出てきていますので、さらに高速動作が可能になるでしょう。コンセプトは、OSやユーザアプリケーションのためのアプリケーションプロセッサです。
Cortex-R
Cortex-RのアーキテクチャはArmv7-Rになります。代表的なシリーズとしてはCotex-R4、R4F等があります。処理能力は1.66DMIPS/MHzで、 Cortex-Aに比べればすこし劣りますが、それでも充分高性能です。180nmプロセスを使った場合の想定で、最大300MHzで動作できる設計になっています。コンセプトは、実時間信号処理や制御のための組み込みプロセッサです。
Cortex-M
Cortex-MのアーキテクチャはArmv7-Mになります。シリーズとしてはCotex-M0、M1、M3、M4があります。処理能力はCortex-M0は0.9DMIPS/MHzで、 Cortex-M3とM4は1.25DMIPS/MHzです。DMIPSのベンチマークには浮動小数点の演算がないので、M4もM3と同じになります。Cortex-AやRに比べれば劣りますが、マイクロコントローラとしては充分高性能です。180nmプロセスを使った場合の想定で、最大100MHzで動作できる設計になっています。しかし、すでに90nmプロセスのCortex-M3の製品が有り、120MHz/150DMIPSという製品が市場に出ています。コンセプトは、マイクロコントローラ アプリケーション向けのコスト重視のソリューションです。
Cortex-Mの特徴
Cortex-Mの基本はCortex-M3です。これにDSP、SIMD、FP機能/命令が追加されているのがCortex-M4です。また、Cortex-M3から、命令セットを減らし、ハードウェア割り算やビットバンディング機能も削除したのがCortex-M0です。Cortex-M1はFPGA専用コアです。機能的にはCortex-M0と同等ですが、汎用製品はありませんので、今回は除外いたします。
以下にCortex-M3の基本となる特徴を示します。
- Arm v7-M アーキテクチャ
- Thumb-2 命令セット アーキテクチャ
- 32ビットコードの性能と16ビットの高いコード密度の両方を提供
- ハーバードアーキテクチャ
- 独立のI&Dバスにより命令フェッチとデータアクセスが並行実行
- 統合ネスト型ベクタ割り込みコントローラ(NVIC)
- オーバーヘッドの少ない割り込み処理が可能
- ベクタテーブルは命令方式ではなくアドレス方式
- 完全C言語対応
- リセット、割り込み、例外処理もC言語で対応可能
- 統合バスマトリックス
- バスアービター
- ビットバンディング
- アトミックビット操作が可能
- ライトバッファ
- メモリインターフェース(I&D)+ システムインターフェース & 専用ペリフェラルバス
- リアルタイムOS、スケジュールタスクの為の統合システムタイマ
- 3段パイプライン:フェッチ、デコード、実行
- シングルサイクル乗算
- UDIV & SDIV(符号付、符号なし除算)
- 除算は、被除数と除数によって、2から12サイクルで実行
- 被除数と除数がほぼ同じサイズの場合、除算は少ないサイクルで終了
- 除算は中断可能(破棄/再始動)
Cortex-Mプロセッサ
CPUコアの移植性
一般的にアプリーケーションの機能によって、CPUコアのビット数は決まってきます。比較的低機能なアプリケーションには、8/16ビットCPUコア、中機能のアプリケーションには16/32ビットCPUコア、高機能なアプリケーションになると32ビットもしくはDSPが使われます。 しかし一般的に、ビット数が変わるとCPUコアも変わります。ひとつの半導体メーカでも、多くのCPUを準備しているにもかかわらず互換性がないという場合が多くあります。
Cortex-Mシリーズでは、その様な問題が発生しないように、M0、M3、M4ではソフトウェアのバイナリレベルでの互換性を持たせ、開発ツールも互換性を持たせることにより、ユーザの使い勝手を向上しています。
ソフトウェアの互換性
Cortex-Mプロセッサ間にはソフトウェアのバイナリ互換性があります。その為M0 ⇔ M3 ⇔ M4の移行が容易に行えます。
Cortex-Mxコアの命令セットは、xの数字が大きいコアは小さいコアの完全上位互換です。従って、直接移行が可能です。MCUのクロック速度向上やフォン・ノイマンからハーバードアーキテクチャへの移行で、パフォーマンスを簡単に向上させることができます。 上位の製品に移行する場合は、コードの再コンパイルを推奨します。
なぜなら、Cortex-M0からCortex-M3への移行、 Cortex-M3からCortex-M4への移行は、より高機能な命令セットが使用可能だからです。 (ハードウェアも異なります) M0の命令数は56命令のみで、かつほとんどが16ビット長命令です。これらの命令はM3と互換性がありますので、バイナリレベルでそのまま移行することは可能ですが、再コンパイルを行うことで、M3の持つ多くの32ビット長命令を使うことができ、コード効率がグンっと上がります。
M3からM4への移行では、再コンパイルすることにより、M4の持つ浮動少数点(FPU)演算命令、DSP命令、積和演算命令(SIMD)が使用可能になり、高機能を実現することが可能です。 逆の場合、M4→M3、M3→M0の移行では、命令数が削減される方向ですので、再コンパイルは必須です。
ターゲットアプリケーション
M0は、ローエンドアプリケーションの8/16ビットCPUの置き換えに位置付けられます。ゲート数も16ビットプロセッサとほぼ同じですので、コスト的にも最適化されているといえます。
M3はミドルのアプリケーションの16/32ビットCPUの置き換えに位置付けられます。オールラウンドプレイヤーのイメージです。
M4はハイエンドアプリケーションの32ビット/DSPの置き換えに位置付けられます。FPU命令、DSP命令、積和演算命令(SIMD)、飽和演算命令等で、怖いもの無しです。
Cortex-M0、M3、M4
Cortex-M0
ゲート数は、16ビットプロセッサとほぼ同じと述べましたが、 性能は、Cortex-M3よりも25~30%低いだけです。逆にエネルギー効率の観点から見ると、M3よりも優れていると言えるでしょう。
以下が主な特徴になります。
- 56命令のみ(32ビットのThumb 命令のBL、DMB、DSB、ISB、MRS、MSR以外は全部16ビットThumbコード)
- ハードウェア割り算器なし
- Load/Store命令の実行時間は2サイクル
- ほとんどのMOV、加算、減算、比較、論理演算、シフト命令は1サイクル
- ブランチ命令は1~4サイクル(条件、リンクに依存)
- 32ビット x 32ビット掛け算、結果は32ビット:1サイクル
- ブレークポイント/ウォッチポイント削減 (4/2)
- Serial-Wire-Debug(SWD)のみ対応。(JTAG回路無し)
- 特権レベルはサポート無し
- ビットバンディング無し
- アンアラインドデータの使用不可
Cortex-M3
特徴は、上記「Cortex」の章で、すでに説明済みです。
Cortex-M4
M3に以下の機能が追加になっています。
- DSP及びSIMD拡張命令セット
- シングルサイクルMAC演算(32 x 32 + 64 → 64)
- 16-ビット MAC時(dual 16-ビット MAC)→ M3の4倍の高性能
- 32-ビット MAC時 → M3の2倍の高性能
- 64-ビット MAC時 最大 → M3の7倍の高性能
- 単精度浮動小数点ユニット(FPU)(オプション)
- パワー・ダウン機能付き
- 飽和演算
- 最小/最大値のクリッピングにより変数のオーバフローを防ぎ、ソフトウェアのレンジチェックによるCPUの負荷を軽減します。オーディオアプリケーションやコントロールアプリケーションで、PIDコントローラの積分項は時間経過と共に継続で演算されます。飽和演算は自動的に変数値を制限し、レギュレータ毎のCPUサイクルを低減します。
Arm7からCortex-M3へ
Arm7とCortex-M3の比較
Arm7の後継シリーズはCortex-M3になります。
Cortex-M3はArm7から何が改善されているのでしょう。
下表にArm7とCortex-M3の比較をまとめてみました。
命令セット
Arm命令(32ビット長)とThumb命令(16ビット長)からThumb-2命令(16ビット長、32ビット長混在)に統一されています。
演算能力の向上
DMIPS/MHzの比較では、0.74(Thumb命令使用時)/ 0.93(Arm命令使用時)から1.25に向上しています。 DMIPS/MHzが1.0以上という事は、1クロック1命令よりも効率良く演算が行われることを意味します。
パイプライン
段数は変わらず3段ですが、分岐投機機能が追加されています。
割り込み
Arm7ではアセンブラで処理していた例外処理はCortex-M3ではハードウェアが処理します。その為、割り込み処理のオーバーヘッドが短縮されています。また、アセンブラコードを使用しない(C言語)で割り込み処理を記述可能です。
メモリマップ
メモリのアドレス割付は固定です。これはビットバンド処理を行う時にエイリアスとオリジナルの位置関係を変えられない為です。ビットバンドの詳細は別途説明いたします。
デバッグピンの削減
トレースインターフェース用ピンを9ピンから2~3ピンに削減し、汎用IOピンに使用できるピンが増加しています。この様にピンのオーバーヘッドが削減されています。
アトミックビット操作(ビットバンディング)
ビット操作が容易に行うことができる機能が追加されています。したがって、ビット単位のアクセスが改善されています。
組み込みスリープ制御とパワーダウンモード
CPU独自の低消費電力モードが新設されました。マイコンの低消費電力モードの時には、CPUも低消費電力モードに入ります。
オプション
メモリの管理を容易にする小範囲メモリプロテクトユニット(MPU)と、命令トレースを可能視する組み込みトレースマクロセル(ETM)がオプションで準備されています。オプションといってもユーザが選ぶのではなく、IPのライセンスを受けているマイコンベンダーが選択して、製品に取り込みます。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。