777777 0 10 июня, 2010 Опубликовано 10 июня, 2010 · Жалоба Хочу поместить в EEPROM две структуры, одну по нулевому адрусу, другую по адресу 0x100. Потому что в будущем размер первой структуры может измениться, а начальный адрес второй должен остаться прежним. Пока удалось это сделать только расположив между ними массив нужного размера для заполнения. Но ведь можно как-то сделать по нормальному, указав начальный адрес секции. Как это можно сделать? Как, вообще, указать что это секция для EEPROM? В avr-libc-user-manual про EEPROM ничего нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
swisst 0 10 июня, 2010 Опубликовано 10 июня, 2010 · Жалоба Хочу поместить в EEPROM две структуры, одну по нулевому адрусу, другую по адресу 0x100. Потому что в будущем размер первой структуры может измениться, а начальный адрес второй должен остаться прежним. Пока удалось это сделать только расположив между ними массив нужного размера для заполнения. Но ведь можно как-то сделать по нормальному, указав начальный адрес секции. Как это можно сделать? Как, вообще, указать что это секция для EEPROM? В avr-libc-user-manual про EEPROM ничего нет. есть методы работы с еепром (eeprom_read, eeprom_write). обратиться к структуре напрямую Вы не можете (типа temp = eeprom_struct.var_1 ), только через процедуру чтения/записи. так вот, адрес по которому располагается Ваша переменная передается параметром и достаточно его задефайнить: #define EEPROM_STRUCT_1_ADDRESS 0x0000 #define EEPROM_STRUCT_2_ADDRESS 0x0100 также задефайнить можно все адреса элементов структуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 10 июня, 2010 Опубликовано 10 июня, 2010 · Жалоба Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 11 июня, 2010 Опубликовано 11 июня, 2010 · Жалоба также задефайнить можно все адреса элементов структуры. Есть способ лучше - объявить переменную с модификатором EEMEM который есть #define EEMEM __attribute__((section(".eeprom"))) Хочется объявить еще секцию, допустим __attribute__((section(".eeprom2"))) но как указать ее начальный адрес? А также то, что это секция - EEPROM? Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить. Так вот я и спрашиваю, как пишется этот скрипт? И как указать, что эта секция - EEPROM. Я понимаю, линкеру это не надо, ему нужны лишь адреса, которые получат находящиеся там переменные. Но ведь компилятор сообщает сколько байт занято в какой памяти, и при программировании он "знает" какие байты помещаются во флэш, т.е. являются программой, а какие в EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 11 июня, 2010 Опубликовано 11 июня, 2010 · Жалоба Хочется объявить еще секцию, допустим __attribute__((section(".eeprom2"))) но как указать ее начальный адрес? А также то, что это секция - EEPROM? Так вот я и спрашиваю, как пишется этот скрипт? И как указать, что эта секция - EEPROM. Посмотрите, как написаны готовые скрипты. (файлы *.x) По аналогии можно добавить свои секции. Не знаю как в WinAVR, а вот в mspgcc я добавлял секцию без скриптов, ключами линкера LDFLAGS += -Wl,--section-start LDFLAGS += -Wl,.seg_a=0x1080 А в тексте: #define __special_area__ __attribute__((section(".seg_a"))) // const __special_area__ unsigned int save_ptr[] = {0x0000,0x0000,0x0000,0x0000}; .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 июня, 2010 Опубликовано 11 июня, 2010 · Жалоба Так вот я и спрашиваю, как пишется этот скрипт? http://electronix.ru/forum/index.php?showt...mp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться