mikl74 0 31 мая, 2010 Опубликовано 31 мая, 2010 (изменено) · Жалоба Здравствуйте! Есть 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? Изменено 31 мая, 2010 пользователем Mikl Scherbak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 1 июня, 2010 Опубликовано 1 июня, 2010 · Жалоба Как, не меняя скриптов линкера (я в них ничего не понимаю), сделать так чтобы эта секция лягла в свой сегмент, со смещения равного 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=адрес Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mikl74 0 1 июня, 2010 Опубликовано 1 июня, 2010 · Жалоба Спасибо, сделал с измененным скриптом линкера, помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Как интересно... А это какие-то расширения WinAVR используются, или стандартный Си? Надо будет полистать этот самый avr-libc... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mikl74 0 10 июня, 2010 Опубликовано 10 июня, 2010 · Жалоба Спасибо, сделал с измененным скриптом линкера, помогло. Свой Makefile еще таки пришлось делать(в смысле менять сгенеренный студией), ибо стандартный пытался положить этот сегмент в результирующий .hex, а он там лишний. Добавил к сгенеренному -R .fram к переменной HEX_FLASH_FLAGS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться