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.
Guck Dir doch einfach an, was der Compiler dafür an Assemblercode erzeugt...
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.