The duration of disabled interrupts is shortened.
authorJ. Hendrix <gitweb@localhost>
Thu, 13 Mar 2014 07:16:33 +0000 (08:16 +0100)
committerJ. Hendrix <gitweb@localhost>
Thu, 13 Mar 2014 07:16:33 +0000 (08:16 +0100)
millisecondInterrupt.ino

index d957eea..bced407 100644 (file)
@@ -11,7 +11,7 @@
  
 #define _BC(bit) ( 0 << ( bit ) )
 #define _BS(bit) ( 1 << ( bit ) )
+
 // Pin 13 has an LED connected on most Arduino boards.
 const uint8_t led = 13;
 volatile uint16_t millisecondCounter = 0;
@@ -49,8 +49,20 @@ ISR( TIMER2_COMPA_vect ) {
   }
 };
 
+
+/*
+ * This function ensures that a volatile variable can be read from memory without being interrupted.
+ * If the variable is updated in ISR while the loop is retrieving the bytes from SRAM, the value read can get corrupted.
+ * http://electronics.stackexchange.com/questions/102699/reading-a-multibyte-volatile-variable-that-is-updated-in-an-isr/102710?noredirect=1#comment202192_1027101
+ */ 
+inline uint32_t atomic_int32 ( volatile uint32_t *var )
+{
+  noInterrupts();
+  uint32_t tmp = *var;
+  interrupts();
+  return tmp;
+}
+
 void loop() {
-    noInterrupts();
-    digitalWrite( led , secondCounter & 1 );
-    interrupts();
+  digitalWrite( led , atomic_int32( & secondCounter ) & 1 );
 }