реклама на сайте
подробности

 
 
> ADR vs LDR
jcxz
сообщение Apr 6 2014, 15:25
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Обратил внимание на странное поведение 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 на путь истинный - путь удаления лишних указателей?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- jcxz   ADR vs LDR   Apr 6 2014, 15:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 04:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016