重要な情報
- バージョン 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 Security Extensions: Requirements on Development tools"の例を参照してください。
以下の拡張は、ARMv8-M、Baseline (
--cpu 8-M.baseline
)、またはMainline (--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 FILE|DIRECTORY
ノンセキュアイメージをビルドするためのインポート ライブラリを作成
説明
セキュアイメージをリンクする際にこのオプションを使用します。それにより、対応するノンセキュアイメージをビルドする際にリンクされるインポートライブラリが作成されます。インポート ライブラリはオブジェクト ファイルで、シンボルテーブルから成ります。各シンボルは、シンボルと同じ名前のエントリ関数用の、セキュアゲートウェイのアドレスを指定します。オプション
--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]
プログラム修正
マクロ引数内の
#pragma
ディレクティブのソースファイルをコンパイルしたり、プリプロセッサしたりするとき、コンパイラは内部エラーを終了ことがあります。終端文字のないマクロの呼び出し内の#include
ディレクティブがある場合、通常これが発生します。
[EW26221]ループの上限が関数呼び出しのとき、最適化レベルで高memcpy、memset、またはmemclrとの同等のループは、誤って最適化されます。
[EW26223]グローバル最適化は、特定の状況では正常でないでない中間コードを生成します。コードジェネレータは、この(正しい)コードの構造を予期していないため、内部エラーになります。
[EW26232]最適化が「高」レベルでは、自動変数のスカラ変数 (
v
) が間違って最適化されます。
・v
への表示可能な割り当ては0
または1
にされる。
・ 1つまたは複数の呼び出しが含まれる機能は非直接的にv
に割り当てられる。
・v
に割り当てたすべての呼び出しにはpragma機能
がありステータスno_state
に影響する
・ 機能はv
の最低ビットをマスクする(例v & 1
)。
[EW26241]クラステンプレートのメンバ機能コードにクラステンプレートタイプ自体のポインタまたは参照から/に
dynamic_cast
オペレータを使用している場合、コンパイラは内部エラーで終了します。
[EW26248]Thumb-1 コード用のスタックパラメータへのアクセスの最適化は、メモリによる順番で実行されます。この結果、環境のわずかな変化に応じて異なるコードが生成されます。
[EW26267]#pragma weak
を使用して弱いエイリアスを定義し、同じコンパイルユニットにそのエイリアスを使用すると、コンパイラーが内部エラーで終了します。
[EW26268]EWARM 7.80.2:
プロジェクトのファイルパスにある日本語の文字で問題となる、地域設定の問題を解決しました。
ユーザガイドの訂正
- なし
その他
-
デバイスのエラッタで使用可能な対策:
-
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を使用して再度処理する必要があります。
リリース履歴
-
リリース履歴を参照してください。