Zwei Fragen zur Interrupts in C SREG und VEKTOR

Gast #654856
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.
#654859
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
#654860
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
Persönliche Seite #654887
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.
Moderator Persönliche Seite #655180
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().
#655528
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren