私は組み込みプロジェクトに取り組んでいます。GNU リンカを使用して、外部 eeprom に保存されているいくつかの変数をレイアウトしようとしています。これを行うには、eeprom 変数を次のように割り当てます。
int __attribute__ ((section (".eeprom"))) eeprom_var1;
また、eeprom の初期化された変数を定義します。つまり、次のようにします。
int __attribute__ ((section (".eeprom"))) eeprom_var2 = 0x42;
アイデアは次のとおりです。eeprom の初期化時に、初期化された変数は、データ セクションの初期化と同様に、実行中のアプリケーションによって .text セクションのどこかから eeprom にコピーされます。当然のことながら、eeprom 変数は読み書きできませんが、次のような関数を介してアクセスする必要があります。
eeprom_read(data, &eeprom_var,sizeof(eeprom_var)).
ここまでは順調ですね、
ここで、eeprom 変数を別の変数のポインターで初期化します。
unsigned long long __attribute__ ((section (".eeprom"))) eeprom_var1 = 0x42;
unsigned short __attribute__ ((section (".eeprom"))) eeprom_var2 = (unsigned short )&eeprom_var1;
eeprom は 16 ビットのアドレス空間を使用することに注意してください
しかし、これにより次のエラーが発生します
foo.c:4:1: error: initializer element is not constant
unsigned short __attribute__ ((section (".eeprom"))) eeprom_var2 = (unsigned short )&eeprom_var1;
^
これは、(unsigned short) へのキャストが C では許可されていない初期化子としての操作として読み取られるためです。ただし、C++ では上記の式は問題ありません。
上記のエラーを回避する方法を考えられる人はいますか?
/アンダース