プロが教える店舗&オフィスのセキュリティ対策術

現在Atmel Studio6.2でATmega88pマイコンのプログラミングを行っています。

https://sourceforge.jp/projects/cc1101driver/scm …

AVR studio4.19 + winAVR Cコンパイラで作成していたコードをAtmel Studio6.2に移してコンパイルを行ったところ、EEPROMアドレスへのデータ書き込みが逆になってしまう現象が起きました。




#define EEPROM __attribute__((section(".eeprom")))
ctl_data EEPROM gctl_data;
reg_slave EEPROM greg_slave[100];
intEEPROMeprom_level[14];
char EEPROM eprom_fixid[3];
char EEPROM test_mode;
char EEPROM monitor_state;
int EEPROM wdt_cnt;
int EEPROM cnt_loop_break;




このようなコードを”AVR studio4.19 + winAVR”の時からしているのですが、このときは


ctl_data EEPROM gctl_data;


こちらがEEPROMアドレスの0x0000番地から始まっていたのですが、Atmel Studio6.2の場合は、

int EEPROM cnt_loop_break;

こちら側が0x0000番地に配置するようになっていて、逆になってしまっています。

この場合、一番最初のアドレスに割り当てするには、コードも逆にして記述する必要がありますでしょうか?

どうぞ、ご教示頂きますようお願いいたします。

A 回答 (1件)

単に変数宣言しただけだけでは変数の実アドレスはコンパイル環境依存であり、


プログラムからメモリ位置を制御できません。
WinAVRもAS6も同じGCCですがバージョンが異なります。

そもそも変数名でアクセスすれば実アドレスは関知しなくて良いはずですし、
自分で分かる実アドレスに配置したいならポインタを使うものです。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


#define EEPROM __attribute__((section(".eeprom")))
save_eeprom_data_t EEPROM save_eeprom_data;


このように

save_eeprom_data_t 構造体にまとめて、アドレス位置を決めるように設定してみました。



https://sourceforge.jp/projects/cc1101driver/scm …


助かります。

お礼日時:2014/09/03 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!