QUOTE (RCray @ Mar 26 2012, 21:44)

Так у вас тоже под константы место выделяется отдельно, а для данных которыми инициализируются этими константами отдельно.
Да, все верно. А у вас что, и код и данные грузятся перед исполнением в ОЗУ какой-то сторонней запускалкой? Тогда просто убрать AT > ROM и данные будут расположены сразу по адресам .data, а копирование будет не нужно.
Этот же скрипт полагает, что программа находится во флеше и исполняется после включения питания из флеша. А данные {1,2,3,4,5} в ОЗУ после включения питания должны откуда-то как-то появится, они ведь теряются после выключения питания, вот они и копируются этим циклом, а копироваться они должны из флеша, куда начальные значения и помещаются конструкцией AT > ROM.
А если вы объявите данные как int32_t const a[5] = {1, 2, 3, 4, 5}; то они попадут в секцию .rodata и вот ее можно смело класть в выходную секцию .text, ибо компилятор будет следить за тем, чтобы вы использовали эти данные только для чтения и поэтому они могут лежать во флеше.