Я пытаюсь скомпилировать следующие два фрагмента кода с помощью компилятора ARM 5 для микропроцессора Cortex A:
Часть 1:
static inline void cp15_write_sctlr(uint32_t value)
{
asm("mcr p15, 0, %0, c1, c0, 0" :: "r"(value));
}
static inline uint32_t cp15_read_actlr(void)
{
uint32_t actlr;
asm("mrc p15, 0, %0, c1, c0, 1" : "=r"(actlr));
return actlr;
}
Часть 2:
static inline void dmb(void)
{
asm("dmb" ::: "memory");
}
static inline void dsb(void)
{
asm("dsb" ::: "memory");
}
static inline void isb(void)
{
asm("isb" ::: "memory");
}
В обоих случаях я получаю ошибки компиляции. См. ниже в качестве примера.
line 64: Error: #18: expected a ")"
asm("dsb" ::: "memory");
Ошибка вызвана версией компилятора (компилятор ARM 5), которая не поддерживает Extended Asm?
Если я перепишу код в Часть 1 следующим образом, я не получу никакой ошибки. Эквивалентен ли следующий код коду из части 1?
static inline void cp15_write_sctlr(uint32_t value)
{
__asm
{
MCR p15, 0, value, c1, c0, 0
}
}
static inline uint32_t cp15_read_actlr(void)
{
uint32_t actlr;
__asm
{
MRC p15, 0, actlr, c1, c0, 1
}
return actlr;
}
Как я мог переписать код в части 2, если компилятор не поддерживает расширенный Asm? Я имею в виду следующее, но не уверен, что это одно и то же.
static inline void dmb(void)
{
__schedule_barrier();
__asm("dmb");
__schedule_barrier();
}
static inline void dsb(void)
{
__schedule_barrier();
__asm("dsb");
__schedule_barrier();
}
static inline void isb(void)
{
__schedule_barrier();
__asm("isb");
__schedule_barrier();
}
Любая помощь могла бы быть полезна.
gcc
. Я подозреваю, что с производительностью все будет в порядке [хотя и не так быстро, как чистый встроенный код]. Вы можете добиться того же с помощью функции C, которая на 100% состоит из ассемблерного блока и является чистой. Это может по-прежнему работать как функцияgcc
. Я бы разобрал файл.o
, чтобы увидеть фактический код, сгенерированный для данной функции, чтобы увидеть, насколько хорошо она работает. - person Craig Estey   schedule 27.12.2020.s
. Однако я вижу, что есть встроенные средства управления барьерами памяти во время копирования: " rel="nofollow noreferrer">ссылка. Просто интересно, будут лиstatic inline
,.o
и _4_ вести себя как определения в Части 2. - person Craig Estey   schedule 27.12.2020