Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage avr/interrupt.h


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alexander M. (a_lexander)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

Ich hatte mir eben die avr/interrupt.h Datei angeschaut, um zu 
verstehen, wie der sei() Befehl definiert ist.

Eigentlich dachte ich mir da steht sowas wie:
void sei()
{
  SREG = SREG | (1 << SREG_I);
}

Stattdessen steht aber folgendes:
#if defined(__DOXYGEN__)
/** \def sei()
    \ingroup avr_interrupts

    Enables interrupts by setting the global interrupt mask. This function
    actually compiles into a single line of assembly, so there is no function
    call overhead.  However, the macro also implies a <i>memory barrier</i>
    which can cause additional loss of optimization.

    In order to implement atomic access to multi-byte objects,
    consider using the macros from <util/atomic.h>, rather than
    implementing them manually with cli() and sei().
*/
#define sei()
#else  /* !DOXYGEN */
# define sei()  __asm__ __volatile__ ("sei" ::: "memory")
#endif /* DOXYGEN */

Kann mir einer bitte bestätigen, dass meine Idee auch richtig wäre? Mit 
dem Interrupt-Flag im SREG werden ja die Interrupts frei gegeben? Der 
einzige Unterschied wäre, dass meine Idee vielleicht ein bisschen 
ineffizienter in der Ausführung wäre, oder nicht?

2. Wenn nein, wie kann ich diesen Begriff verstehen?
# define sei()  __asm__ __volatile__ ("sei" ::: "memory")

Zudem die Frage, was das mit dem DOXYGEN auf sich hat... Wann / wo wird 
denn das definiert und was soll das bringen?

Danke :)

Grüße

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alexander M. schrieb:
> Zudem die Frage, was das mit dem DOXYGEN auf sich hat... Wann / wo wird
> denn das definiert und was soll das bringen?

Doxygen ist ein Werkyeug zum Erstellen von Dokumentation, das Quellcode 
"lesen" kann.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Alexander M. schrieb:
> DOXYGEN
Das findest du raus....
Kurzform: DOXYGEN generiert Dokumentationen aus dem Quellcode.

Alexander M. schrieb:
> 2. Wenn nein, wie kann ich diesen Begriff verstehen?# define sei()
> _asm__ __volatile_ ("sei" ::: "memory")
Steht doch da im Kommentar haarklein beschrieben.

von Alexander M. (a_lexander)


Bewertung
0 lesenswert
nicht lesenswert
Danke :)

Dann verstehe ich das - glaube ich - mit dem Doxygen. Da geht's dann 
speziell z.B. um folgende Seite:
https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Aber für die Quellcode-Erzeugung müsste ja Doxygen dann aus sein, oder?

Grüße

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
Alexander M. schrieb:
> Aber für die Quellcode-Erzeugung müsste ja Doxygen dann aus sein, oder?

Nö. Doxygen ist ein extra Programm, das den Quelltext scannt und daraus 
automatisch Dokumention erstellt. Es hat mit dem Compiler nix zu tun, 
wenn gleich natürlich Doxygen die C-Syntax kennt. Alle Doxygenkommentare 
sind normale C/C++ Kommentare, die der Compiler ignoriert.

von Frank M. (framucoder)


Bewertung
-1 lesenswert
nicht lesenswert
Ja _DOXYGEN_ ist beim einfachen Compilieren nicht definiert. Das 
scheint mit hier auch eher ein Workaround zu sein, da DOXYGEN wohl nicht 
mit allen AVR spezifischen Besonderheiten klar kommt. Normalerweise ist 
das viele #if define(...) ... #else ... #endif nicht nötig für DOXYGEN.

Deine Anweisung sollte theoretisch auch funktionieren, benötigt aber 
mehrere Assembler Befehle. Ich bin kein AVR Assembler Experte aber wenn 
ich das richtig überblicke wären mindestens 3 Befehle dafür notwendig.

Grob etwa:
* lade SREG in ein Arbeitsregister
* setze bit im Arbeitsregister
* schreibe Arbeitsregister zurück nach SREG

Der AVR kennt aber einen speziellen Befehl dafür, eben sei.
Mit der _asm_ Anweisung kann man direkt im C Code beliebige Assembler 
Befehle eingeben.

: Bearbeitet durch User

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.

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