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

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