mikrocontroller.net

Forum: Compiler & IDEs interne static Variable in einem asm. File ?


Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte den Overflow Interrupt eines 8-bit Timers verwenden, brauche
aber eine kleinere Auslösefrequenz und
leider ist kein 16 bit Timer mehr frei.

Wäre die ISR in C implementieren, ginge so etwas:

SIGNAL(SIG_OVERFLOW0)
{
   static unsigned char i = 1;

   if( ! i++ )
   {
      ISR...
   }
}
Damit ist die Owerflow-Frequenz um den Faktor 256 langsamer.

Die ISR soll aber in Assembler implementiert werden, was nun?

Wie deklariere ich eine interne static Variable in asm?
Was geht sonst noch ?

Danke für Anregungen.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck Dir doch einfach an, was der Compiler dafür an Assemblercode
erzeugt...

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich auch schon einmal geschaut.

Für      if( ! i++)

kommt dann:

LDS     R24,0x0245       Load direct from data space
SUBI    R24,0xFF         Subtract immediate
STS     0x0100,R24       Store direct to data space
CPI     R24,0x01         Compare with immediate
BRNE    +0x05            Branch if status flag cleared

Der Compiler nimmt 0x0245 im SRAM für i ,
aber welche Adesse soll ich nehmen, wenn ich das in Assembler von Hand
implementiere?

Woher weiss ich, ob der Compiler die Adresse  nicht später nochmal
vergibt ?
Meine Adresswahl ist ja nicht dynamisch und nicht für spätere
Codeerweiterungen geeignet.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab' doch nicht gesagt, daß Du Dir das disassemblieren sollst,
sondern sieh' Dir bitte den Compiler-generierten Assemblercode an.

Hinweis: für die Datei foo.c »make foo.s« eintippen.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
o.k., hab ich gemacht.

  .lcomm i.0,1

ist der Schlüssel zum Glückt, danke für den Hinweis.

i.0 ist das symbol und 1 die länge in Byte. Super.

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.