Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите как struct типа __eeprom заставить лежать не с нулевого адреса EEPROM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
west329_
Компилятор IAR AVR 5.20. Контроллер mega162.

Требуется заставить компилятор не использовать первые 64 байта в EEPROM.

Объявляю в *.h
Код
typedef struct  T_EEPROM
  {
    unsigned char   Key[16];
    unsigned long   Login;
    unsigned char   IP_Server[4];
    unsigned int    Port_Server;
    unsigned int    Port_Client;
    unsigned char   APN[24];
    unsigned char   Serial[8];
    unsigned long   CRC32;
  }  T_EEPROM_Header;


потом
Код
T_EEPROM_Header       __eeprom *EE_Header;


и обращение такое в качестве теста
Код
    EE_Header->Key[0] = 10;
    EE_Header->Key[1] = 11;
    EE_Header->Key[5] = 12;
    EE_Header->Key[10] = 13;
    EE_Header->Key[14] = 14;
    EE_Header->Key[15] = 15;    
    EE_Header->Login = 0x00000000;
    EE_Header->IP_Server[0]=1;
    EE_Header->IP_Server[1]=2;
    EE_Header->IP_Server[2]=3;
    EE_Header->IP_Server[3]=4;
    EE_Header->Port_Server = 0xAAAA;
    EE_Header->Port_Client = 0xBBBB;
    EE_Header->APN[0] = 1;
    EE_Header->APN[1] = 2;
    EE_Header->APN[5] = 3;
    EE_Header->APN[10] = 4;
    EE_Header->APN[22] = 5;
    EE_Header->APN[23] = 6;    
    EE_Header->CRC32 = 0xCCDDEE00;


чтоб не использовать первые 64 байта памяти еепром, правлю файл cfgm162.xcl так
Код
//////////////////////////////////////////////////////////////////////////////
// Internal EEPROM
-D_..X_EEPROM_END=1FF       // End of eeprom memory
//-D_..X_EEPROM_START=0    //OLD
-D_..X_EEPROM_START=64    //NEW


как только начинаю заполнять стркутуру, он пишется с 0 адреса laughing.gif

если начинаю использовать раздельные данные без структуры типа
Код
__no_init unsigned int __eeprom Dest_Port_eeprom;
__no_init unsigned int __eeprom Sour_Port_eeprom;


то при записи в них данных
Код
    
Dest_Port_eeprom = 0xABCD;
Sour_Port_eeprom = 0xEFAB;

они ложатся точно со смещения в 64 байта, но хочется использовать структуру.

Подскажите, что неправильно
Vitaly
__no_init __eeprom T_EEPROM_Header EEPROM_Header @0x40;
и cfgm162.xcl можно не править
sergik_vrn
Цитата(west329_ @ May 14 2009, 11:47) *
Код
T_EEPROM_Header       __eeprom *EE_Header;

если Вы используете указатель, никакой компилятор за Вас его инициализировать не станет. поэтому либо объявляйте статическую структуру в EEPROM, и работайте с ней, либо инициализируйте указатель сами, но тогда имейте в виду, что компилятор под эту структуру память сам выделять не будет (распределение памяти ложится целиком на Вас)
west329_
Цитата(sergik_vrn @ May 14 2009, 12:03) *
если Вы используете указатель, никакой компилятор за Вас его инициализировать не станет. поэтому либо объявляйте статическую структуру в EEPROM, и работайте с ней, либо инициализируйте указатель сами, но тогда имейте в виду, что компилятор под эту структуру память сам выделять не будет (распределение памяти ложится целиком на Вас)


У Вас не найдётся выжимки из кода как правильно объявить статическую структуру в EEPROM, я просто в первый раз работать с подобным.


Благодарю за помощь, заработало.
Код
__no_init __eeprom T_EEPROM_Header EE_Header;


обращение
Код
EE_Header.Key[0] = 10;
EE_Header.Key[1] = 11;
EE_Header.Key[5] = 12;
EE_Header.Key[10] = 13;
EE_Header.Key[14] = 14;


Всётаки остановился на варианте с редактирование линк фала
Код
//-D_..X_EEPROM_START=0
-D_..X_EEPROM_START=40
Dir
Цитата(west329_ @ May 14 2009, 10:47) *
Компилятор IAR AVR 5.20. Контроллер mega162.
Требуется заставить компилятор не использовать первые 64 байта в EEPROM.

Ну так забей первые 64 байта чем то ненужным.
Например:
Код
__eeprom __root char eNull[64] @0;

Все задокументировано в коде. А зачем редактировали линкер может забыться со временем. Да и быстрее, ИМХО.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.