mikrocontroller.net

Forum: Compiler & IDEs Zwei Fragen zur Interrupts in C SREG und VEKTOR


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

arbeite mich gerade in C- Programmierung ein:

a)  Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer 
leeren Funktion definieren ( wie ich das in Assembler machen muss -> 
rjmp)
b)  Wird das SREG automatisch gesichert   - oder muss ich das selber 
machen ?

Gruß und Danke !

S.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon wrote:
> Hi,
>
> arbeite mich gerade in C- Programmierung ein:
>
> a)  Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer
> leeren Funktion definieren ( wie ich das in Assembler machen muss ->
> rjmp)

Nein

> b)  Wird das SREG automatisch gesichert

Ja

>   - oder muss ich das selber
> machen ?

Nein

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon wrote:

> a)  Muss ich Interrupts, welche ich nicht benutze trotzdem mit einer
> leeren Funktion definieren ( wie ich das in Assembler machen muss ->
> rjmp)

In Assembler mußt Du nen Quark tun.
Auch wenn einige Leute nicht benutzte Interrupts mit einem RETI belegen, 
damit sie sich dann bei der Fehlersuche nen Wolf suchen können.

In C wird ein default Handler angesprungen, den man tunlichst mit was 
sinnvollem belegen sollte, sonst macht er einfach nen Neustart und man 
sucht sich auch nen Wolf warum.

Für benutzte Interrupts wird automatisch der Handler angesprungen, wenn 
man ihn definiert hat.


> b)  Wird das SREG automatisch gesichert   - oder muss ich das selber
> machen ?

Du machst C und damit sind die Register und SREG erstmal für Dich tabu. 
Der Compiler weiß selber, wann er was zu sichern hat.


Peter

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger,

>> b)  Wird das SREG automatisch gesichert

>Ja

Detailierter: In C ja, in Assembler musst du dich selbst darum kümmern.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> In C wird ein default Handler angesprungen, den man tunlichst mit was
> sinnvollem belegen sollte, sonst macht er einfach nen Neustart und man
> sucht sich auch nen Wolf warum.
>
> Für benutzte Interrupts wird automatisch der Handler angesprungen, wenn
> man ihn definiert hat.

Zwar diesmal ein anderer Simon, aber der hat auch eine Frage:

Wie soll denn der default-Handler heißen? Im Listfile sehe ich, dass 
__bad_interrupt angesprungen wurde. Das ist eine Funktion, die im crt 
definiert ist..

EDIT: *hust *röchel

http://www.nongnu.org/avr-libc/user-manual/group__...

Besser vorher in die Doku schauen *kratz. Ist der Default-Vektor 
eigentlich was neues? Hab den bisher noch nie irgendwo gesehen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon Küppers wrote:

> Besser vorher in die Doku schauen *kratz. Ist der Default-Vektor
> eigentlich was neues? Hab den bisher noch nie irgendwo gesehen.

Nö, den gibt's schon viele Jahre lang.  Ist aber nicht wirklich so
nützlich, wie Peter dich glauben machen will, außer dass man bei
schlampiger Programmierung einen Brechpunkt im Debugger draufsetzen
kann.  Aber das wesentliche Feature, was ihm fehlt, ist dass es
keine "COME FROM"-Anweisung gibt... naja, nicht ganz, aber du merkst
sicher, worauf das hinaus läuft: wenn er triggert, weißt du zwar,
dass du einen nicht zugewiesenen Interrupt hattest, aber das hättest
du natürlich genauso gemerkt, wenn du den Breakpoint auf die Adresse
0 gesetzt hättest und diese ohne einen Reset erreicht worden ist.
Nur, wer ihn getriggert hat, bekommst du nicht so ohne weiteres
raus, und das ist es, was dich eigentlich interessiert.

Wenn ich wirklich in das Dilemma laufe, dann generiere ich mir
üblicherweise mit einem Einzeiler-Perlscript (gleich auf der
Kommandozeile) sowas wie:
uint8_t irq_number;

ISR(__vector_1)
{
  irq_number = 1;
  exit();
}

ISR(__vector_2)
{
  irq_number = 2;
  exit();
}

ISR(__vector_3)
{
  irq_number = 3;
  exit();
}
/* ... */

Die wirklich benutzten Vektoren werden dann ausgespart, und man setzt
im Debugger den Breakpoint auf exit().

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> kann.  Aber das wesentliche Feature, was ihm fehlt, ist dass es
> keine "COME FROM"-Anweisung gibt.

Das stimmt.
Dazu müßte man den default Handler per CALL anspringen und dort dann:

POP Zh
POP ZL

Schon wüßte man, wer der Übeltäter ist.


Peter

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> ... Aber das wesentliche Feature, was ihm fehlt, ist dass es
> keine "COME FROM"-Anweisung gibt...

Hehehe.... Hat schon jemand InterCal auf den AVR portiert?

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.