Moin,
ich probiere gerade den Code in einer ISR kurz zu bekommen. U.a. steht
da folgendes:
1
Q2_1=Q1_1;
2
Q1_1=Q0_1;
Wenn ich im Debugger da durchgehe, sehe ich, dass er für den ersten
Befehl 12, und für den zweiten sogar 16 Takte benötigt.
Die Variablen sind global und volatile. Nehme ich das volatile weg, so
braucht er nur noch 4 Take pro Befehl. Aber geht das mit
inline-Assembler noch schneller? Oder wie würde da der Code für
aussehen?
MfG, und vielen Dank, Ozzy
Sorry, blöd von mir, voll vergessen...
Also es handelt sich bei beiden um globale Varibalen, als extern
deklariert, beide vom Typ int16_t.
Sorry für die vergessene Angabe, so kann man das ja echt nicht
beantworten...
Es ist ein Atmega128, Programmiersprache C mit AVR-GCC...
Besser als 4 Zyklen geht's für Variablen im RAM nicht: Zweimal ein
Byte laden und zweimal ein Byte speichern. Bei mir wird der gleiche
Code erzeugt, wenn die Variablen volatile sind.
Christoph O. wrote:
> da ich aber später noch auf die Varibalen zugreifen muss, müssen diese> global sein...
Naja, nicht alles, was man später noch braucht, muss volatile sein...
Nachtrag zu meinem vorigen Post:
Für einen kompletten 16-Bit-RAM-RAM-Tranfer werden sogar 8 Zyklen
benötigt. Wenn dein Programm es in 4 Zyklen schafft, bedeutet das
wahrscheinlich, dass Q1_1 und Q0_1 auf Grund vorheriger Operationen
bereits in Registern liegen.
Stimmt, ich habe mir gerade mal die lss-Datei angesehen, da sieht man,
dass er das doch schon vorher geladen hat.
Aber vielleicht könnt Ihr mir ja noch etwas bei dem Inline-Assmbler
helfen, denn damit komme ich gar nicht klar...
Was muss ich denn z.B. schreiben, wenn ich das SREG-Register sichern
möchte? So?: asm("in %0, %1" : "=r30" : "=0x3f" );
MfG, und vielen Dank, Ozzy
>>Q2_1 = Q1_1;>>Q1_1 = Q0_1;
der Code und die Variablenbezeichnungen lassen ja darauf schließen,
dass Du da irgendwelche Daten 'durchschiebst'. Solche hacks gehen besser
und schneller wenn man nicht die Daten bewegt sondern über Zeiger auf
sie zugreift.
Cheers
Detlef
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.