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


von Simon (Gast)


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.

von Karl H. (kbuchegg)


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

von Peter D. (peda)


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

von Werner B. (Gast)


Lesenswert?

@  Karl heinz Buchegger,

>> b)  Wird das SREG automatisch gesichert

>Ja

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

von Simon K. (simon) Benutzerseite


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__avr__interrupts.html

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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:
1
uint8_t irq_number;
2
3
ISR(__vector_1)
4
{
5
  irq_number = 1;
6
  exit();
7
}
8
9
ISR(__vector_2)
10
{
11
  irq_number = 2;
12
  exit();
13
}
14
15
ISR(__vector_3)
16
{
17
  irq_number = 3;
18
  exit();
19
}
20
/* ... */

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

von Peter D. (peda)


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

von Εrnst B. (ernst)


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?

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.