重要な情報
-
EWARM 6.10.2の新機能:
--guard_calls
コマンドラインオプションが導入されました。--guard_calls
は、常にEC++/C++で記述された、スレッドセーフのライブラリ関数呼出しを必要とするアプリケーションで使用する必要がある点に注意してください。詳しくは、開発ガイドを参照してください。--no_guard_calls
コマンドラインオプションが削除されました。--aeabi
コマンドラインオプションの動作が変更になり、保護呼出しがデフォルトで使用されなくなりました。
ARM 5.xおよび6.10.1用IAR C/C++コンパイラからARM 6.10.2用IAR C/C++コンパイラへの移行手順:--aeabi
(--no_guard_calls
なし)は--aeabi --guard_calls
に置換--aeabi --no_guard_calls
は--aeabi
に置換
-
EWARM 6.20の新機能:
time()
関数を実装したユーザは、名称を__time32()
に変更してください。詳しくは、開発ガイドを参照してください。 -
CMSIS統合に関する特記事項:
アプリケーションのソースコードにCMSISヘッダファイルが明示的にインクルードされている場合、[CMSISを使用]チェックボックス[プロジェクト]>[オプション]...>[一般オプション]>[ライブラリ構成]>[CMSISを使用]を選択しないでください。一部のCortex-Mアプリケーションの例には、CMSISのソースファイルが明示的にインクルードされています。これらのプロジェクトでは前述のチェックボックスを選択しないでください。
ただし、ARM用IAR C/C++ Compilerの進化によって、旧バージョンのCMSISと最新バージョンのコンパイラは互換性がありません。この問題を解決する簡単な一例は以下のとおりです:
a) F4を押して間違ったソース(ヘッダ)ファイルをエディタで開きます。通常はcore_cm3.h
というファイル名です。
b) エディタウィンドウの[ウィンドウ]タブを右クリックして、[ファイルプロパティ...]を選択します。
c) ファイル名に何らかの文字を追加(または削除)して、コンパイラが見つけられないようにします。
d) プロジェクトオプションを変更します:[プロジェクト]>[オプション...]>[一般オプション]>[ライブラリ構成]>[CMSISを使用]を選択します。
手順 a) から c) は、複数のファイルに対して行わなければならないことがあります。通常はこれらのファイル名core_cm0.h
、core_cm3.h
、core_cm4.h
、core_cmFunc.h
、core_cmInstr.h
です。
ARM用IAR Embedded WorkbenchでのCMSISの統合について詳しくは、開発ガイドを参照してください。 -
ランタイムライブラリでは、アラインメントされていないアクセスはアーキテクチャ内で使用可能であれば認められることが前提です。
アラインメントされていないアクセスが許可されて、より効率的なコードを生成する可能性があるARMコアアーキテクチャの場合、これを活用するためにランタイムライブラリがビルドされます。たとえば、Cortex-M3のライブラリでは、
UNALIGN_TRP
ビットが組込みアプリケーションにより設定されていないものと想定します。 -
ARMアーキテクチャv4用のコンパイルが廃止されている場合に相互作用機能を使用しない
現状では、このモードは製品の以前のバージョンでサポートされていますが、C-RUNなどの新しい機能はこのモードに対応しなくなる予定です。
廃止された機能
-
--use_old_syntax
コンパイラオプション
--use_old_syntax
は、ARM用IAR C/C++コンパイラの将来のバージョンから削除される予定です。 -
--interwork
ARM用IAR C/C++コンパイラの将来のバージョンでは、ARMv4Tアーキテクチャに対してコードを生成する際、
--interwork
が使用されます。ARMv4Tに対して非相互作用コードを生成するオプションはなくなります。
-
新機能
- なし
既知の問題
-
__packed
または#pragma pack
を使用する型を持つ、データオブジェクトのイニシャライザを含むアセンブラファイルリストが間違っています。
[EW23889] -
MISRA-C:2004規則9.1で、使用済みの初期化されていないローカル変数のすべてが見つかりません。
[EW24720] -
オーバロードの解決アルゴリズムで、最適の組込み演算子がどれかを探す際に、引数を差し引くためのテンプレートのユーザー変換が考慮されません。
[EW24930] -
va_list
型のパラメータをC++関数に渡し、呼出し元があるオブジェクトファイルに定義され、呼出し先が別のオブジェクトファイルに定義されている場合、2つのオブジェクトのいずれかがEWARM 7.20 (またはそれ以降)でビルドされ、もう一方がEWARM 7.10 (またはそれ以前)でビルドされている場合、リンカエラーとなります。
[EW25660]
プログラム修正
-
ユーザ指定のセクション/セグメントに配置され、ゼロの値で明示的に初期化された変数は、コンパイラによって誤って最適化され、copy initではなくzero initとなります。
[EW25498] -
割り当てられたヒープ空間の外への間違った書込みを検出するデバッグヒープの能力が向上しました。間違った書込みが検出されないことはまだありますが、大半は検出されるようになりました。
[EW25682] -
ヒープのリークチェックを実行する際、ペイロードのサイズが0(通常は
malloc(0)
呼出しの結果)のヒープブロックが常にリークと見なされます。
[EW25684] -
ヒープのリークチェックを実行する際、遅延リストがアクティブになっていると、遅延リストにあるすべてのヒープブロックがリークとして報告されます。
[EW25685] -
VFPに対してコンパイルする際、
VLDR
命令がアラインメントされていないデータのロードに使用される可能性があります。これは、__packed
または#pragma pack
が使用されている場合に起こります。その結果、アドレスが実際にアラインメントされていなければ、「ハード障害」割込みとなります。
[EW25708] -
スタック上の変数の寿命が、
setjmp
への呼出しを介して正しく処理されません。これによって、重複していない寿命を持つ2つの変数がスタック上の同じ位置に割り当てられ、setjmp
呼出しで変数の寿命に対して値が保持されないことがあります。
[EW25735] -
最適化レベル「高」の場合、変数(v)を使用すると次の場合に誤って最適化されることがあります。
1) その定義におけるvの前回の使用が別の変数(c)のバイナリ処理に現れる、
2) 1つまたは複数の基本ブロックのプレデセッサにおいてcに定数値が割り当てられている、
3) バイナリ処理がcが割り当てられている定数のいずれかに対する識別処理である、
4) vに間接的な定義がある。
[EW25739] -
Long long
による0xFFFFFFFF00000000
追加または0x100000000
減算が間違って最適化されることがあります。
[EW25745] -
最適化レベル「高」でThumb-2コードを生成する場合、スタック上の配列へのバイト割当てによって、稀に予期しない
STRB
命令が生じることがあります(スタックポインタがオフセットレジスタとして使用されます)。
[EW25778]
ユーザガイドの訂正
RAM空間を節約する7.40.2の新しいコンパイラオプション
-
構文
--no_var_align
説明-
デフォルトでは、サイズが4バイト以上のオブジェクトに対してアラインメント4がコンパイラで使用されます。このオプションは、コンパイラで変数オブジェクトをそれらの型のアラインメントに基づいてアラインメントする場合に使用します。
たとえば、char配列はアラインメント1になります。char型のエレメントはアラインメント1を持つためです。このオプションを使用すると、ROM空間を節約できる可能性がありますが、処理速度が遅くなります。
ARM用IAR C/C++開発ガイドも参照してください。-
アラインメント、317ページ。
--no_const_align
、269ページ。
その他
-
デバイスのエラッタで使用可能な対策:
-
SLEEPONEXIT
単一命令ISR
でARM Cortex-M3エラッタ463764がフリーズすることがあります。
詳細はinfocenter.arm.comにあります。
属性__irq
の関数についてiccarm --enable_hardware_workaround=arm463764
で対策が講じられました。EWARMサポート対象(5.41から)。 -
ベースがリストにあるARM Cortex-M3エラッタ602117
LDRDにより、割込みや失敗があると間違ったベースレジスタとなることがあります。EWARM 5.20.3からは、コンパイラ/ライブラリはリストにベースレジスタを持つLDRD命令を回避するようになりました。 -
ARM Cortex-M3エラッタ752419
ARM Cortex-M4エラッタ752770
SPへの割込みされたロードにより、動作が間違うことがあります。EWARM 6.21からは、コンパイラ/ライブラリはRnへのライトバックを持つLDR SP命令を生成しなくなりました。それ以外の場合、スタックは複数のリードが可能なRAM内に常駐しているため、追加のリードも認められます。 -
ARM Cortex-M7エラッタ833872
ITブロック内にフラグ設定命令があると、後続の命令が間違って実行されることがあります。EWARM 7.40からは、コンパイラはこの特定のコードパターンにおいてIT変換を省略します。 -
ARM Cortex-M3エラッタ838469
ARM Cortex-M4エラッタ838869
ストアイミディエイトの重複例外リターン処理が間違った割込みのベクタとなることがあります。ユーザはエラッタのガイドラインに従い、適切な場合には__DSB(void)を使用することでARMの推奨する対策を実行してください。 -
NXPデバイスLPC2478におけるCore.1の機能上の問題:ThumbステートでのAbort Linkレジスタの間違ったアップデート。
iccarm --enable_hardware_workaround=NXP_Core.1
を用いて作成された対策 -
Stellarisのデバイスにおける機能上の問題 :SRAMへのワードにアラインメントされないライトによって、 間違った値がロードされる可能性があります。詳細は、StellarisのWebサイト(www.ti.com/stellaris)にあります。
iccarm --enable_hardware_workaround=LM3S_NWA_SRAM_Write
で対策が講じられました。 -
Freescale Semiconductors MC9328MX1 (i.MX1)、マスク 0L44N、1L44N、および 2L44Nにおける機能の問題:
LDM
命令は、一部のケースで2番目のレジスタを正常にロードしません。iccarm --enable_hardware_workaround=920t-ldm2
を用いて作成された対策
注記:現在のEWARMバージョンのライブラリは、この対策ではビルドされません。EWARM 6.50.6とリンカオプション--enable_hardware_workaround=920t-ldm2
を用いて、このハードウェア回避策によってビルドされたライブラリを使用できます。
-
-
va_args
関数の実装は、ARM 7.20.1用IAR Embedded Workbenchで変更されました。旧バージョンのコンパイラからプリプロセッサの出力をコンパイルすることはできなくなりました。元のソースコードは、ARM 7.20.1用IAR Embedded Workbenchを使用して再度処理する必要があります。
リリース履歴
-
リリース履歴を参照してください。