Цитата(bug_fix @ Aug 17 2008, 19:47)

А вот как сказать компилятору, что это костантный массив данных лежащий в памяти программ (FLASH) пока чего то не раскопал.
Все глобальные переменные, описанные с квалификатором const по умолчанию складываются в секцию rodata. Но поскольку вы собираетесь переписывать ваши данные и не хотите случайно затереть остальные константы, то вам надо поместить ваши данные в отдельную секцию и в скрипте линкера добать эту секцию с выравниванием на границе сектора. Примерно так:
Код
.c:
#define MYFLASH __attribute__((section(".myflash")))
MYFLASH uint8_t const array[256];
.ld:
.text :
{
..........
} > ROM
.data :
{
.........
} > RAM AT > ROM
..........
.myflash :
{
. = ALIGN(256);
*(.myflash)
. = ALIGN(256);
} > ROM
Здесь начальные значения констант (.data) размещаются вслед за выходной секцией .text, поэтому описание выходной секции .myflash я поместил после .data, чтобы эта секция располагалась последней. Как вариант - можно описать отдельный регион памяти для этих констант и линковать .myflash в этот регион:
Код
/* memory layout */
MEMORY
{
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 0x00010000 - 512 /* 64K - MYFLASH*/
MYFLASH (rx) : ORIGIN = 0x000010000 - 512, LENGTH = 512
RAM (rw) : ORIGIN = 0x00200000, LENGTH = 0x00004000
}
..........
.myflash :
{
*(.myflash)
} >MYFLASH