構造化スキーマを念頭に置いてヘッダー ファイルを作成しています。私の目標は、別のマクロを呼び出した後にインクリメントされるベース アドレスを定義することです。これの目的は、新しいベース アドレスの実行中のカウントを保持し、コンパイル時に最大物理アドレスを超えているかどうかをチェックすることです。
以前は、アドレスをカウントするためにグローバル変数を使用することを考えていましたが、これは実行時に解決されるため、メモリ破損の可能性を防ぐために、バイナリが出力される前のコンパイル時にこれが必要です。
例として私が意味することは次のとおりです。
以下は、検査時にヘッダーファイルがどのように見えるか (または同等のもの) です。
#define DRAM_DEFINE_PTR 0x30000000
#define DRAM_DATA1_BASE 0x30000100
#define DRAM_DATA1_SIZE 0x050
#define DRAM_DATA2_SIZE 0x400
#define DRAM_DATA3_BASE 0x30000600
#define DRAM_DATA3_SIZE 0x300
#define DRAM_DEFINES(x,y) (...)
// store base 'x' and size 'y' in a structure and increment DRAM_DEFINE_PTR accordingly
1. DRAM_DEFINES (DRAM_DATA1_BASE, DRAM_DATA1_SIZE)
2. DRAM_DEFINES (0x0, DRAM_DATA2_SIZE) //base is previous base + size
3. DRAM_DEFINES (DRAM_DATA3_BASE, DRAM_DATA3_SIZE)
// more DRAM_DEFINES
実際には、以下のコード ブロックは 1 行目と 2 行目を次のように展開します。
1. DRAM_DEFINES (0x30000100, 0x50)
// DRAM_DEFINE_PTR now equals 0x30000150
2. DRAM_DEFINES (0x30000150, 0x400)
// DRAM_DEFINE_PTR now equals 0x30000550
3. DRAM_DEFINES (0x30000600 , 0x300)
// DRAM_DEFINE_PTR now equals 0x30000900
and so on
そして、ファイルの最後で #error チェックを行い、境界を超えていないことを確認します
#if (DRAM_DEFINE_PTR > 0x40000000)
#error "\nCAPACITY EXCEEDED by ", DRAM_DEFINE_PTR - 0x40000000, " bytes"
#endif
上記からわかるように、メモリのすべての領域が完全に使用されるわけではありません。2 と 3 の間のように、50 バイトのバッファーがあります。つまり、ベースアドレスは次のいずれかになります。
- #define OR を使用してハードコードされた値
- 前の領域のベースからのオフセット + 前の領域のサイズ
これは、使用しているコンパイラ (ARMCC RVCT 5.03) 内で可能ですか?
前もって感謝します