重要な情報
- バージョン 7.60 で C-STAT の動作を変更
既存のおよび追加されたコーディングルールの両方の分析の制度を増やすために、解析エンジンが向上しています。これにより有効なチェックが全く同じ場合でも、ファイルやプロジェクトに発行されたメッセージ数は、C-STAT の以前のバージョンと比べて異なります。
以前の IAR Embedded Workbench IDE または Eclipse プロジェクトの C-STAT 設定が更新されます。いくつかのチェックは名前が変更されます(有効または無効な設定は維持されます)、いくつかのチェックは削除され、ほとんどの新しいチェックが追加されます(上記参照)。
設定ファイルを以前のバージョンの C-STAT で作成された場合は、ファイルから C-STAT チェックの設定のインポートには、プロジェクトの設定を更新するときに使用したものと同じロジックを使用します。
-
time()
関数を実装したユーザは、名称を__time32()
に変更してください。詳しくは、開発ガイドを参照してください。 -
--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
に置換 -
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アーキテクチャv4用のコンパイルが廃止されている場合に相互作用機能を使用しない
現状では、このモードは製品の以前のバージョンでサポートされていますが、C-RUNなどの新しい機能はこのモードに対応しなくなる予定です。
廃止された機能
-
--use_old_syntax
コンパイラオプション
--use_old_syntax
は、ARM用IAR C/C++コンパイラの将来のバージョンから削除される予定です。 -
--interwork
ARM用IAR C/C++コンパイラの将来のバージョンでは、ARMv4Tアーキテクチャに対してコードを生成する際、
--interwork
が使用されます。ARMv4Tに対して非相互作用コードを生成するオプションはなくなります。
-
新機能
-
新しい ARMv8-M アーキテクチャの初期サポート
このリリースは、ARMv8-M Baseline および Mainline 実装の両方をサポートします。ARMv8-M アーキテクチャは、組み込み IoT 市場のアプリケーションの安全性を確保することに焦点を当てています。
サンプルプロジェクトは、ディレクトリ<インストールパス>\arm\src\ARMv8M_Secure
にあります。これは CMSE の利用可能な拡張に関するクイックリファレンスで、ドキュメント化されていません。CMSE プログラミング モデルについての ARM ドキュメントの"ARMv8-M セキュリティ拡張: 開発ツールの必要要件"の例を参照してください。
次の拡張は、ARMv8-M、ベースライン (
--cpu 8-M.baseline
)、またはメインライン (--cpu 8-M.mainline
)でビルドする場合にのみ利用可能です。CMSE プログラミング モデルは、異なる実行ファイルとして、セキュアコードと非セキュアコードがビルドされることを指定します。セキュアコードで実行されたセットアップのレベルと、安全でないコードのエントリポイントの場所は、CMSE プログラミング モデルには指定されません。よって 2 つの実行ファイルは正しく相互作用するためにこれらの点で整合をとる必要があります。
属性
__cmse_nonsecure_entry
が決定したように、リンカは各エントリ関数にセキュアなゲートウェイベニアを自動的に作成します。これらのベニアは、セクションVeneer$$CMSE
に生成され、NSC 領域に配置されます。ARMv8-M コアのドキュメントを参照し、SAU (セキュア属性ユニット) をプログラ?ムする方法を決定します。CMSE に関連した ICCARM 属性
属性
__cmse_nonsecure_entry
説明
セキュアコード(--cmse
を使用)をビルドするとき、この属性を使用してセキュアモードにエントリ関数を宣言します。
これは、CMSE プログラミング モデルの__attribute__((cmse_nonsecure_entry))
に関連します。
スタックまた VFP レジスタにあるパラメータまたは返り値は、この属性の関数をサポートしません。属性
__cmse_nonsecure_call
説明
セキュアコード (--cmse
使用)をビルドしている時、この属性をセキュアでない関数の呼び出しに使用します。これにより、この属性の関数の定義は許可されず、実行ファイルには安全な関数の定義だけが含まれていることを確約します。これは、CMSE プログラミング モデルの__attribute__((cmse_nonsecure_call))
に関連します。
スタックまた VFP レジスタにあるパラメータまたは返り値は、この属性の関数をサポートしません。CMSE に関連した ICCARM オプション
オプション
--cmse
CMSE 安全なオブジェクトの生成を有効化
説明
このオプションは CMSE 属性__cmse_nonsecure_entry
および__cmse_nonsecure_call
を使用した、CMSE の安全な実行ファイルの作成をサポートすることを有効にします。オプション--cmse
は、CMSE プログラミング モデルの-mcmse
に関連しています。CMSE に関連した IASMARM オプション
OPTION
--cmse
CMSE 安全オブジェクトの生成を有効化
説明
このオプションは、セキュアモードでのみ利用可能な手順を使用できるようになります。CMSE に関連した ILINKARM オプション
オプション
--import_cmse_lib_out ファイル|ディレクトリ
セキュアでないイメージを構築するためにインポート ライブラリを作成
説明
このオプションを使用します。セキュアなイメージをリンクするときに、セキュアでないイメージに関連するようにリンクするときに使用されるインポート ライブラリを作成します。インポート ライブラリは、シンボル テーブルを含むオブジェクト ファイルです: 各シンボルは、同一名称のエントリ関数のセキュアゲートウェイのアドレスを、シンボルとして指定します。オプション
--import_cmse_lib_in FILE
セキュアでないイメージを構築するために、以前のバージョンのインポート ライブラリを読み込む
説明
インポート ライブラリを更新している時はこのオプションを使用します。提供されたインポート ライブラリにあるエントリ関数は、更新されたインポート ライブラリの同じアドレスに配置されます。
既知の問題
-
__packed
または#pragma pack
を使用する型を持つ、データオブジェクトのイニシャライザを含むアセンブラファイルリストが間違っています。
[EW23889] -
MISRA-C:2004規則9.1で、使用済みの初期化されていないローカル変数のすべては見つかりません。
[EW24720] -
オーバロードの解決アルゴリズムで、最適の組込み演算子がどれかを探す際に、引数を差し引くためのテンプレートのユーザー変換が考慮されません。
[EW24930] -
va_list
型のパラメータをC++関数に渡し、呼出し元があるオブジェクトファイルに定義され、呼出し先が別のオブジェクトファイルに定義されている場合、2つのオブジェクトのいずれかがEWARM 7.20 (またはそれ以降)でビルドされ、もう一方がEWARM 7.10 (またはそれ以前)でビルドされている場合、リンカエラーとなります。
[EW25660]
プログラム修正
-
単位や変数のアドレスの変数から視覚的に読み込めない場合、最適化レベルが高のときに、静的変数が誤って最適化されることがあります。また変数のアドレスは、ほかの変数のイニシャライザで発生し、アドレスは整数型にキャストしています。
[EW26045] -
符号付き文字を、ポインタ型への符号なしの型へのキャストは、内部エラーを引き起こします。
[EW26051] -
short
に戻された1.0f
のshort
の乗算のVFP コードを生成しているときに、内部エラー。
[EW26068] -
DSP 拡張のある ARM コアをコンパイルしている際 (ARMv7E-M, ARMv5E の構築)、
a
がa 32-ビット値でb, c
が 64-ビット値のa - ((b * c) >> 32)
形式の式は、間違った結果を取得します。
[EW26084] -
アセンブラレベル 最適化は、制御分析のフローで配列された問題のため、メタ安定状態にトラップされる可能性がありました。
[EW26088] -
EWARM 7.70.2:
ielftool でネイティブ文字(7-bit ASCII 以外の文字)によるパス名を使用すると、状況により正常に動作しません:
* Raw バイナリ、SimpleCode または ELF 出力ファイルにそれらの文字を指定すると、ファイルのロケーションと名前が不正になります。
* 入力ファイルや出力ファイルにそれらの文字を使用すると、多くの場合、冗長コンソール出力が不正になります。
[EW26101] -
EWARM 7.70.2:
浮動小数点数へのアクセスをベクトル化すると、ネガティブ スケーリングまたはネガティブ インクリメントを正しく処理しません。
[EW26170] -
EWARM 7.70.2:
まれに、強制インライン関数が、最適化レベル低にて、内部エラーを引き起こします。
[EW26172] -
EWARM 7.70.2:
ループ カウンターが、ループ不変非定数式と定数によってインクリメントされた場合に、最適化レベル高で内部エラーを引き起こします。
[EW26175] -
EWARM 7.70.2:
Thumb-2 のコンパイル中、インライン アセンブラ ステートメントが IT ブロック内に置かれ、エラー Ta117(ITブロックが永久に終了)が発生することが多くあります。
[EW26200] -
EWARM 7.70.2:
最適化レベル中または高において、変数が出力パラメータとして発生し、インライン アセンブラ ステートメントの前に変数が割り当てられると、インライン アセンブラ ステートメントが不正に最適化されることがあります。
[EW26201]
ユーザガイドの訂正
- なし
その他
-
デバイスのエラッタで使用可能な対策:
-
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を使用して再度処理する必要があります。
リリース履歴
-
リリース履歴を参照してください。