Procházet zdrojové kódy

Slight optimization of the fan speed interrupt routine by accessing
the Arduino millis() without locking interrupts.

bubnikv před 7 roky
rodič
revize
82304a2268
2 změnil soubory, kde provedl 11 přidání a 2 odebrání
  1. 9 0
      Firmware/Marlin.h
  2. 2 2
      Firmware/Marlin_main.cpp

+ 9 - 0
Firmware/Marlin.h

@@ -242,6 +242,15 @@ void prepare_arc_move(char isclockwise);
 void clamp_to_software_endstops(float target[3]);
 void refresh_cmd_timeout(void);
 
+// Timer counter, incremented by the 1ms Arduino timer.
+// The standard Arduino timer() function returns this value atomically
+// by disabling / enabling interrupts. This is costly, if the interrupts are known
+// to be disabled.
+extern volatile unsigned long timer0_millis;
+// An unsynchronized equivalent to a standard Arduino millis() function.
+// To be used inside an interrupt routine.
+FORCE_INLINE unsigned long timer_nc() { return timer0_millis; }
+
 #ifdef FAST_PWM_FAN
 void setPwmFrequency(uint8_t pin, int val);
 #endif

+ 2 - 2
Firmware/Marlin_main.cpp

@@ -7443,10 +7443,10 @@ ISR(INT7_vect) {
 
 	if (fanSpeed < MIN_PRINT_FAN_SPEED) return;
 	if ((1 << 6) & EICRB) { //interrupt was triggered by rising edge
-		t_fan_rising_edge = millis();
+		t_fan_rising_edge = millis_nc();
 	}
 	else { //interrupt was triggered by falling edge
-		if ((millis() - t_fan_rising_edge) >= FAN_PULSE_WIDTH_LIMIT) {//this pulse was from sensor and not from pwm
+		if ((millis_nc() - t_fan_rising_edge) >= FAN_PULSE_WIDTH_LIMIT) {//this pulse was from sensor and not from pwm
 			fan_edge_counter[1] += 2; //we are currently counting all edges so lets count two edges for one pulse
 		}
 	}