реклама на сайте
подробности

 
 
> Создание своего сегмента в WinAvr
Mikl Scherbak
сообщение May 31 2010, 22:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 22-05-09
Из: Харьков, Украина
Пользователь №: 49 413



Здравствуйте!
Есть 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 - May 31 2010, 22:58
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Сергей Борщ
сообщение Jun 1 2010, 06:28
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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=адрес


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mikl Scherbak
сообщение Jun 1 2010, 16:24
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 22-05-09
Из: Харьков, Украина
Пользователь №: 49 413



Спасибо, сделал с измененным скриптом линкера, помогло.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 8 2010, 15:58
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Mikl Scherbak
сообщение Jun 10 2010, 14:00
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 22-05-09
Из: Харьков, Украина
Пользователь №: 49 413



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

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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016