1. Всё, что должно помещаться в ram, есть initialized data - секция .data по умолчанию. Ну и ссылки начала и конца - _sidata, _edata.
По сути то, что вы описали - есть ramfunc. Если абстрагироваться от заморочек с ресетом по питанию и передачей управления, то кусок скрипта линкёра примерно такой должен быть:
Код
.text.align :
{
. = ALIGN(8);
_etext = .;
_sidata = _etext; /* start of initialized data label */
} > FLASH
/* .ramfunc : AT ( _sidata ) */ /* RAM functions section */
/* RAM functions section */
.ramfunc :
{
. = ALIGN(8);
__exec_mem_start__ = .;
_sdata = .; /* start of .data label */
SORT(*)(.ramfunc)
SORT(*)(.ramfunc.*)
SORT(*)(EXECUTABLE_MEMORY_SECTION*) /* eeprom functions from MDR_StdPeriph_Driver */
. = ALIGN(4);
__exec_mem_end__ = .;
} > RAM AT > FLASH
.data : /* AT makes the LMA follow on in the binary image */
{
. = ALIGN(4);
SORT(*)(.data)
SORT(*)(.data*)
. = ALIGN(4);
_edata = .; /* end of .data label */
} > RAM AT > FLASH
Играясь с указателем адреса .ramfunc : AT (
_sidata ), можно расположить где захотите. В моём примере будет как раз то, что вы просите.
2. Если вы стёрли флэш и сделали ресет, то передача управления идёт в соответствие с режимом загрузки. Если ваш МК позволяет стартовать из ОЗУ после ресета, то всё должно проканать... Не знаю, надо думать!