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

Создание своего сегмента в WinAvr

Здравствуйте!

Есть Atmega168, к ней прикручена FM24C04A. Хочется сделать свои макросы/функции для работы с ней как avr-libc работает с встроенным eeprom.

typedef struct { uint32_t TotalKm;
                 uint32_t TotalPulses;
                 uint32_t OdoKm;
                 uint32_t OdoPulses;
                 uint8_t  valid;
               } Odo_t;
                  



#define FRAM __attribute__((section(".fram")))


void FM24ReadBlock(void  *addr,void *buf,size_t sz); /* Чтение блока из fram в sram */

const FRAM Odo_t odometer;
Odo_t od;

void main(void)
{
.....
  FM24ReadBlock((void *)&odometer,(void *)&od,sizeof(Odo_t));
.....
}

 

Секция .fram создается. Но начинается с адреса 0x100

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .fram         00000011  00800100  0000031a  000003ae  2**0
                  CONTENTS, ALLOC, LOAD, DATA

Как, не меняя скриптов линкера (я в них ничего не понимаю), сделать так чтобы эта секция лягла в свой сегмент, со смещения равного 0?

То есть чтобы &odometer было равно 0, а не 0x100?

Изменено пользователем Mikl Scherbak

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


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

Как, не меняя скриптов линкера (я в них ничего не понимаю), сделать так чтобы эта секция лягла в свой сегмент, со смещения равного 0?
Лучше бы в них разобраться. Там нет никакой черной магии. Вам нужно в начале файла в раздел MEMORY по аналогии с .eeprom добавить новый регион FRAM, а в разделе SECTIONS добавить линковку вашей секции в этот регион:

/* Default linker script, for normal executables */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:4)
MEMORY
{
  .....
  EEPROM        (rw!x) : ORIGIN = 0x810000,    LENGTH = 512
  FRAM            (rw!x) : ORIGIN = 0x820000,    LENGTH = 256
}

SECTIONS
{
  ........
  .fram :
  {
    *(.fram*)
  }  > FRAM

  .........

Ну на самый крайний случай вы можете линкеру в командной строке указать линковку секции .fram в конкретный адрес, смотрите ключ --section-start=.fram=адрес

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


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

Как интересно...

А это какие-то расширения WinAVR используются, или стандартный Си?

 

Надо будет полистать этот самый avr-libc...

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


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

Спасибо, сделал с измененным скриптом линкера, помогло.

Свой Makefile еще таки пришлось делать(в смысле менять сгенеренный студией), ибо стандартный пытался положить этот сегмент в результирующий .hex, а он там лишний. Добавил к сгенеренному -R .fram к переменной HEX_FLASH_FLAGS

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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