/* * Линкер-скрипт для STM32F446RETx (512K FLASH, 128K RAM) * Смещение FLASH: 0x08008000 (первые 32K под загрузчик) */ /* Точка входа */ ENTRY(Reset_Handler) /* Конец стека (адрес начала стека = конец RAM) */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* Минимальные размеры кучи и стека */ _Min_Heap_Size = 0x1000; /* 4 КБ */ _Min_Stack_Size = 0x2000; /* 8 КБ */ /* Распределение памяти */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 384K # Для STM32F446 (512K - 32K) } /* Секции */ SECTIONS { /* Векторы прерываний (должны быть первыми!) */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* Секция векторов */ . = ALIGN(4); } >FLASH /* Программный код и константы */ .text : { . = ALIGN(4); *(.text) /* Код */ *(.text*) /* Код (включая C++) */ *(.glue_7) /* ARM/Thumb glue */ *(.glue_7t) /* Thumb/ARM glue */ *(.eh_frame) KEEP(*(.init)) /* Конструкторы */ KEEP(*(.fini)) /* Деструкторы */ . = ALIGN(4); _etext = .; /* Конец кода */ } >FLASH /* Константы (только для чтения) */ .rodata : { . = ALIGN(4); *(.rodata) /* Константы */ *(.rodata*) /* Константы (включая строки) */ . = ALIGN(4); } >FLASH /* Таблицы для C++ (исключения, RTTI) */ .ARM.extab : { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); } >FLASH .ARM.exidx : { . = ALIGN(4); __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; . = ALIGN(4); } >FLASH /* Инициализированные данные (копируются в RAM при старте) */ _sidata = LOADADDR(.data); /* Адрес данных во FLASH */ .data : { . = ALIGN(4); _sdata = .; /* Начало данных в RAM */ *(.data) /* Инициализированные переменные */ *(.data*) /* Инициализированные переменные (C++) */ *(.RamFunc) /* Функции в RAM */ *(.RamFunc*) /* Функции в RAM (C++) */ . = ALIGN(4); _edata = .; /* Конец данных в RAM */ } >RAM AT> FLASH /* Физически хранятся во FLASH */ /* Неинициализированные данные (BSS) */ .bss : { . = ALIGN(4); _sbss = .; /* Начало BSS */ __bss_start__ = _sbss; *(.bss) /* BSS переменные */ *(.bss*) /* BSS переменные (C++) */ *(COMMON) /* Общие переменные */ . = ALIGN(4); _ebss = .; /* Конец BSS */ __bss_end__ = _ebss; } >RAM /* Куча и стек (резервируем место) */ ._user_heap_stack : { . = ALIGN(8); PROVIDE(end = .); PROVIDE(_end = .); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(8); } >RAM /* Удаление ненужных секций из стандартных библиотек */ /DISCARD/ : { libc.a (*) libm.a (*) libgcc.a (*) } /* Атрибуты ARM */ .ARM.attributes 0 : { *(.ARM.attributes) } }