mikrocontroller.net

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


Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich probiere gerade den Code in einer ISR kurz zu bekommen. U.a. steht 
da folgendes:
Q2_1 = Q1_1;
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

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sind Q2_1, Q1_1 und Q0_1?
char, short, long, ...?

Bitte etwas mehr Input (z.B. Source)

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prozessor, Programmiersprache?

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Oz zy (ozzy)
Datum:

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke, habe es doch noch rausgefunden:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.