Код: Выделить всё
LDR R0,[DAT]
DAT:
.WORD 0x12345678
Код: Выделить всё
asm(".word %0"
::"i"(k)
);
Как мне заставить ассемблер не писать эту решетку?
Или еще какой способ введения константы в регистр подскажите.
Код: Выделить всё
LDR R0,[DAT]
DAT:
.WORD 0x12345678
Код: Выделить всё
asm(".word %0"
::"i"(k)
);
Код: Выделить всё
#define MY_ASM(x) \
asm volatile ( \
"Здесь Ваш код\n\t" \
"%0 - регистр с константой\n\t" \
"регистр выберет компилятор\n\t" \
"Для примера: \n\t" \
"push %0\n\t" \
"pop %0\n\t" \
: : "r" (x) \
);
void __attribute__((naked)) foo (void)
{
MY_ASM (0x12345678);
}
Код: Выделить всё
.file "test.c"
.text
.align 2
.global foo
.type foo, %function
foo:
@ Naked Function: prologue and epilogue provided by programmer.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
ldr r3, .L3
@ 17 "test.c" 1
Здесь Ваш код
r3 - регистр с константой
регистр выберет компилятор
Для примера:
push r3
pop r3
@ 0 "" 2
.L4:
.align 2
.L3:
.word 305419896
.size foo, .-foo
Код: Выделить всё
asm("ldr r0,%0\n\t"::"m"(n));Код: Выделить всё
asm("ldr r0,%0\n\t"::"m"(n));Вы неправы. Компилятор все знает. Для этого в clobber листе прописываются регистры которые задействованы в ассемблерной вставке.Скрытая бомба, это когда Вы выбираете регистр и его же использует компилятор, не зная что он портится в Вашем asm-коде.
На чистом asm я не смогу вставить inline код. Только в виде вызова подпрограммы, а в ARMах на вызов и возврат тратится огромное количество тактов, что не приемлемо. А еще придется перед каждым вызовом считать на лету тики,частоты. А в inline коде я это посчитаю на этапе компиляции в дефайнах. Короче идея не годится.Опять Вы загадки задаете. Раз уверены, что это можно сделать циклом (никакие кэши/pipeline и прочее не помешают Вам - я не читал Cortex-M1 Technical Reference Manual - мне не надо было), напишите без загадок, какой ассемблерный код должен быть сгенерен. В конце концов можно эту фунцию сделать на чистом asm (не inline).
Хм. И где же в Вашем коде указано, что r0 портится?Код: Выделить всё
asm("ldr r0,%0\n\t"::"m"(n));
Вы не можете знать точное время выполнения той или иной инструкции в STM32 с его арбитражем шин, временем доступа к памяти программ и регистром предвыборки (не помню его аббревиатуру).paskal писал(а):Конкретно, мне нужно формировать точные задержки. Для этого загрузить параметр в регистр, а потом прокрутить цикл.