アンアラインド・データ・アクセス、動作モード、特権アクセス

アンアラインド・データ・アクセス

Cortex-M3はアンアラインド・データ・アクセスをサポートしています。8ビット、16ビット、32ビットデータをRAM等のメモリに格納する場合、アンアラインド・データ・アクセスをサポートしていれば、無駄な領域を作らず各々のデータをRAMに格納することができます。例えばSRAMメモリでは25%以上削減可能です。

アンアラインド・データ・アクセス

Cortex-M3は32ビットマイコンですから、32ビット毎にアライメントされています。すなわちCPUがアクセスするデータの単位は32ビットです。しかし8ビットや16ビットデータをメモリに格納する際、アンアラインド・データ・アクセスを使わなければ、32ビットのアラインメント(境界線)をまたいでデータを格納することはしません。そのため、8ビットデータなら32-8=24ビット、16ビットデータなら32-16=16ビットの無駄な領域ができることになります。(下図左側参照)。アンアラインド・データ・アクセスを使うと、 32ビットのアラインメント(境界線)をまたいで、順番にデータを格納します。(下図右側参照)このため、メモリを無駄なく有効に使うことができます。

図1

記述例(IARのツールの場合)

アラインメントをまたぐデータをアクセスするためには、#pragma pack(n) を付加した構造体を定義します。下記が記述例です

								#pragma pack(1)
								struct {
									short s;	// 2 byte
									char c;		// 1 byte
									long l;		// 4 byte
									char c2;	// 1 byte
								} s;
								

これが8バイトにおさまります。

コンパイラの種類やコンパイラのバージョンによって割り当ての仕方が異なるものなのでしょうか?データの割り当ては通常は同じです。ただし、常に同じであることを保証している訳ではありませんので気をつけて下さい。(変わっていても文句は言えません)

プログラムの記述方法については、どうでしょう?データの配置の仕方は各コンパイラのマニュアルで定義されていますので、マニュアルに従って下さい。(例えば、ARM IAR C/C++ Development Guide

アンアラインド・データ・アクセスはCortex-M3で初めて取り入れられた手法ではありません。導入されたのはARMv6です。