Если создать секцию "ramfunc" во FLASH, то код будет выполняться из флешь, а не из ОЗУ.
Использование следующего кода линкера позволяет зарезервировать часть памяти в ОЗУ для размещения vtable, data и ramfunc, а значения для инициализации данной части ОЗУ - заполняются значениями из FLASH на этапе выполнения кода перед вызовом функции main() средствами компилятора.
Код: Выделить всё
.data :
{
__data_start__ = .;
*(vtable)
*(.data*)
*(.ramfunc*)
...
. = ALIGN(4);
/* All data end */
__data_end__ = .;
} > DATA_RAM AT > CODE_FLASH
Конечно, возможно объявить как ramfunc только те функции, которые непосредственно осуществляют запись и стирание Flash памяти.
В нашем загрузчике все функции, кроме функции инициализации загрузчика, размещаются в ОЗУ и все работает корректно.