Функция задержки сборки ARM не работает с унифицированным синтаксисом / thumb-2
Я использую следующий код для простой задержки / ожидания ARM на основе счетчика:
.thumb_func
dowait:
ldr r7,=0x200000
dowaitloop:
sub r7,#1
bne dowaitloop
bx lr
Я получил эту функцию из blinker01 mbed_samples от dwelch, которая прекрасно работает в других программах-образцах типа мигающего светодиода. Однако программа, над которой я сейчас работаю, должна иметь .syntax unified
вверху, потому что я использую инструкции Thumb-2 (например, ITTEE).
Я подозреваю, что ".syntax унифицированный" является проблемой, потому что я взял известный работающий пример blinker01 и добавил .syntax unified
и это больше не работает, когда я загрузил на мою доску.
В то время как у меня еще нет всей информации о GDB, чтобы доказать это, функция, кажется, не считает / задерживает.
Есть ли другой способ переписать эту функцию "задержки" для работы с унифицированным синтаксисом / Thumb-2?
1 ответ
Вам нужно использовать SUBS
когда вы хотите, чтобы инструкция обновляла флаги.
.syntax unified
.thumb_func
dowait:
ldr r0,=0x200000
dowaitloop:
subs r0,#1
bne dowaitloop
bx lr
Еще одно примечание: R7 не является клоббер-регистром, поэтому в случае, если вы используете функцию dowait из кода "C", будут ошибки, так как компилятор не ожидает, что R7 будет изменен. Вот почему я изменил его на R0.