「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私はソフテックで、パソコンと組み込みソフトウェア両方の開発を担当し、プロジェクトの管理もしています。
最近は弊社でも、組み込みソフトウェア開発にて、『ARMコアを搭載したCPU』を使用する機会が増えてきました。
最近の組み込み機器では「低消費電力」「高性能」「高コード効率」という要求を同時に実現することが更に重要になってきています。ARMコアがこれらを満たしていることが、使用する機会が増えている大きな要因と考えられます。
そこで、今回は今後も需要が見込まれているARMコアファミリのひとつであるCortex-M3について、取り上げたいと思います。
まず英国ARMホールディングス社は、アーキテクチャの設計を行いそのライセンスを半導体メーカーへ知的財産(IP:Intellectual Property)として販売するというビジネスモデルをとるIPプロバイダーです。パートナー会社はCPUコアの提供を受け、その上に周辺機器を組み込んでCPUとして販売します。ARMコアは世界中のパートナー会社にライセンスを提供され、日本の富士通、東芝、ルネサスなどもライセンス提供を受けています。
そのARM社が開発したCPUコアファミリのひとつがCortexです。
CortexはカテゴリをA、R、Mの3つのシリーズに分けて、必要とされる分野へそれぞれのプロセッサを提供しています。
Cortex-Aシリーズ ‐ 高性能のアプリケーションプラットホーム用に設計されたシリーズ。
LinuxやAndroidなどハイエンドな組み込み用OSを使用するスマートフォンなどを想定し、動作周波数も1GHzを超える。また、直接Javaのバイトコードの実行も可能で、マルチメディアデータも効率的に処理する機能も組み込み可。
Cortex-Rシリーズ ‐ 高性能なリアルタイム性能が求められる、組み込みシステムのために設計されたシリーズ。ハードディスクドライブコントローラーなどの高性能なリアルタイム制御が必要な機器を想定し、動作周波数の目安は数百MHz。
Cortex-Mシリーズ ‐ 低消費電力の組み込みマイクロコントローラ用に設計されたシリーズ。小型の組み込み機器全般を想定し、動作周波数の目安は数十MHz。
さらにMシリーズは、下図のようにCortex-M0、Cortex-M3、Cortex-M4とFPGA向けのCortex-M1と用途に応じて選択できるようになっています。
図1. Cortex-Mシリーズロードマップ
このことから、Cortex-M3は組み込み向けの標準的なプロセッサとして位置づけられており、富士通(FM3ファミリ)や東芝(TX03シリーズ)もCortex-M3を採用しています。
そして、このCortex-Mには以下のな特徴があります。
今回は、この特徴の中でも、実際に使用して魅力を感じた、Thumb2命令による「高コード効率」について取り上げたいと思います。
一般的に32ビットプロセッサでは、命令長も32ビット長が使用されますが、ARMプロセッサでは、32ビット命令を16ビット長の命令コードに圧縮し、動作時には32ビット長へ伸張して実行するという方法が可能です。このアーキテクチャはThumbと呼ばれ、高いコード密度を実現すると言われています。
また、Thumb命令では32ビット命令を実行する際には動作モードの切り替えが必要でしたが、Thumb2命令では、切り替えのオーバーヘッドなしで高速に実行できるようなっています。
ARM社が公開している「EEMBC社による相対的なCoreMarkテスト(ベンチマークテスト)サイズを使用したコード サイズの比較」では、他プロセッサとCortex-Mのコードサイズで、1.1〜2.0倍程度の差があるという結果が公開されています。
そこで、実際に開発で使用したコードにおいて、某社の16ビットプロセッサとCortex-M3でのコードサイズを比較してみたところ、以下のような結果となりました。(最適化なし)
Object No. |
A.某社16ビット プロセッサ(Byte) |
B.ARM Cortex-M3(Byte) |
コード差 (Byte)[A-B] |
コード比率 [A/B] |
---|---|---|---|---|
1 | 446 | 1692 | -1246 | 0.26 |
2 | 1756 | 688 | 1068 | 2.55 |
3 | 1714 | 664 | 1050 | 2.58 |
4 | 1756 | 720 | 1036 | 2.44 |
5 | 1714 | 1692 | 22 | 1.01 |
6 | 2850 | 1708 | 1142 | 1.67 |
7 | 3648 | 1754 | 1894 | 2.08 |
8 | 3596 | 1848 | 1748 | 1.95 |
9 | 5298 | 4088 | 1210 | 1.3 |
10 | 29476 | 17440 | 12036 | 1.69 |
合計 | 52254 | 32294 | 19960 | 1.62 |
表1. コード比較
この開発では、シリーズ毎にCPUをAとBに分けて開発する必要がありました。
実際にはAとBで機能が異なりますが、C言語で共通化されている部分も多々あり、その一部を抜粋したものです。
結果からわかるように、コードサイズ差は約19KByte Cortex-M3の方が少なく、また比率も平均すると約1.6倍の違いがあり、公開されている情報通りであることが分かります。
更にARM系のコンパイラのC言語最適化は優秀だと言われていたので、AとBで最適化前と後でそれぞれ調査してみた結果が以下となります。
Object No. |
最適化前(Byte) | 最適化後(Byte) | 圧縮率(%) [最適化後/最適化前] |
---|---|---|---|
1 | 446 | 262 | 59% |
2 | 1756 | 1092 | 62% |
3 | 1714 | 1020 | 60% |
4 | 1756 | 1276 | 73% |
5 | 1714 | 1278 | 75% |
6 | 2850 | 2054 | 72% |
7 | 3648 | 2528 | 69% |
8 | 3596 | 2594 | 72% |
9 | 5298 | 4630 | 87% |
10 | 29476 | 20036 | 68% |
合計 | 52254 | 36770 | 70% |
表2. 最適化比較A
Object No. |
最適化前(Byte) | 最適化後(Byte) | 圧縮率(%) [最適化後/最適化前] |
---|---|---|---|
1 | 1692 | 424 | 25% |
2 | 688 | 524 | 76% |
3 | 664 | 428 | 64% |
4 | 720 | 180 | 25% |
5 | 1692 | 1004 | 59% |
6 | 1708 | 1000 | 59% |
7 | 1754 | 1064 | 61% |
8 | 1848 | 1344 | 73% |
9 | 4088 | 3192 | 78% |
10 | 17440 | 10824 | 62% |
合計 | 32294 | 19984 | 62% |
表3. 最適化比較B
更に、最適化後のAとBの比較結果をまとめてみました。
Object No. |
A.某社16ビット プロセッサ(Byte) |
B.ARM Cortex-M3(Byte) |
コード差 (Byte)[A-B] |
コード比率 [A/B] |
---|---|---|---|---|
1 | 262 | 424 | -162 | 0.62 |
2 | 1092 | 524 | 568 | 2.08 |
3 | 1020 | 428 | 592 | 2.38 |
4 | 1276 | 180 | 1096 | 7.09 |
5 | 1278 | 1004 | 274 | 1.27 |
6 | 2054 | 1000 | 1054 | 2.05 |
7 | 2528 | 1064 | 1464 | 2.38 |
8 | 2594 | 1344 | 1250 | 1.93 |
9 | 4630 | 3192 | 1438 | 1.45 |
10 | 20036 | 10824 | 9212 | 1.85 |
合計 | 36770 | 19984 | 16786 | 1.84 |
表4. コード比較2
このことから、最適化率はAが70%であるのに対してBは62%であり、たしかにCortex-M3の圧縮率が8%も高い結果となりました。
また、最適化後の両プロセッサでの比較でも、コードサイズは約16KByte Cortex-M3の方が少なく、また比率も平均すると約1.8倍の違いがあるという結果となっています。
たかが16KByteの差、たかが8%の差に見えるかもしれませんが、実際のコードは、今抜粋している何倍ものコードサイズになります。
一般的に、「最適化あり」のコードサイズから更に8%下げることは、コーディングミスなどによる余計なコードが残っている場合を除き、構造的な変更をしない限りとても難しいものです。
そのため、ROM容量が厳しいことが見込まれる組み込みソフトウェアの開発では、設計時点で使用ROM容量予測を行い、また、途中で変更が入るたびにも再度予測をしなおすという作業を繰り返し行うことになります。
なお、余談ですが、Cortex-M3では、デフォルトのCライブラリの代替ライブラリとして、MicroLIBというライブラリが準備されています。これは、デフォルトのCライブラリよりも約40%(約15KByte→約6KByte)コード圧縮されたもので、このライブラリの存在も非常に助かりました。
弊社で開発する組み込みソフトウェアは、小規模なものから大規模なものまでいろいろありますが、ものによっては大規模ながらも、内部ROM容量が少ない低CPUスペックを採用することでハードコストを抑えたい、ハード的な制約から外部ROMを追加できないなどの理由からプログラムサイズ(ROMサイズ)の少量化を求められる場合があります。
少量化の方法として、小規模なソフトウェアの場合、階層的なプログラム構造を崩して、プログラムコード量を減らす設計とすることで対応は可能ですが、大規模なソフトウェアの場合、そのような対応をすると、複数人数で開発が難しくなったり、コードがスパゲッティ化し不適合が多発してしまったり、将来的な改造などの保守が難しくなるなど、大きな影響を与えるケースが非常に多いです。
また、当然アセンブラで作成することも選択肢としてはあるのですが、その場合は、開発期間や費用が合わないといった問題に直面します。
そのため、大規模なソフトウェアで、コードサイズの少量化というのは難しいもので、ARMのような高いコード効率のプロセッサは、開発の現場においてはとても有効と感じました。
なお、2012年2月にMicrosoftもARM対応したWindowsを開発中と発表しています。
このことからも、ARMの需要は更に増えると思いますので、ARMについて学んでおいて損はないと思う今日このごろです。
(H.K.)
関連ページへのリンク
関連するソフテックだより