Ich möchte einen ARM Cortex M0 + für n Zyklen verzögern, ohne einen Timer zu verwenden, mit der kleinstmöglichen Code-Größe. (Ich denke, dies erfordert die Verwendung der Baugruppe.)Wie verzögert man einen ARM Cortex M0 + für n Zyklen, ohne einen Timer?
Eine Verzögerung von 0 Zyklen ist einfach kein Code. Eine Verzögerung von 1 Zyklus ist ein einzelner NOP. Eine Verzögerung von 2 Zyklen ist zwei NOPs.
An welchem Punkt ist es (Code-Größe) effizient, Schleife zu starten?
Wie viele Zyklen braucht die engste Schleife? Was ist die Setup-Zeit?
Beitrag Antwort Anmerkungen:
Der folgende C-Code:
register unsigned char counter = 100;
while (counter-- > 0) {
asm("");
}
, wenn sie mit gcc kompiliert und O3 gibt:
mov r3, #100
.L5:
sub r3, r3, #1
uxtb r3, r3
cmp r3, #0
bne .L5
Dieses entweder zeigt, dass es immer noch Zweck in Hand-Codierung ARM-Assembly, oder (viel wahrscheinlicher), dass der C-Code oben ist nicht der beste Weg der Con Vey an den Compiler, was ich machen möchte.
Kommentare?
Mit 'char' wird die Schleife verlangsamt. Wenn Sie stattdessen "int" verwenden, wird die Anweisung "uxtb" nicht mehr angezeigt. – TonyK