Jaecko
11.10.2008, 20:13
Naabend.
In nem C-Programm verwend ich für kleine Wartezeiten eine Kombination aus Assembler-Befehlen. Diese Anweisung hab ich selbst auch nur per Copy&Paste übernommen. Da ich von Assembler selbst nicht wirklich viel Ahnung hab, wollt ich mal fragen, was genau dort eigentlich gemacht wird.
static inline void _delay4Cycles(ui16_t __count)
{
if (__count == 0)
{
__asm__ __volatile__("rjmp 1f\n 1:");
}
else
{
__asm__ __volatile__ (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
}
Der "positive" If-Zweig geht ja noch; einfach nur ein Sprung eine Zeile weiter... Also als Basic-Pendant:
GOTO 1
1:
D.h. die Wartezeit wäre hier 1 Cycle.
Nur der "negative" If-Zweig stellt mich dann vor ein Problem.
Was macht dort jede Zeile im einzelnen?
mfG
In nem C-Programm verwend ich für kleine Wartezeiten eine Kombination aus Assembler-Befehlen. Diese Anweisung hab ich selbst auch nur per Copy&Paste übernommen. Da ich von Assembler selbst nicht wirklich viel Ahnung hab, wollt ich mal fragen, was genau dort eigentlich gemacht wird.
static inline void _delay4Cycles(ui16_t __count)
{
if (__count == 0)
{
__asm__ __volatile__("rjmp 1f\n 1:");
}
else
{
__asm__ __volatile__ (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
}
Der "positive" If-Zweig geht ja noch; einfach nur ein Sprung eine Zeile weiter... Also als Basic-Pendant:
GOTO 1
1:
D.h. die Wartezeit wäre hier 1 Cycle.
Nur der "negative" If-Zweig stellt mich dann vor ein Problem.
Was macht dort jede Zeile im einzelnen?
mfG