Обратил внимание на странное поведение IAR (v5.50) при компляции кода для Cortex-M3: почему-то редко используется инструкция ADR.
Т.е. - имеем static константу, используем её в функции.
Казалось-бы - компилятор должен разместить её в readonly-секции где-то рядом с функцией. Дальше - в функции получить её адрес инструкцией ADR.
Размещать он её так размещает, но почему-то ADR использует редко. Чаще всего создаёт дополнительную константу с указателем на нашу константу (DC32),
и затем - грузит этот указатель инструкцией LDR.
Зачем он это делает???
Константа локальная (используется только в одном месте). Зачем создавать лишний указатель в FLASH и грузить его, если можно проще - ADR??
Посчитал - во всём проекте инструкция ADR у меня встречается раз 5, в то время как констант - сотни. Т.е. - адресация во всех остальных случаях делается через дополнительный DC32 + LDR.

Потестил:
Код
LogsCR0("TES");
LogsCR0("TT");
LogsCR0("TESTA");

Вот что получаю на выходе:
CODE
LogsCR0("TES");
.... ADR.N R0,??DataTable1 ;; "TES"
........ BL _Z13ServiceLogsCRPKc
LogsCR0("TT");
.... ADR.N R0,??DataTable1_1 ;; "TT"
........ BL _Z13ServiceLogsCRPKc
LogsCR0("TESTA");
.... LDR.N R0,??DataTable1_7
........ BL _Z13ServiceLogsCRPKc

In section .text, align 4, keep-with-next
??DataTable1:
54455300 DC8 "TES"

In section .text, align 4, keep-with-next
??DataTable1_1:
54540000 DC8 "TT",0x0

In section .text, align 4, keep-with-next
??DataTable1_7:
........ DC32 `?<Constant "TESTA">`

In section .rodata, align 1
54455300 DC8 "TES"

In section .rodata, align 1
545400 DC8 "TT"

In section .rodata, align 1
`?<Constant "TESTA">`:
544553544100 DC8 "TESTA"

Видно что первые две строчки скомпилились с использованием ADR, а 3-я - с LDR специально для которой был создан доп. указатель ??DataTable1_7.
Если описать строки отдельно, типа:
static char const t[] = "TT";
LogsCR0(t);
то ADR никогда не будет, всегда будет DC32 + LDR.

Как наставить IAR на путь истинный - путь удаления лишних указателей?