Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание своего сегмента в WinAvr
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Mikl Scherbak
Здравствуйте!
Есть 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 @ Jun 1 2010, 01:57) *
Как, не меняя скриптов линкера (я в них ничего не понимаю), сделать так чтобы эта секция лягла в свой сегмент, со смещения равного 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=адрес
Mikl Scherbak
Спасибо, сделал с измененным скриптом линкера, помогло.
esaulenka
Как интересно...
А это какие-то расширения WinAVR используются, или стандартный Си?

Надо будет полистать этот самый avr-libc...
Mikl Scherbak
Цитата(Mikl Scherbak @ Jun 1 2010, 19:24) *
Спасибо, сделал с измененным скриптом линкера, помогло.

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