2017-10-02 5 views
1

メモリ位置の特定の値に応じた値の定義に問題があります。メモリ位置の特定値による値の定義

基本的には、特定のメモリ位置で値を読み取り、この値から定義を作成します。そして、この同じ定義を使用して、コードをコンパイルするときの最初の定義値に従って新しい値を再び定義します。あなたの助けのための

#define MY_DEFINE_VALUE   (*(uint32_t *)0x0800C200) 

// 8 kBytes of EEPROM 
// First section base address is 0x08080000 
// Second section base address is 0x08081000 
#if (MY_DEFINE_VALUE < 0x0200) 
#define EEPROM_BASE        ((uint32_t)0x08080000) 
#else 
#define EEPROM_BASE        ((uint32_t)0x08081000) 
#endif 

ありがとう:

はここに私の例です。

+3

あなたは住所を間接参照しています。それは前処理時には行えません。 –

+3

式 '*(uint32_t *)0x0800C200'は、*実行時*で評価する必要があります。プリプロセッサは純粋なコンパイル時のものです。あなたは2つを混在させることはできません。 –

+0

これをコンパイルしているマシンはターゲットでもないのですか? –

答えて

2

これで解決することはできませんが、Cはそのようには動作しません。実際には、2つの異なるコードが同じ場所にあることを期待しているので(つまり0x08080000を使用するコードと0x08081000を使用するコード)、2つのコードが存在することを期待しているので、意味がありません。

あなたはする必要があるとしている:

  1. はそれに応じてボードを二つの異なるバイナリをビルドし、そしてプログラム。これにより、どのボードがどのバイナリをソフトウェアの外に必要としているかを知る責任が生じる。
  2. 実行時にチェックし、コードのハードコードされた選択肢を選択するか、単純にアクセスをダイナミックにする。

私の好みは、ダイナミックな実行時アクセスです。これは、コードで最も重要な部分でなければ問題ありません。

だから、あなたは変数作ると思います:

volatile uint32_t *eeprom_base; 

をして、ジャスト実行時にそれを設定するためのコードを追加します。

if (*(uint32_t *) 0x800c200 < 0x200) 
    eeprom_base = (uint32_t *) 0x8080000; 
else 
    eeprom_base = (uint32_t *) 0x8081000; 

、その後の代わりに変数を介してアクセスを作りますプリプロセッサシンボルを変更するか、後者を次のように変更します。

#define EEPROM_BASE eeprom_base 

もちろん、それが使用されているすべての場所で目に見える宣言もあります。

+0

ありがとう、私は多くのものを変更する必要がある場合でも、私はこのソリューションを試します:( – LOSwy

関連する問題