UsageFault または HardFault 例外を発生させるアンアラインドアクセスの処理
テクニカル・ノート 58203
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2017/12/14 8:58
はじめに
このテクニカルノートでは、アラインされていないアクセスが Usage Fault または Hard Fault 例外を起こす時に実行すべきアクションについて説明します。
このテクニカルノートは、ARMv6(ARMv6-Mを除く)、ARMv7-M、およびARMv8-M アーキテクチャに基づくデバイスに適用されます。その他のアーキテクチャ、特にARMv6-Mについては、下記の「その他のアーキテクチャ」を参照してください。
解説
例外を回避するために二つの異なった方法があります:
- アプリケーションに Configuration and Controlレジスタ'UNALIGN_TRP'ビットをクリアさせる。(あるいはビットがセットされないようにする)
これにより、デバイスはアラインされていないアクセスを受け入れます。 デバイスがこのように設定されると、IAR C/C++コンパイラはより効率的なコードを生成できます。 ランタイムライブラリは、これを利用できるように構築されています。
- --no_unaligned_accessオプションを使用してアプリケーションをコンパイルする。
最初の提案は、デバイスがアライメントされていないアクセスを受け入れるようにします。 デバイスがこのように設定されると、IAR C/C++コンパイラはより効率的なコードを生成できます。 ランタイムライブラリは、これを利用できるように構築されています。
この提案は、アプリケーションによって 'UNALIGN_TRP'ビットが設定されている場合に適用できます。 この状況では、リンカは、影響を受けるライブラリ関数を、アラインされていないアクセスを処理する関数バリアントにリダイレクトします。 これらのバリアントはあまり効率的ではありません。
その他のアーキテクチャ
このテクニカルノートは、ARMv4、ARMv5、およびARMv6-Mアーキテクチャに基づくデバイスには適用されません。
- ARMv6-Mアーキテクチャの例は、Cortex-M0、Cortex-M0 +およびCortex-M1です。
- ARMv4 および ARMv5アーキテクチャの例は、ARM7TDMIおよびARM926Sです。
まとめ
ARMv6、ARMv7-M、およびARMv8-Mアーキテクチャに基づくデバイスで、このテクニカルノートを利用できます。 (ARMv7-Mアーキテクチャの例は、Cortex-M3、Cortex-M4およびCortex-M7です)
詳細については、ハードウェアのマニュアルをご参照ください。例えば‘Cortex-M3 Devices Generic User Guide’の ‘4.3.9. System Handler Control and State Register’、‘Cortex-M0 Devices Generic User Guide’の ‘4.3.6. Configuration and Control Register’を参照してください。
全ての製品名は、それぞれの所有者の商標または登録商標です