Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeitsoptimierung durch inline-Assembler?


von Oz z. (ozzy)


Lesenswert?

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

von lkmiller (Gast)


Lesenswert?

Was sind Q2_1, Q1_1 und Q0_1?
char, short, long, ...?

Bitte etwas mehr Input (z.B. Source)

von lkmiller (Gast)


Lesenswert?

Prozessor, Programmiersprache?

von Oz z. (ozzy)


Lesenswert?

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...

von Benedikt K. (benedikt)


Lesenswert?

Es sollte sich auch in C etwas optimieren lassen, z.B. indem man lokale 
nicht volatile Variablen verwendet.

von Oz z. (ozzy)


Lesenswert?

Hi,

da ich aber später noch auf die Varibalen zugreifen muss, müssen diese 
global sein...

von Der A. (der-albi)


Lesenswert?

Kannst du mal bitte den ASM_Outout Zeigen it den 4 / 16+12 Befehlen?
Wenn man den Unterschi8ed kennt, kann man auch helfen bzw den Sinn 
erkennen ;-)

von yalu (Gast)


Lesenswert?

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.

von Oz z. (ozzy)


Lesenswert?

@Der Albi: kannst Du mir denn sagen, wo ich die generierte 
assembler-Datei finden kann?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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...

von Oz z. (ozzy)


Lesenswert?

Stimmt, deshalb habe ich sie auch nicht mehr als volatile deklariert...

von yalu (Gast)


Lesenswert?

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.

von Oz z. (ozzy)


Lesenswert?

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

von Detlef _. (detlef_a)


Lesenswert?

>>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

von Oz z. (ozzy)


Lesenswert?

Hi,

danke, habe es doch noch rausgefunden:

_asm__ __volatile_ ( "in  _tmp_reg_, __SREG__"  "\n\t" );

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.