Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расположить переменную EEPROM по фиксированному адресу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
777777
Хочу поместить в EEPROM две структуры, одну по нулевому адрусу, другую по адресу 0x100. Потому что в будущем размер первой структуры может измениться, а начальный адрес второй должен остаться прежним. Пока удалось это сделать только расположив между ними массив нужного размера для заполнения. Но ведь можно как-то сделать по нормальному, указав начальный адрес секции. Как это можно сделать? Как, вообще, указать что это секция для EEPROM? В avr-libc-user-manual про EEPROM ничего нет.
swisst
Цитата(777777 @ Jun 10 2010, 10:23) *
Хочу поместить в 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


также задефайнить можно все адреса элементов структуры.
Сергей Борщ
Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить.
777777
Цитата(swisst @ Jun 10 2010, 17:52) *
также задефайнить можно все адреса элементов структуры.

Есть способ лучше - объявить переменную с модификатором EEMEM который есть #define EEMEM __attribute__((section(".eeprom")))

Хочется объявить еще секцию, допустим __attribute__((section(".eeprom2"))) но как указать ее начальный адрес? А также то, что это секция - EEPROM?

Цитата(Сергей Борщ @ Jun 10 2010, 18:11) *
Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить.

Так вот я и спрашиваю, как пишется этот скрипт? И как указать, что эта секция - EEPROM. Я понимаю, линкеру это не надо, ему нужны лишь адреса, которые получат находящиеся там переменные. Но ведь компилятор сообщает сколько байт занято в какой памяти, и при программировании он "знает" какие байты помещаются во флэш, т.е. являются программой, а какие в EEPROM.
MrYuran
Цитата(777777 @ Jun 11 2010, 08:24) *
Хочется объявить еще секцию, допустим __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};
....
Сергей Борщ
Цитата(777777 @ Jun 11 2010, 07:24) *
Так вот я и спрашиваю, как пишется этот скрипт?
http://electronix.ru/forum/index.php?showt...mp
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.