atomic - richtig angewendet ?

Hallo,

mir kommt das irgendwie doppelt gemoppelt vor, nur möchte ich den millis Zugriff Interrupt sicher gestalten.
Es geht um einen ATtiny, deswegen sieht das nicht ganz Arduino like aus.

volatile uint32_t millis;
volatile uint32_t second;

Im Timer Compare Match Interrupt erzeuge ich den millis Zähler.

ISR(TIMER0_COMPA_vect)
{
	static uint32_t local_millis = 0;
	
	millis++;
	local_millis++;

	if(local_millis > 999) {
		second++;
		local_millis = 0;
	}
}

Wenn ich jetzt irgendwann im Hauptprogramm auf millis zugreife zum vergleichen, dann könnte mir das doch böse enden, weil das eine Zahl größer wie 1 Byte ist. Gehe ich jetzt richtig im Verständnis, wenn ich mir eine Zwischenfunktion mit atomic baue in der Art ... ?

uint32_t millis()
{
	ATOMIC_BLOCK (ATOMIC_RESTORESTATE)    // cli und sei mit SREG Sicherung
	{
		return millis;
	}
}

Da ist die Frage ob return in ATOMIC_BLOCK korrekt ist. Also ob das Rückschreiben des alten SREG Wertes noch ausgeführt wird bevor man die Funktion verlässt.

Wenn man auf Nummer Sicher gehen will speichert man den globalen millis Wert in eine lokale Variable und gibt diese zurück.

Hallo,

stimmt, dass hatte ich mal wo gelesen, erinnere mich dunkel.
Dann eben mit Hilsvariable. Das sollte jetzt ISR Beschuß sicher sein.

uint32_t millis_value()
{
	uint32_t value = 0;
	ATOMIC_BLOCK (ATOMIC_RESTORESTATE)    // cli und sei mit SREG Sicherung
	{
		value = millis;
	}
	return value;
}