Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно описать свою секцию
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
viakon
Мега128 + FRAM FM18L08. Внешняя память начинается с 0x8000.
описываю в хедере
#define NVRAM __attribute__((section(".nvram")))

Далее пременные описываю

volatile NVRAM unsigned int next_page = 0;
NVRAM struct navigation nav_buffer[2000];
NVRAM struct _bort bort[240];

В мэйкефайле LDFLAGS += -Wl,-section-start=.nvram=0x808000

или EXTMEMOPTS = -Wl,--section-start,.nvram=0x808000,--defsym=__heap_end=0x80ffff

теже яйца только в профиль.

пока описание переменных в одном файле, все нормально, они раскладываются в эту область. Стоит описать еще одну переменную в другом файле, создается секция nvram.1 и размещается во внутреннем ОЗУ. Хотелось бы как с еепромом, вместо EEMEM, указывать NVRAM и пременные ложились в нужную область

winavr20070525
Harbour
см опцию. --split-by-reloc (default value) - вобче желательно использовать свой ld файл, в нем написать что-то типа :

...
.nvram :
{
*(.nvram.*)
*(.nvram)
} = 0x808000
...
viakon
где взять пример ld файла и как цеплять его?
733259
Цитата
где взять пример ld файла
В avr/lib/ldscripts, Вам подойдёт avr5.x
Цитата
и как цеплять его?
-Wl,--script=avr5-custom.x при линковке, если avr5-custom.x - отредакторованный Вами скрипт.
viakon
Заработало. только пришлось указать LDFLAGS += -Wl,-section-start=.nvram=0x808000 иначе пересекалась с .bss областью.

nvram :
{
*(.nvram.*)
*(.nvram)
} = 0x808000

зачем тогда в этом описании = 0x808000 ??
amw
Цитата(viakon @ Jun 26 2008, 07:08) *
Заработало. только пришлось указать LDFLAGS += -Wl,-section-start=.nvram=0x808000 иначе пересекалась с .bss областью.

nvram :
{
*(.nvram.*)
*(.nvram)
} = 0x808000

зачем тогда в этом описании = 0x808000 ??

Правильно будет
Код
nvram :
{
*(.nvram.*)
*(.nvram)
} > 0x808000

= используется для заполнения указанным значением незанятого места в секции.
viakon
Нет, так линковщик ругается на синтаксис
alx2
Цитата(amw @ Jun 26 2008, 15:37) *
Правильно будет
Код
nvram :
{
*(.nvram.*)
*(.nvram)
} > 0x808000
Странный синтаксис. После символа ">" должно указыватсья имя региона, в котором должна быть размещена секция. Смотрите документацию, там все написано. Вот общий синтаксис:
Код
    section [address] [(type)] :
       [AT(lma)] [ALIGN(section_align)] [SUBALIGN(subsection_align)]
       {
         output-section-command
         output-section-command
         ...
       } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
amw
Цитата(alx2 @ Jun 26 2008, 15:41) *
Странный синтаксис. После символа ">" должно указыватсья имя региона, в котором должна быть размещена секция. Смотрите документацию, там все написано. Вот общий синтаксис:
Код
    section [address] [(type)] :
       [AT(lma)] [ALIGN(section_align)] [SUBALIGN(subsection_align)]
       {
         output-section-command
         output-section-command
         ...
       } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]

Прошу прощения. Поспешиш - насмешиш.
Вы правы на счет регионов.
Более полный отрывок будет таким примерно.
Код
MEMORY
{
........
  NVRAM    (r)    :    ORIGIN = 0x808000, LENGTH = <РАЗМЕР_ЭТОГО_РЕГИОНА>
........
}
SECTIONS
{
........
.nvram :
{
*(.nvram.*)
*(.nvram)
} >NVRAM =0xFF
........
}

Заполнение 0xFF не обязательно, но по умолчанию заполняется нулями. Для EEPROM вероятно лучше указать.
Harbour
Цитата(viakon @ Jun 26 2008, 07:08) *
Заработало. только пришлось указать LDFLAGS += -Wl,-section-start=.nvram=0x808000 иначе пересекалась с .bss областью.

nvram :
{
*(.nvram.*)
*(.nvram)
} = 0x808000

зачем тогда в этом описании = 0x808000 ??


погорячился wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.