Forum: Mikrocontroller und Digitale Elektronik Arduino Interrupt automatisches Handling Registersicherung(SREG)?


von Frank (Gast)


Lesenswert?

Weis jemand, ob Arduino bei Interrupts automatisch die Register(SREG) 
sichert?

Wenn ich in die Implemetierung (WInterupts.c) von Arduino reinscheue, 
dann werden keine Register vorher gesichert, sondern die ISR direkt 
aufgerufen:

ISR(INT0_vect) {
  if(intFunc[EXTERNAL_INT_0])
    intFunc[EXTERNAL_INT_0]();
}

Eigentlich müßte man ja so etwas hinzufügen:
 uint8_t sreg_local; // Lokale Sicherungskopie von SREG
    sreg_local = SREG;
    cli();
    // hierhin kommt der Code mit atomarem Zugriff
 SREG = sreg_local;

In der Arduinodokumentation ist jedoch nirgendwo dokumentiert, das man 
die Register sichern/wiederherstellen muss. Das manuelle sichern würde 
dem Grundgedanken von Arduino widersprechen, Hardwarespezifische Dinge 
zu verbergen. Ich kann mir nur vorstellen, das der Compiler die Register 
automatisch sichert. Kann dazu jemand eine genaue Aussage machen?


Beispiel:

void setup() {

  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handlerFunc, 
CHANGE);
}

void loop() {
  /// do something
}

void handlerFunc() {
  // do something
}

von OPi (Gast)


Lesenswert?

Frank schrieb:
> Eigentlich müßte man ja so etwas hinzufügen:
>  uint8_t sreg_local; // Lokale Sicherungskopie von SREG
>     sreg_local = SREG;
>     cli();
>     // hierhin kommt der Code mit atomarem Zugriff
>  SREG = sreg_local;
>
> In der Arduinodokumentation ist jedoch nirgendwo dokumentiert, das man
> die Register sichern/wiederherstellen muss. Das manuelle sichern würde
> dem Grundgedanken von Arduino widersprechen, Hardwarespezifische Dinge
> zu verbergen. Ich kann mir nur vorstellen, das der Compiler die Register
> automatisch sichert. Kann dazu jemand eine genaue Aussage machen?

Das macht jeder C / C++ Compiler automatisch.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank schrieb:
> zu verbergen. Ich kann mir nur vorstellen, das der Compiler die Register
> automatisch sichert. Kann dazu jemand eine genaue Aussage machen?

 Ja.
 Ansonsten würden die Millionen von Arduino Programmen laufend
 abstürzen.
 Sowohl beim Arduino als auch beim normalen C bedeutet ISR, dass
 Register gesichert werden sollen. Welche Register das sind, entscheidet
 der Compiler aber SREG wird immer gesichert.

von Einer K. (Gast)


Lesenswert?

Marc V. schrieb:
> aber SREG wird immer gesichert.
Normalerweise, ja....
Aber "immer"? Nein!
Und dann noch ein fettes "immer"....
Nöö...

Siehe dazu "__attribute__((naked))"

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Also, falls noch jemand was zum Thema zu sagen hat, darf er das gerne 
tun. Aber wenn ihr euch nur besserwisserisch rumkloppen wollt, dann 
macht doch ein Treffen aus und tut das dann dort...

Wir halten fest: wenn man wie mehr als 99,9% der Programmierer kein 
naked hinschreibt, übernimmt das Sichern der Register der Compiler.
Wenn man es besser können will, dann muss man naked verwenden und ist 
ab da selber für die "Kleidung" zuständig.

: Bearbeitet durch Moderator
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Also, falls noch jemand was zum Thema zu sagen hat, darf er das gerne
> tun.
 Ja.
 Wiederhole meinen gelöschten Beitrag von 10:26, allerdings etwas
 gekürzt:
1
 Beim C werden nur die Register gerettet, die auch tatsächlich in der
2
 ISR benutzt werden.
 Und SREG  natürlich immer und ohne Ausnahmen.
1
 Also wird man es kaum schaffen, dies kürzer als der Compiler zu
2
 schreiben. Deswegen macht sich kaum jemand die Mühe, ISR als naked
3
 zu schreiben, ausser in ganz wenigen Fällen wo die ISR ausschliesslich
4
 in ASM geschrieben ist. Und dann muss man selbst für RETI sorgen, da
5
 ausser einer Sprungadresse und ISR Definition nichts compiliert
6
 wird.

 Dazu muss man aber fähig sein.

von Peter II (Gast)


Lesenswert?

Marc V. schrieb:
> Wiederhole meinen gelöschten Beitrag von 10:26, allerdings etwas
>  gekürzt:
>  Beim C werden nur die Register gerettet, die auch tatsächlich in der
>  ISR benutzt werden.

was aber auch nicht stimmt. Sobald eine (unter)Funktion aufgerufen wird, 
werden (oft) alle Register gesichert, auch wenn sie nicht gebraucht 
werden.

Das ganze ist abhängig davon, wo und wie die Funktion deklariert ist.

von Hannes (Gast)


Lesenswert?

Marc V. schrieb:
> Und SREG  natürlich immer und ohne Ausnahmen.

...wenn du wenigstens schreiben würdest: "mit der einzigen Ausnahme, 
wenn man 'naked' verwendet"....

von Arduinoquäler (Gast)


Lesenswert?

Peter II schrieb:
> Das ganze ist abhängig davon,

Nö, das ist abhängig davon welche Optimierungsstufe beim
Compiler eingestellt ist.

von Peter II (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Nö, das ist abhängig davon welche Optimierungsstufe beim
> Compiler eingestellt ist.

nein, wenn die Funktion in einer anderen Datei ist, dann kannst du 
optimieren so viel du willst.

Maximal LTO könnte helfen.

von Arduinoquäler (Gast)


Lesenswert?

Peter II schrieb:
> wenn die Funktion in einer anderen Datei ist,

... sprich: wenn man dem Optimierer unbedingt einen Stolperstein
in den Weg legen will....

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Hannes schrieb:
> Marc V. schrieb:
>> Und SREG  natürlich immer und ohne Ausnahmen.
>
> ...wenn du wenigstens schreiben würdest: "mit der einzigen Ausnahme,
> wenn man 'naked' verwendet"....

 Warum sollte ich ?
 Kannst du nicht lesen ?
 Bei naked wird ausser Aufruf und Definition nichts generiert, nicht
 mal RETI.

: Bearbeitet durch User
von Arduinoquäler (Gast)


Lesenswert?

Marc V. schrieb:
> Bei naked wird ausser Aufruf und Definition nichts generiert, nicht
>  mal RETI.

Zusatz: könnte man ja leicht verifizieren indem man
sich selbst ein Mini-Testbeispiel schreibt .....

von avr (Gast)


Lesenswert?

Arduinoquäler schrieb:
> ... sprich: wenn man dem Optimierer unbedingt einen Stolperstein
> in den Weg legen will....

Nein, wenn man sauber programmiert. D.h. ein ein entsprechendes 
Softwaredesign hat, abstrahiert und kapselt. Man sollte nicht für den 
Compiler programmieren, sondern eher für lesbaren Code sorgen. Das 
vermeidet wiederum Bugs usw.

Marc V. schrieb:
> Kannst du nicht lesen ?

Nein, du kannst nicht lesen und das ist leider nicht das erste Mal:

Marc V. schrieb:
> Beim C werden nur die Register gerettet, die auch tatsächlich in der
>  ISR benutzt werden. Und SREG  natürlich immer und ohne Ausnahmen.

von Hannes (Gast)


Lesenswert?

Marc V. schrieb:
> Marc V. schrieb:
>> Und SREG  natürlich immer und ohne Ausnahmen.

"Immer und ohne Ausnahmen" heißt also: Auch bei Verwendung von naked!

Marc V. schrieb:
> Bei naked wird ausser Aufruf und Definition nichts generiert, nicht
> mal RETI.
Hier sagst du: Bei naked wird SREG nicht gerettet!

Nur darauf will ich hinaus. Nichts anderes. Was naked bedeutet, weiß 
ich. Du machst zwei gegensätzliche Aussagen und wirfst anschließend 
anderen Leuten "Blödheit" vor!
Es liegt mir fern, zu streiten um des Streites Willen. Aber du hast 
nunmal zwei Aussagen gemacht, die nicht zusammen passen. Die Verwendung 
von 'naked' ist eine Ausnahme, in allen anderen Fällen wird SREG 
gerettet.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Hannes schrieb:
> Marc V. schrieb:
>> Bei naked wird ausser Aufruf und Definition nichts generiert, nicht
>> mal RETI.
> Hier sagst du: Bei naked wird SREG nicht gerettet!
>
> Nur darauf will ich hinaus. Nichts anderes. Was naked bedeutet, weiß
> ich.

 Das bezweifle ich aber sehr.

> Du machst zwei gegensätzliche Aussagen und wirfst anschließend
> anderen Leuten "Blödheit" vor!

 Nicht anderen Leuten.
 Nur dir.
 Bei naked existiert die ISR gar nicht, was soll da gerettet werden ?

 Oder ist das wiederum zu schwer für dich ?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Der AVR-GCC sichert im Prolog mindesten SREG, R0, R1 und lädt das 
Zero-Register.

Aber es gibt ja noch andere Compiler und die könnten durchaus das SREG 
nicht sichern, wenn nicht nötig. Z.B. Portpin setzen (SBI, CBI) oder 
abfragen (SBIS, SBIC) ändern das SREG ja nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Warum sollte ich ?
>  Kannst du nicht lesen ?
Warum schaffe ich es in den allermeisten Fällen, einen Post
1. ohne persönliche Anrede abzuhandlen und
2. ohne beleidigende Bemerkungen zu beenden?

Warum schaffst du das nicht?
Was unterscheidet uns?

Oder andersrum: wenn in einem Post zu viele Personalpronomen auftauchen, 
dann geht es nicht mehr um eine Sache, sondern nur um irgendwelche 
persönlichen Befindlichkeiten. Schade, dass einige das nicht trennen 
können.

(In diesem Post war die persönliche Anrede leider unumgänglich...)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Arduinoquäler schrieb:
> Marc V. schrieb:
>> Bei naked wird ausser Aufruf und Definition nichts generiert, nicht
>>  mal RETI.
>
> Zusatz: könnte man ja leicht verifizieren indem man
> sich selbst ein Mini-Testbeispiel schreibt .....
1
00000000 <__vectors>:
2
   0:  0c 94 34 00   jmp  0x68  ; 0x68 <__ctors_end>
3
...
4
  30:  0c 94 51 00   jmp  0xa2  ; 0xa2 <__bad_interrupt>
5
  34:  0c 94 54 00   jmp  0xa8  ; 0xa8 <__vector_13>
6
  38:  0c 94 51 00   jmp  0xa2  ; 0xa2 <__bad_interrupt>
7
8
void main(void)
9
{
10
}
11
  a6:  08 95         ret
12
13
// ********************************  Ohne naked ISR
14
000000a8 <_exit>:
15
  a8:  f8 94         cli
16
000000aa <__stop_program>:
17
  aa:  ff cf         rjmp  .-2        ; 0xaa <__stop_program>
18
19
// ********************************  Mit naked ISR
20
000000a8 <__vector_13>:
21
  a8:  f8 94         cli
22
000000aa <__stop_program>:
23
  aa:  ff cf         rjmp  .-2        ; 0xaa <__stop_program>

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Hannes schrieb:
> Es liegt mir fern, zu streiten um des Streites Willen. Aber du hast
> nunmal zwei Aussagen gemacht, die nicht zusammen passen. Die Verwendung
> von 'naked' ist eine Ausnahme, in allen anderen Fällen wird SREG
> gerettet.
1
naked
2
Use this attribute on the ARM, AVR, IP2K and SPU ports to indicate that the specified function does not need prologue/epilogue sequences generated by the compiler. It is up to the programmer to provide these sequences. The only statements that can be safely included in naked functions are asm statements that do not have operands. All other statements, including declarations of local variables, if statements, and so forth, should be avoided. Naked functions should be used to implement the body of an assembly function, while allowing the compiler to construct the requisite function declaration for the assembler.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Warum schaffe ich es in den allermeisten Fällen, einen Post
> 1. ohne persönliche Anrede abzuhandlen und
> 2. ohne beleidigende Bemerkungen zu beenden?
>
> Warum schaffst du das nicht?
> Was unterscheidet uns?

 Die Tatsache, dass du Moderator bist und somit für Schleimer ein
 absolutes Tabu.
 Dass ich keinen Problem damit habe, meinen Fehler einzugestehen aber
 auch keinen Problem damit habe, andere als Dummschwätzer
 blosszustellen. Wenn Argumente nicht helfen, muss ich mich fragen,
 ob mein Gegenüber dumm ist.

 Mag im Forum unerwünscht sein, es ist aber so.

 Werde versuchen, mich ein bisschen zurückzuhalten und Gehirnlose auf
 ignore zu setzen.

von avr (Gast)


Lesenswert?

Marc V. schrieb:
> Dass ich keinen Problem damit habe, meinen Fehler einzugestehen aber
>  auch keinen Problem damit habe, andere als Dummschwätzer
>  blosszustellen. Wenn Argumente nicht helfen, muss ich mich fragen,
>  ob mein Gegenüber dumm ist.

Das Problem ist, dass du deine Fehler einfach nicht erkennst. Du 
beteiligst dich hier häufig, leider aber oftmals mit Halbwissen oder 
sogar falschen Antworten und bestehst dann leider darauf, obwohl dich so 
ziemlich alle auf deinen Fehler hinweisen. Es sind eben nicht immer die 
anderen blöd.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

avr schrieb:
> Du
> beteiligst dich hier häufig, leider aber oftmals mit Halbwissen oder
> sogar falschen Antworten und bestehst dann leider darauf, obwohl dich so
> ziemlich alle auf deinen Fehler hinweisen.

 Was ja wiederum gelogen ist.
 Deswegen wohl als Gast, Lügner und Feiglinge machen es halt so.
 Und wenn sie dann als solche entlarvt werden, wird halt unter einem
 anderen Namen aber immer noch als Gast weiterhin erlogenes oder
 absoluter völliger totaler Schwachsinn gepostet.

von Hannes (Gast)


Lesenswert?

Marc V. schrieb:
> Deswegen wohl als Gast, Lügner und Feiglinge machen es halt so.

Gegen Kurt hat man in der Diskussion keine Chance. :-)

von Einer K. (Gast)


Lesenswert?


von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc V. schrieb:
> Wenn Argumente nicht helfen, muss ich mich fragen,
>  ob mein Gegenüber dumm ist.
Dann tu das. Still und heimlich. Nicht jede Frage muss mit maximaler 
Lautstärke hinausposaunt sein (im Besonderen nicht, wenn sie sich des 
Wortschatzes der unteren Schublade bedient).

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.