0

構造化スキーマを念頭に置いてヘッダー ファイルを作成しています。私の目標は、別のマクロを呼び出した後にインクリメントされるベース アドレスを定義することです。これの目的は、新しいベース アドレスの実行中のカウントを保持し、コンパイル時に最大物理アドレスを超えているかどうかをチェックすることです。

以前は、アドレスをカウントするためにグローバル変数を使用することを考えていましたが、これは実行時に解決されるため、メモリ破損の可能性を防ぐために、バイナリが出力される前のコンパイル時にこれが必要です。

例として私が意味することは次のとおりです。

以下は、検査時にヘッダーファイルがどのように見えるか (または同等のもの) です。

#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) 内で可能ですか?

前もって感謝します

4

3 に答える 3

1

アドレスを格納するためにグローバル変数を使用しないのはなぜですか?

于 2014-10-03T00:02:55.467 に答える
1

Boost Preprocessor ライブラリの評価済みスロット機能を使用して、1 つの単位を変換する過程でマクロの値を更新できます。プリプロセッサ コードによって変更可能なグローバル変数として扱うことができるいくつかの「スロット」を定義します。これにより、単一の固定式で値を永続的に定義するのではなく、値を追加することができます。純粋な標準互換の C (または C++) です。

主な構文上の厄介な点は、更新操作自体に 2 行を追加する必要があることです。これは、#define/の#includeペアによって機能するためです。

#define DRAM_PTR_SLOT 2    // any slot
#define DRAM_DEFINE_PTR BOOST_PP_SLOT(DRAM_PTR_SLOT)
#define SET_DRAM_DEFINE_PTR BOOST_PP_ASSIGN_SLOT(DRAM_PTR_SLOT)

#define BOOST_PP_VALUE 0x30000100 + 0x50
#include SET_DRAM_DEFINE_PTR    // DRAM_DEFINE_PTR now evals to 0x30000150

#define BOOST_PP_VALUE DRAM_DEFINE_PTR + 0x50
#include SET_DRAM_DEFINE_PTR    // DRAM_DEFINE_PTR now evals to 0x300001A0

それは非常にエレガントではありません-別のマクロ内にディレクティブをパックする方法がないため、問題のような構文内にこれを隠すことはできません-しかし、少なくともいくつかのドメイン固有の下でBoost名を隠すことができるかもしれません独自のラッパー マクロ。

于 2014-10-11T02:32:41.107 に答える
0

これは、このようなことを念頭に置いて設計されていないため、CPP を使用して実行できない可能性があります。ARM アセンブラとそのマクロ機能を調査して、代わりに使用できるかどうかを確認します。

于 2014-10-08T00:09:05.803 に答える