Функция задержки сборки 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.

Другие вопросы по тегам