適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- ARM ツールの全バージョン
現象
アプリケーションの中で下記のグローバル変数を宣言すると、プログラムが main() に到達する前に DataAbort モードに入ってしまいます。
struct vectCntlFields {
unsigned int source:5 ;
unsigned int enable:1 ;
};
volatile struct vectCntlFields vectCntlSlot0 __at 0xFFFFF200;
原因
CARM コンパイラはグローバル変数を自動的に初期化します。その結果、VIC(ベクタ割り込みコントローラ)のレジスタへの不正なバイトアクセスになります。VIC 内のすべてのレジスタはワード レジスタです。バイトおよびハーフワードの読み出しおよび書き込みはサポートされていません。
解決策
VIC レジスタ アドレス空間内の変数を初期化しないようコンパイラに指定します。
上記のコードは以下のようにする必要があります。
struct vectCntlFields {
unsigned int source:5 ;
unsigned int enable:1 ;
};
#pragma SAVE
#pragma NOINIT
volatile struct vectCntlFields vectCntlSlot0 __at 0xFFFFF200;
#pragma INIT
詳細
- PrimeCell® Vectored Interrupt Controller (PL190)
関連項目
- CARM User's Guide の NOINIT を参照してください。