Top.Mail.Ru
Уведомления
Очистить все

Непонятка с линкером.

(@antonmai)
New member

Камень-STM32F205RC

в ld файле добавляю две секции.

В отладчике всё работает. Но бинарник получается размером с небоскрёб: 393 344 кб.

Если убрать ram_user_info_section размер приходит в норму. Не могу понять что не так!

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 80K
  RAM2_USER_INFO (xrw)    : ORIGIN = 0x2001C000,   LENGTH = 16K
  FLASH_USER_INFO_BACKUP    (rx)    : ORIGIN = 0x8000000,   LENGTH = 16K
  FLASH    (rx)    : ORIGIN = 0x8004000,   LENGTH = 48K
  
  /*RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 80K*/
  /*RAM2    (xrw)    : ORIGIN = 0x2001C000,   LENGTH = 16K*/
  /*FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 256K*/
}

SECTIONS
{ 
....
/* Section for user info*/
  .ram_user_info_section :
  {
     . = ALIGN(4);
	 KEEP(*(.ram_user_info_section))
	 . = ALIGN(4);
  } >RAM2_USER_INFO
  
 /*Section for backup user info*/
  .flash_user_info_backup_section :
  {
  	. = ALIGN(4);
 	KEEP(*(.flash_user_info_backup_section))
 	. = ALIGN(4);
  } >FLASH_USER_INFO_BACKUP
}
Цитата
Создатель темы Размещено : 06.04.2023 13:10
(@antonmai)
New member

Решение в https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_21.html

есть опция NOLOAD. Она решает данную проблему.

 

Не понятно почему без неё добавляется не 16K а 393320K

в elf обе секции клались во флеш с размерами по 0x30000;

SECTIONS
{ 
....
/* Section for user info*/
  .ram_user_info_section (NOLOAD) :
  {
     . = ALIGN(4);
	 KEEP(*(.ram_user_info_section))
	 . = ALIGN(4);
  } >RAM2_USER_INFO
  
 /*Section for backup user info*/
  .flash_user_info_backup_section (NOLOAD) :
  {
  	. = ALIGN(4);
 	KEEP(*(.flash_user_info_backup_section))
 	. = ALIGN(4);
  } >FLASH_USER_INFO_BACKUP
}
ОтветитьЦитата
Создатель темы Размещено : 07.04.2023 11:27
Aveal
(@aveal)
Top level Admin

Интересно, а проект можешь скинуть?

ОтветитьЦитата
Размещено : 07.04.2023 12:00
(@antonmai)
New member

да как такового ещё нет. Переделываю бутлоадер. Секции переставил, чтобы в 0x08000000 переход не делать.

Хочу в flash_user_backup_section эмуляцию eeprom сделать. Но вот с секцией в рам, почему то коллизия получилась.

При этом линкер не жаловался на выход за пределы флеш памяти.

Такой бутлоадер уже работает с внешней флеш микросхемой. Но иногда происходит сбой и признак приложения удаляется.

Вот хочу во внутреннюю флеш перенести.

ОтветитьЦитата
Создатель темы Размещено : 07.04.2023 13:06
Поделиться: