HOME > ソフテックだより > 第169号(2012年9月5日発行) 技術レポート「ARM Cortex-M3の高いコード効率」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第169号(2012年9月5日発行)
技術レポート

「ARM Cortex-M3の高いコード効率」

私はソフテックで、パソコンと組み込みソフトウェア両方の開発を担当し、プロジェクトの管理もしています。
最近は弊社でも、組み込みソフトウェア開発にて、『ARMコアを搭載したCPU』を使用する機会が増えてきました。
最近の組み込み機器では「低消費電力」「高性能」「高コード効率」という要求を同時に実現することが更に重要になってきています。ARMコアがこれらを満たしていることが、使用する機会が増えている大きな要因と考えられます。
そこで、今回は今後も需要が見込まれているARMコアファミリのひとつであるCortex-M3について、取り上げたいと思います。

1. はじめに

まず英国ARMホールディングス社は、アーキテクチャの設計を行いそのライセンスを半導体メーカーへ知的財産(IP:Intellectual Property)として販売するというビジネスモデルをとるIPプロバイダーです。パートナー会社はCPUコアの提供を受け、その上に周辺機器を組み込んでCPUとして販売します。ARMコアは世界中のパートナー会社にライセンスを提供され、日本の富士通、東芝、ルネサスなどもライセンス提供を受けています。
そのARM社が開発したCPUコアファミリのひとつがCortexです。

2. 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と用途に応じて選択できるようになっています。

Cortex-Mシリーズロードマップ
図1. Cortex-Mシリーズロードマップ

このことから、Cortex-M3は組み込み向けの標準的なプロセッサとして位置づけられており、富士通(FM3ファミリ)や東芝(TX03シリーズ)もCortex-M3を採用しています。

そして、このCortex-Mには以下のな特徴があります。

  • RSIC 32ビットプロセッサ
  • ハーバードバスアーキテクチャ
  • CMSIS(Cortexマイクロコントローラ ソフトウェアインタフェース規格)
  • Thumb2命令(16/32ビット命令長混在)
  • NVIC(ネスト対応ベクタ割り込みコントローラ)
  • 消費電力モード(スリープ/ディープスリープモード)
  • ビットバンディング(ビットアドレス指定)
  • シリアルワイヤデバッグインターフェイス(CoreSight)
  • 開発ツールの共通化

今回は、この特徴の中でも、実際に使用して魅力を感じた、Thumb2命令による「高コード効率」について取り上げたいと思います。

3. ARMの 高いコード効率

一般的に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で最適化前と後でそれぞれ調査してみた結果が以下となります。

A.某社16ビットプロセッサ
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

B.ARM Cortex-M3
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)コード圧縮されたもので、このライブラリの存在も非常に助かりました。

5. まとめ

弊社で開発する組み込みソフトウェアは、小規模なものから大規模なものまでいろいろありますが、ものによっては大規模ながらも、内部ROM容量が少ない低CPUスペックを採用することでハードコストを抑えたい、ハード的な制約から外部ROMを追加できないなどの理由からプログラムサイズ(ROMサイズ)の少量化を求められる場合があります。

少量化の方法として、小規模なソフトウェアの場合、階層的なプログラム構造を崩して、プログラムコード量を減らす設計とすることで対応は可能ですが、大規模なソフトウェアの場合、そのような対応をすると、複数人数で開発が難しくなったり、コードがスパゲッティ化し不適合が多発してしまったり、将来的な改造などの保守が難しくなるなど、大きな影響を与えるケースが非常に多いです。
また、当然アセンブラで作成することも選択肢としてはあるのですが、その場合は、開発期間や費用が合わないといった問題に直面します。
そのため、大規模なソフトウェアで、コードサイズの少量化というのは難しいもので、ARMのような高いコード効率のプロセッサは、開発の現場においてはとても有効と感じました。

なお、2012年2月にMicrosoftもARM対応したWindowsを開発中と発表しています。
このことからも、ARMの需要は更に増えると思いますので、ARMについて学んでおいて損はないと思う今日このごろです。

(H.K.)

[参考文献]
「ARM Cortex-M3システム開発ガイド」Joseph Yiu 著、宇賀神 孝 長尾 和則 訳、2012年3月1日、CQ出版
Interface 2012年06月号CQ出版

関連ページへのリンク

関連するソフテックだより

ページTOPへ