Цитата(Herz @ Jan 9 2014, 10:11)

А каким образом это делается? Буквально в двух словах, если можно.
На примере GCC: константы складываются в секции .rodata и .rodata.* Если вы в скрипте линкера разместите эти секции в flash (выходная секция .text), то они там и будут жить. А если вы поместите их в выходную секцию .data, то они будут размещены в ОЗУ и проинициализированы из флеша. Примерно так:
Код
.data :
{
. = ALIGN(4);
_sdata = .; /* start of .data label */
*(.ramfunc)
*(.ramfunc.*)
*(.data)
*(.data.*)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)
. = ALIGN(4);
_edata = .; /* end of .data label */
} > RAM AT > TEXT
_sidata = LOADADDR(.data); /* start of initialized data label */
Цитата(andrewlekar @ Jan 9 2014, 12:17)

На ARMах const в определении переменной заставляет компилятор (и линкер) размещать её во флэше.
Компилятор - помещать ее в секцию данных "только для чтения". А линкер - размещать ее там, куда укажут в управляющем скрипте. Для прошиваемых намертво в небольшие процессоры программ эта секция обычно размещается во флеш. А вот если процессор побольше и программа загружается в огромное динамическое ОЗУ из какой-нибудь последовательной флешки - то и секцию констант программист скорее всего разместит в ОЗУ.
Цитата(ViKo @ Jan 9 2014, 12:36)

static const
Строка просто const из flash переписывается в ОЗУ, и уже из ОЗУ используется в функции. Лично сталкивался.
Это какая-то чудовищная недоработка вашего компилятора. Допустим вы в файле myfile1.c размещаете глобальную переменную:
Код
char const Success_string[] = "Слава мне, победителю драконов";
Если вы объявите ее с квалификатором static, то ее область видимости будет ограничена только этим файлом и вы не сможете в файле myfile2.c написать
Код
extern char const Success_string[];
void test()
{
puts(Success_string);
}
А без static - сможете. И нет никаких объективных причин для компилятора размещать константу в одном случае в ОЗУ а в другом - во флеш.
....
Хотя... Я, кажется, понял в чем дело - вы имели дело с
локальными переменными функции. В этом случае да, без static компилятор обязан создать переменную в точке объявления и уничтожить ее в конце области видимости. И сделать он это может только в ОЗУ. А с добавлением static к объявлению
локальной переменной она перестает быть автоматической и может быть размещена во флеше, что вы и наблюдали. То есть никакой мистики тут нет и все происходит строго в рамках стандарта.