реклама на сайте
подробности

 
 
> Задержка в несколько системных тиков на ассемблере
Haamu
сообщение Sep 26 2014, 12:04
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Есть простой код на ассемблере:
Код
#define delay(tick) __asm("mov r0, %0 \n" "cycle: subs r0, #1 \n" " bhi cycle"::"r"(tick / 2))

Главная его проблема в том, что переход происходит на метку (cycle:), из за чего получается использовать его только один раз. При повторном использовании компилятор ругается, что такая метка уже существует.
Подскажите, как можно уйти от метки, не увеличивая сильно число команд?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WitFed
сообщение Sep 26 2014, 12:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



Это я не знаю, могу только из вариантов предложить использовать текущий счётчик команд -- он обычно виден в ассемблере типа $PC, ну или к имени метки приделывать макрос __LINE__ через # или ## -- не помню точно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 26 2014, 13:40
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



2TC: Так ведь намного читабельней. Не находите?
Код
    static __inline void __attribute__((always_inline)) delay_4cycles(uint32_t cy)  // +1 cycle
    {    
        __asm__ __volatile__
        (
            "loop%=: subs %[cnt],#1"  "\n\t"
            "        bne  loop%="     "\n\t"
            : [cnt]"+r"(cy)           // output:  +r means input+output   http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
            :                         // input:
            : "cc"                    // clobbers:
        );
    }


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 18:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016