Перейти к содержанию
    

Расположить переменную EEPROM по фиксированному адресу

Хочу поместить в EEPROM две структуры, одну по нулевому адрусу, другую по адресу 0x100. Потому что в будущем размер первой структуры может измениться, а начальный адрес второй должен остаться прежним. Пока удалось это сделать только расположив между ними массив нужного размера для заполнения. Но ведь можно как-то сделать по нормальному, указав начальный адрес секции. Как это можно сделать? Как, вообще, указать что это секция для EEPROM? В avr-libc-user-manual про EEPROM ничего нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу поместить в 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

 

также задефайнить можно все адреса элементов структуры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

также задефайнить можно все адреса элементов структуры.

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

 

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

 

Так же, как и с любыми другими данными - кладете в отдельный сегмент и в скрипте линкера указываете, куда его положить.

Так вот я и спрашиваю, как пишется этот скрипт? И как указать, что эта секция - EEPROM. Я понимаю, линкеру это не надо, ему нужны лишь адреса, которые получат находящиеся там переменные. Но ведь компилятор сообщает сколько байт занято в какой памяти, и при программировании он "знает" какие байты помещаются во флэш, т.е. являются программой, а какие в EEPROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочется объявить еще секцию, допустим __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};

....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так вот я и спрашиваю, как пишется этот скрипт?
http://electronix.ru/forum/index.php?showt...mp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...