手持ちのマイコン・ソフトウェアをARMマイコンへ移植する方法について解説 ―― ARM Cortex-Mマイコン・ワークショップ2013

福田 昭

tag: 組み込み 半導体

レポート 2013年6月 7日

●エンディアンの違いに注意

 既存のマイコンとARMマイコンの大きな違いに,エンディアンがある.既存のマイコンの多くはビッグ・エンディアンであるのに対し,ARMマイコンはリトル・エンディアンなのだ.ARMの命令アクセスは常にリトル・エンディアンである.メモリ・アクセスについては,ビッグ・エンディアンのメモリ・システムへもアクセスすることが可能になっている.またプライベート・ペリフェラル・バスへのアクセスはリトル・エンディアンである.

 ここで殿下氏は,外部バス経由で周辺ICを接続するときは,ハードウェアでエンディアンを変換することを推奨していた.ARMの命令セットはエンディアンを変換する命令を持っているのだが,この命令を使うと実行性能が低下するためである.

 

●メモリ保護ユニットを活用

 メモリ関連の重要なオプションに,メモリ保護ユニット(MPU)がある.8カ所のメモリ領域(リージョン)に対して,メモリ・アクセスの制限を設定できる.読み出しは可能だが書き込みを不可とする設定,特権アクセスは読み出しのみ可能でユーザ・アクセスは不可とする設定,特権アクセスは読み書き可能だがユーザ・アクセスは不可とする設定,特権アクセスとユーザ・アクセスの両方とも不可とする設定,などがある.
メモリ保護ユニットはとても重要な機能で,殿下氏は,リアルタイムOSのメモリ領域を特権アクセスに限定するだけでなく,リアルタイムOSの管理領域も特権アクセスに限定しておくといった使い方を示していた.
また非整列データ(アンアラインド・データ)のサポートやビット操作命令などによってコード・サイズを縮小できることを説明していた(図2).

 

図2 非整列データ(アンアラインドデータ)のサポートとビット操作命令

 出典:アーム(この図面は講演で使われたものではない)

※図をクリックすると拡大します
 

 

 

●データ・フォーマットと汎用レジスタでの違い

 それから既存の32ビット・マイコンとの主な違いを具体的に解説した.命令セットについては,既存の32ビット・マイコンとCortex-M3マイコンで考え方の違いは少ない.既存の32ビット・マイコンでは例えばコード・サイズを縮小するために16ビットの固定長命令を基本命令とし,使い勝手と性能を向上するために,32ビット命令を追加している.Cortex-M3マイコンでも,コード・サイズと実行性能のバランスを取るために16ビット命令と32ビット命令を混在させた命令セットを備える.

 データ・フォーマットには若干の違いがある.既存の32ビット・マイコンでは例えば8ビットのバイト・データ,16ビットのワード・データ,32ビットのロング・ワード・データで構成される.Cortex-M3マイコンでは8ビットのバイト・データ,16ビットのハーフ・ワード・データ,32ビットのワード・データ,64ビットのダブルワードデータとなり,64ビットのデータ・フォーマットが用意されている.

 汎用レジスタの構成はかなり異なる.既存の32ビット・マイコンでは例えば32ビット長のレジスタを16本(R0~R15)用意しており,R0はインデックス・レジスタとしても利用できる.またR15はスタック・ポインタ(SP)となる.Cortex-M3マイコンも汎用レジスタの本数は同じで,32ビット長のレジスタを16本(R0~R15)備える.ただし,R13はスタック・ポインタ(SP),R14はリンク・レジスタ(LR),R15はプログラム・カウンタ(PC)となる.

 

●例外処理の優先度レベルは256レベル

 例外処理は,まったく違う.既存の32ビット・マイコンでは例えば16レベル(4ビット)の優先度レベルがあり,最高の優先度はレベル15,最低の優先度はレベル0となっている.数字の大きなレベルの優先度が高い.Cortex-M3マイコンは256レベル(8ビット)と16倍もの数多くの優先度レベルがある.さらに優先度の設定は最高レベルがレベル0,最低レベルがレベル255で,数字の小さなレベルの優先度が高い.

 またCortex-M3では,割り込みマスク・レベルが下位4ビットをマスクする(0として読み出す)設定となっている.これはCortex-Mシリーズのマイコン間におけるソフトウェアの移植を簡素にするためだ.ARMv6-MアーキテクチャのCortex-M0/M0+は優先度レベルが16レベル(4ビット)なので,上位ビットを削ると優先度の逆転現象が起きてしまう.

 

●抽象化レイヤでハードウェアの違いを隠す

 Cortex-Mシリーズの各プロセッサ間でソフトウェアの互換性を保つために不可欠なのが,ハードウェアを抽象化するレイヤであるCMSIS(Cortex Microcontroller Software Interface Standard)だ.CMSISにより,プロセッサの違いとマイコン・ベンダの違いを隠ぺいする.

 それから初期化処理ではクロック回路の設定とPLLの初期化が必須であることや,ARMマイコン用のCコンパイラがポインタや関数などを厳密にチェックしていることなどを示した.チェックがあまりに厳密なので,プログラマ同士の人間関係を悪化させかねないと冗談交じりに殿下氏は説明していた.

 続いて既存のマイコンとCortex-M3マイコンでコード・サイズを比較した.例えば既存の32ビット・マイコンでは23,824バイトあったコードが,Cotex-M3マイコンでは17,680バイトに減少した.およそ25%の減少である.さらに,既存の16ビット・マイコンで21,452バイトあったコードは,Cortex-M3マイコンでは17,680バイトに減少した.16ビット・マイコンと比べてもコード・サイズが18%ほど減少している.

 これらはいずれもコンパイラで最適化処理を行ったもので,最適化処理を無効にした場合は,既存の32ビット・マイコンでは42Kバイトほどあったコードが,Cortex-M3マイコンでは21Kバイトと約半分に減ったという結果も示していた.

 このほかプログラミングのちょっとした工夫として,ループのカウンタ方向はカウントダウンを推奨していた.カウントアップに比べると,命令1個とレジスタ1個を減らせるので,コード・サイズが小さくなり,実行速度が高まる.

 

 

ふくだ・あきら
フリーランステクノロジーライター
http://d.hatena.ne.jp/affiliate_with/

 

 

«  1  2
組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日