Patrick Kaplan wrote:
> ich wolle meinen bestehenden Code "beschleunigen" in dem ich einige
> passagen in Assembler programmier.
Was macht dich glauben, dass du ihn damit "beschleunigen" könntest?
Hast du dir denn den generierten Code erstmal angeguckt?
Ist natürlich besonders lustig, wenn du anschließend Warteschleifen in
Assembler schreibst. Schneller warten, oder was? :-)
> in der doku fand ich:
>
In der Doku solltest du deutlich mehr darüber finden:
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
> und dann hab ich mal einfach
> while (!(SPSR & (1<<SPIF))); //wait for SPIF
> durch dies ersetzt:
Hmm, das ist nun ein typischer Fall, bei dem es wohl absolut gar
keinen Sinn hat. Erstens (siehe oben) verwartest du deine Zeit ja
sowieso nur, zweitens ist der vom Compiler generierte Code wohl durch
nichts zu unterbieten:
1 | .global waitspi
|
2 | .type waitspi, @function
|
3 | waitspi:
|
4 | /* prologue: frame size=0 */
|
5 | /* prologue end (size=0) */
|
6 | .L3:
|
7 | sbis 46-0x20,7
|
8 | rjmp .L3
|
9 | /* epilogue: frame size=0 */
|
10 | ret
|
11 | /* epilogue end (size=1) */
|
(compiliert für einen ATmega8)
>
1 | > asm volatile ("loop1: \n\t"
|
2 | > "sbis spsr,spif \n\t"
|
3 | > "rjmp loop1 \n\t"
|
4 | > );
|
Erstens würden sich SPSR und SPIF groß schreiben, nicht klein.
Zweitens kennt der Assembler diese Namen einfach nicht -- avr/io.h
löst sie ja für den C-Compiler auf, nicht für den Assembler. Du
müsstest also den Compiler (der die Umsetzung ja kennt) anweisen, die
entsprechenden Zahlenkonstanten in das inline asm statement
runterzureichen.
Aber siehe oben, viel Aufwand für keinerlei Effekt.