Ошибка переноса armcc на armclang: неизвестное имя регистра 'cp15:0:c9:c12:0'
Я пытаюсь перенести компиляцию исходного кода с armcc compiler v5.06 на armclang v6. И я вижу ошибки armclang, говорящие, что он не может распознавать регистры cp15. Похоже, что в armcc vs clang могут быть изменения в том, как объявлять регистры. Однако я не смог найти ничего в документации по миграции или в документации компилятора.
Вот фрагмент кода -
void reset_clock_count(void)
{
register uint32_t reg_cp15_pmcr __asm("cp15:0:c9:c12:0");
reg_cp15_pmcr |= RESET_CYCLE_COUNTER;
}
И фрагмент ошибки -
error: unknown register name 'cp15:0:c9:c12:0' in asm
register uint32_t reg_cp15_pmcr __asm("cp15:0:c9:c12:0");
^
Я вижу такие же ошибки для других мест в аналогичном объявленном реестре. Любой указатель на то, что могло пойти не так, будет полезным.
Изменить: фактический ответ ниже.
register uint32_t val;
__asm volatile ("mrc p15, 0, %0, c9, c13, 0": "=r"(val));
val |= RESET_CYCLE_COUNTER;
__asm volatile ("mcr p15, 0, %0, c9, c13, 0":: "r"(val));
1 ответ
Пожалуйста, сначала прочтите руководство, и это тоже упоминалось в комментариях.
To access the PMCR, read or write the CP15 registers with:
MRC p15, 0, <Rt>, c9, c12, 0; Read Performance Monitor Control Register
MCR p15, 0, <Rt>, c9, c12, 0; Write Performance Monitor Control Register
вырезать и вставить в мой код, выбрать регистр
MRC p15, 0, r0, c9, c12, 0
используя ассемблер GNU:
Disassembly of section .text:
00000000 <.text>:
0: ee190f1c mrc 15, 0, r0, cr9, cr12, {0}
используя clang как ассемблер
Disassembly of section .text:
00000000 <.text>:
0: ee190f1c mrc 15, 0, r0, cr9, cr12, {0}
Никаких предупреждений и ошибок.
Пожалуйста, сначала прочтите документацию.
Я не вижу, как этот синтаксис будет работать с любым инструментом, поскольку регистр не был указан. Но также помните, что встроенная сборка очень специфична для компилятора и никоим образом не предполагается переносимой. Так что, если armcc поддерживает этот странный синтаксис, нет никаких причин ожидать, что clang будет.
Всегда сначала используйте настоящую сборку, и только после этого, возможно, встроенную, но очень редко встроенная сборка стоит затраченных усилий. Вы должны часто разбирать его, чтобы видеть, что он строит правильные инструкции.
У вас есть намного больше работы, чтобы этот встроенный asm делал что-нибудь полезное в любом случае, вы добьетесь успеха быстрее с реальной сборкой.
.globl read_pmcr
read_pmcr:
MRC p15, 0, r0, c9, c12, 0
bx lr
.globl write_pmcr
write_pmcr:
MCR p15, 0, r0, c9, c12, 0
bx lr
И, конечно же, перед началом сборки у вас должна быть соответствующая документация.