Цитата(Vata1990 @ Apr 28 2014, 08:30)

А вы не могли бы привести простенький пример. Со вторым пунктом я разобрался, а вот с первым никак не получается
Вот кусок скрипта линкера, в котором я добавляю секцию .section_eeprom_flash размером 2К в конец flash-памяти:
Код
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 254K
EEPROM (rx) : ORIGIN = 0x0803f800, LENGTH = 2K
OPTIONS_BYTES (rx) : ORIGIN = 0x1FFFF800, LENGTH = 16
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
}
...
SECTIONS
{
.section_eeprom_flash :
{
. = ALIGN(256);
_section_eeprom_flash = .;
KEEP(*(.section_eeprom_flash .section_eeprom_flash.*))
. = ALIGN(256);
} >EEPROM = 0xffff
...
}
А вот так использую в исходниках:
Код
#define EEPROM_SECTION __attribute__ ((used, section(".section_eeprom_flash")))
typedef struct
{
...
} eeprom_t;
const eeprom_t EEPROM_SECTION eeprom_flash =
{
...
};
У этого метода есть недостаток - заливать прошивку приходится дольше, т.к. у меня не получилось сформировать elf "с дырами", кроме как таким способом:
Код
#if NDEBUG
# define EEPROM_SECTION __attribute__ ((used, section(".section_eeprom_flash")))
#else
# define EEPROM_SECTION __attribute__ ((used, aligned (FLASH_PAGE_SIZE)))
#endif
Убираю дыру, притягивая секцию еепром к секции текст при отладочной сборке (мой основной режим компиляции - DEBUG, а релизы достаточно редки).
Если кто знает более прямое решение - с удовольствием перейму опыт.