Forum: Mikrocontroller und Digitale Elektronik Speicherauslastung durch Interrupts


von Durban (Gast)


Lesenswert?

Hallo,
habe mal eine Frage zu den Interrupts von Timern.
Wenn man die Interrupt-Routine verwendet, wird dafür anscheinend viel 
Speicher benötigt. Ich verwende MPLAB und beim Kompilieren werden bei 
meinem PIC mit der Interrupt-Routine 46% des ROM benötigt, ohne 
Interrupt-Routine nur 8%.
Auszug aus dem Compiler:
1
Memory usage:   ROM=46%      RAM=39% - 67%

Ich weiß zum einen noch nicht genau, was der Compiler mit ROM (Read-only 
memory) meint. Geht es um den EEPROM?
Gibt es eine Möglichkeit, den für Interrupts benötigten Speicher zu 
reduzieren?

MFG

von Weingut P. (weinbauer)


Lesenswert?

bin zwar bei den AVR daheim, kann mir aber nicht vorstellen
was der Timer-Int mit dem EEPROM zu tun haben sollte.
Kann mir höchstens nen Frame bzw. Stack vorstellen der angelegt wird ...

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ich kenne mich auch nur bei den AVRs aus, aber der ROM ist der Speicher, 
wo dein Programm gespeichert wird. In der Regel ist das Flash-ROM. Der 
hohe RAM-Speicherverbrauch kommt wohl daher, dass die Register und die 
Rücksprungadresse auf dem Stack gespeichert werden.


Gruß
Jonathan

von (prx) A. K. (prx)


Lesenswert?

Obacht, MPLAB steht für PICs, und die sind bisschen besonders. AVR 
Kenntnisse helfen da nur begrenzt. Einerseits weil sie oft einen 
Hardware-Stack für Returnadressen haben. Andererseits weil sie je nach 
Familie und Compiler und Compilereinstellung ihre lokalen Daten nicht 
auf den Stack legen, sondern statisch. Führt insgesamt zu zwei Stacks, 
einer für die Returnadressen und einer für Daten ja nach Einstellung und 
Attribut "reentrant".

von Udo S. (urschmitt)


Lesenswert?

Im "Rom" liegt dein Programmcode. Entweder ist dein Programm in der 
Interruptroutine so groß, oder -was wohl wahrscheinlicher ist- du 
verwendest in der Interruptroutine Funktionen, die große Bibiotheken 
einbinden, zum Beispiel ein sprintf, oder Floatingpoint Operationen.

von Durban (Gast)


Lesenswert?

Du hast Recht: In meiner Interrupt-Routine befindet sich der Code:
1
Interrupts=Interrupts+1;
(Ich schreibe in C)
Damit soll der Overflow des Timers gezählt werden. Und genau diese Zeile 
führt zu der hohen Speicherauslastung.
Der Code
1
Interrupts=1;
würde wesentlich weniger Speicher verbrauchen, allerdings würde das 
natürlich nicht dem Zweck entsprechen.
Hmm, kann man das irgendwie "günstiger" programmieren?

MFG

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nimm "Interrupts++;" - das ruft nur den INC-Befehl des µCs auf.


Gruß
Jonathan

von (prx) A. K. (prx)


Lesenswert?

Jonathan Strobl schrieb:

> Nimm "Interrupts++;" - das ruft nur den INC-Befehl des µCs auf.

Ist dein verwendeter Compiler so begrenzt, dass er diesen Hinweis 
wirklich benötigt? Ausserdem setzt du voraus, dass es eine 8-Bit 
Variable ist. Durban spart ja arg an Information.

von Durban (Gast)


Lesenswert?

Leute, ich muss mich bei euch entschuldigen! Wo hab ich nur meinen 
Kopf?!
Habe die Variable "Interrupts" nicht als Integer sondern als float 
definiert. So was unnötiges!
Tut mir echt Leid!

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.