Forum: Mikrocontroller und Digitale Elektronik ATOMIC_BLOCK innerhalb ISR


von Karsten K. (karsten42)


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

von Oliver S. (oliverso)


Lesenswert?

Da wird nichts weiter gemacht als:
1
uint8_t sreg = SREG;
2
cli();
3
//<Code im Block>
4
SREG = sreg;

Oliver

von Sascha W. (sascha-w)


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

von Falk B. (falk)


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!

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.