Цитата(ak_mnp @ Sep 1 2011, 12:47)

как правильно сделать копирование функций работы с Flash памятью из ROM в RAM при старте микроконтроллера?
Это зависит сильно от компилятора/линкера. Помню, у яровского компилятора для ARM была фича __ramfunc, то есть там всё это само делалось.
В общем случае нужно сгенерить код, не привязанный к адресам в ПЗУ, то есть либо привязанный к адресам в ОЗУ (где он и должен выполняться), либо вообще позиционно-независимый код (PIC - position-independent code). Потом нужно сделать процедуру копирования из ПЗУ в ОЗУ, которая при это как-то должна узнать размещение и размер этого кода в ПЗУ. Очевидно, что все эти шаги требуют нестандартную поддержку со стороны компилятора/линкера. Например, не всякий компилятор умеет делать PIC код.
Если функция небольшая, то можно вбить её машинный код в статический массив и вызывать его. Преимущество - работает на любом компиляторе. Вот пример для STM8:
Код
/*
void
block_write(uint8_t *src, uint8_t *dst)
{
int8_t i;
FLASH_CR2 = 0x10;
FLASH_NCR2 = 0xEF;
for (i = 64; i > 0; i--)
{
*dst++ = *src++;
}
}
*/
static uint8_t __near block_write_code[] = {
0x35, 0x10, 0x50, 0x5B, /* MOV FLASH_CR2, #0x10 */
0x35, 0xEF, 0x50, 0x5C, /* MOV FLASH_NCR2, #0xDF */
0x35, 0x40, 0x00, 0x00, /* MOV ?b0, #0x40 */
0xF6, /* loop: LD A, (X) */
0x90, 0xF7, /* LD (Y), A */
0x5C, /* INCW X */
0x90, 0x5C, /* INCW Y */
0xB6, 0x00, /* LD A, ?b0 */
0x4A, /* DEC A */
0xB7, 0x00, /* LD ?b0, A */
0x26, 0xF3, /* JRNE loop */
0x81, /* RET */
};
static void (*const block_write)(uint8_t *src, uint8_t *dst) = (void (*)(uint8_t *src, uint8_t *dst))block_write_code;
Ну вот, написал опус и только потом заметил, для чего всё это затевается. На самом деле в MCF5223x код, работающий с флэш, можно вызывать прямо из флэш. Я, собственно, так и делаю. Есть несколько проектов, где флэш интенсивно используется (эмуляция EEPROM). Уже несколько лет - полёт нормальный.