mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik critical regions vom XC164CM


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

ich habe folgende Beschreibung über Interrupts vom XC164CM gelesen:

Unlike the classic C167, C166S V2 pipeline enhancements mean that 
clearing the global interrupt enable flag
(PSW.IEN = 0) will immediately disable all interrupts. This removes the 
need to insert NOP instructions after
clearing the flag. However this instant disabling does not apply to 
individual interrupt sources i.e. the Interrupt
Enable flags for the various peripherals.
Where it is critical that a particular interrupt is disabled before any 
other operation can begin (i.e. there is a critical
region), special steps are required that do not use the ATOMIC sequence 
instruction. Therefore to clear, for
example, the GPT12E_T3IC_IE flag or GPT12E_T3IC_IR flag, the following C 
macro is recommended by
Infineon:
#define Disable_One_Interrupt(IE_bit) \\
{if(IEN) {IEN=0; IE_bit=0; while (IE_bit); IEN=1;} else {IE_bit=0; while IE_bit);}}
Usage Example:
Disable_One_Interrupt(GPT12E_T3IC_IE) ; // T3 interrupt enable flag

Ich verstehe dies nicht ganz. Was wird geschafft mit
IE_bit=0; while (IE_bit);
?

Gruss
Senmeis

Autor: TManiac (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Senmeis,

der Gedanke hinter dem Macro ist (wie es der Text weiteroben 
beschreibt), dass das Löschen des IEN, des globalen InterruptEnableBits, 
eine ATOMIC sequence instruction ist. Das Löschen der einzelnen 
EnableBits aber nicht.

Der Befehl IE_bit=0; muss also erst durch die Pipeline.
Das heißt also, wenn zum Beispiel du am Anfang einer Interrupt-Routine 
den Interrupt vorübergehend sperren willst (zum Beispiel zum Entprellen) 
solltest du darauf achten das inzwischen kein weiterer Interrupt 
aufgetreten ist.

Folgendes Beispiel:
Du hast einen extrem prellenden Taster und willst seine Änderung mit 
einem Interrupt auswerten.
Interrupts sind aktiv
Es wird der Taster gedrückt.
-> Interrupt löst aus.
-> der Controller springt zum ersten Befehl der ISR und löscht 
automatisch das Interrupt-Flag.
Der erste Befehl in der ISR ist "disable Interrupt der ISR" damit das 
Prellen des Testers die ISR nicht gleich noch einmal auslöst. Nun gehst 
man davon aus, dass der Interrupt gesperrt ist. Dem ist aber nicht so, 
dass dauert noch drei Zyklen (wenn ich mich jetzt nicht täusche) bis der 
Befehl durch die Pipeline im Core angekommen ist.
das Makro sorgt nun dafür, dass nichst anderes gemacht wird bis das 
lokale IEN gelöscht ist. Es sorgt sogar dafür, dass auch keine weiteren 
Interrupts gemeldet werden können bis das lokale Flag gelöscht ist.

Das Makro ist also nur erforderlich, wenn man schnell auf einander 
folgende Events ausblenden will, um parallele Interrupts (man kann ja 
auch eine andere ISR deaktivieren) oder aber um aus dem Hauptprogramm 
heraus ohne Pipelining-Effekte, definiert einen Interrupt zu 
deaktivieren.

Gruß,
TManiac

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.