ATOMIC_BLOCK innerhalb ISR

OP #3568427
Lesenswert?
• ▲
▼
Moin Moin,

Ist der Aufruf vom Macro ATOMIC_BLOCK(ATOMIC_RESTORESTATE) transparent, 
also ohne Auswirkung wenn dieser innerhalb einer ISR aufgerufen wird?
Abgesehen davon bin ich natürlich großer Hoffnung, das die volatile 
definition innerhalb der typedef struct {} txbuf_t auch wirklich 
funktioniert :-)
Hintergrund ist der, dass die Funktion _send_message() aus auserhalb 
einer ISR aufgrufen wird.

Folgender Beispiel Code dazu:
1
typedef struct  {
2

3
  volatile uint8_t active;// Flag set if transmission is in progress
4
  can_buffer_t buffer;  // Control structure 
5
  can_t list[CAN_TX_BUFFER_SIZE];  // Array of can_t buffer
6

7
} txbuf_t;
8

9

10
ISR(INT0_vect)  {
11
...
12
// check if there are any another messages waiting 
13
if (buf != NULL) {
14

15
  sja_add = SJA1;
16
  _send_message(buf);
17
  can_buffer_dequeue(&txbuf[0].buffer);
18
    
19
} else {
20
  // buffer underflow => no more messages to send
21
  txbuf[0].active = 0;
22
}
23
...
24

25
uint8_t
26
_send_message(const can_t *msg)  {
27

28
...
29
   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
30
     txbuf[sja_add].active = 1;
31
   }
32
...
33
}

Vielen Dank für konstruktive Hilfe

Beste Grüße
Karsten
#3568824
Lesenswert?
• ▲
▼
@ Karsten K.

du schreibst zwar nicht was du für einen Controller verwendest, aber bei 
den AVRs kann während der Ausführung einer ISR keine andere ISR 
ausgeführt werden, da die Interrups mit Aufruf der ISR gesperrt werden.
Ausnahme: du erlaubst die Interrupts innerhalb der ISR mit sei()

Insofern kannst du dir deinen ATOMIC_BLOCK innerhalb der ISR sparen!

Sascha
#3568861
Lesenswert?
• ▲
▼
@ Sascha Weber (sascha-w)

>Insofern kannst du dir deinen ATOMIC_BLOCK innerhalb der ISR sparen!

Der Block ist in einer Funktion, nicht in einer ISR. Die Funktion kann 
sowohl vom Hauptprogram als auch aus der ISR aufgerufen werden. Was die 
Sache nochmals gefährlicher macht!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.