west329 0 14 мая, 2009 Опубликовано 14 мая, 2009 · Жалоба Компилятор 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: если начинаю использовать раздельные данные без структуры типа __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 0 14 мая, 2009 Опубликовано 14 мая, 2009 · Жалоба __no_init __eeprom T_EEPROM_Header EEPROM_Header @0x40; и cfgm162.xcl можно не править Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergik_vrn 0 14 мая, 2009 Опубликовано 14 мая, 2009 · Жалоба T_EEPROM_Header __eeprom *EE_Header; если Вы используете указатель, никакой компилятор за Вас его инициализировать не станет. поэтому либо объявляйте статическую структуру в EEPROM, и работайте с ней, либо инициализируйте указатель сами, но тогда имейте в виду, что компилятор под эту структуру память сам выделять не будет (распределение памяти ложится целиком на Вас) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 14 мая, 2009 Опубликовано 14 мая, 2009 (изменено) · Жалоба если Вы используете указатель, никакой компилятор за Вас его инициализировать не станет. поэтому либо объявляйте статическую структуру в 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 Изменено 14 мая, 2009 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 21 мая, 2009 Опубликовано 21 мая, 2009 · Жалоба Компилятор IAR AVR 5.20. Контроллер mega162. Требуется заставить компилятор не использовать первые 64 байта в EEPROM. Ну так забей первые 64 байта чем то ненужным. Например: __eeprom __root char eNull[64] @0; Все задокументировано в коде. А зачем редактировали линкер может забыться со временем. Да и быстрее, ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться