Merge pull request #436 from kfoltman/dev

Fixed atomic access to flags in sys.execute.
This commit is contained in:
Sonny Jeon 2014-07-06 18:21:01 -06:00
commit a20d3e9855
7 changed files with 20 additions and 20 deletions

View File

@ -86,7 +86,7 @@ ISR(LIMIT_INT_vect) // DEFAULT: Limit pin change interrupt process.
if (sys.state != STATE_ALARM) { if (sys.state != STATE_ALARM) {
if (bit_isfalse(sys.execute,EXEC_ALARM)) { if (bit_isfalse(sys.execute,EXEC_ALARM)) {
mc_reset(); // Initiate system kill. mc_reset(); // Initiate system kill.
sys.execute |= (EXEC_ALARM | EXEC_CRIT_EVENT); // Indicate hard limit critical event bit_true(sys.execute, (EXEC_ALARM | EXEC_CRIT_EVENT)); // Indicate hard limit critical event
} }
} }
} }
@ -103,7 +103,7 @@ ISR(WDT_vect) // Watchdog timer ISR
if (bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { bits ^= LIMIT_MASK; } if (bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { bits ^= LIMIT_MASK; }
if (bits & LIMIT_MASK) { if (bits & LIMIT_MASK) {
mc_reset(); // Initiate system kill. mc_reset(); // Initiate system kill.
sys.execute |= (EXEC_ALARM | EXEC_CRIT_EVENT); // Indicate hard limit critical event bit_true(sys.execute, (EXEC_ALARM | EXEC_CRIT_EVENT)); // Indicate hard limit critical event
} }
} }
} }
@ -238,7 +238,7 @@ void limits_go_home(uint8_t cycle_mask)
// Initiate pull-off using main motion control routines. // Initiate pull-off using main motion control routines.
// TODO : Clean up state routines so that this motion still shows homing state. // TODO : Clean up state routines so that this motion still shows homing state.
sys.state = STATE_QUEUED; sys.state = STATE_QUEUED;
sys.execute |= EXEC_CYCLE_START; bit_true(sys.execute, EXEC_CYCLE_START);
protocol_execute_runtime(); protocol_execute_runtime();
protocol_buffer_synchronize(); // Complete pull-off motion. protocol_buffer_synchronize(); // Complete pull-off motion.
@ -259,7 +259,7 @@ void limits_soft_check(float *target)
// workspace volume so just come to a controlled stop so position is not lost. When complete // workspace volume so just come to a controlled stop so position is not lost. When complete
// enter alarm mode. // enter alarm mode.
if (sys.state == STATE_CYCLE) { if (sys.state == STATE_CYCLE) {
sys.execute |= EXEC_FEED_HOLD; bit_true(sys.execute, EXEC_FEED_HOLD);
do { do {
protocol_execute_runtime(); protocol_execute_runtime();
if (sys.abort) { return; } if (sys.abort) { return; }
@ -267,7 +267,7 @@ void limits_soft_check(float *target)
} }
mc_reset(); // Issue system reset and ensure spindle and coolant are shutdown. mc_reset(); // Issue system reset and ensure spindle and coolant are shutdown.
sys.execute |= (EXEC_ALARM | EXEC_CRIT_EVENT); // Indicate soft limit critical event bit_true(sys.execute, (EXEC_ALARM | EXEC_CRIT_EVENT)); // Indicate soft limit critical event
protocol_execute_runtime(); // Execute to enter critical event loop and system abort protocol_execute_runtime(); // Execute to enter critical event loop and system abort
return; return;

View File

@ -288,13 +288,13 @@ void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate)
// NOTE: Parser error-checking ensures the probe isn't already closed/triggered. // NOTE: Parser error-checking ensures the probe isn't already closed/triggered.
sys.probe_state = PROBE_ACTIVE; sys.probe_state = PROBE_ACTIVE;
sys.execute |= EXEC_CYCLE_START; bit_true(sys.execute, EXEC_CYCLE_START);
do { do {
protocol_execute_runtime(); protocol_execute_runtime();
if (sys.abort) { return; } // Check for system abort if (sys.abort) { return; } // Check for system abort
} while ((sys.state != STATE_IDLE) && (sys.state != STATE_QUEUED)); } while ((sys.state != STATE_IDLE) && (sys.state != STATE_QUEUED));
if (sys.probe_state == PROBE_ACTIVE) { sys.execute |= EXEC_CRIT_EVENT; } if (sys.probe_state == PROBE_ACTIVE) { bit_true(sys.execute, EXEC_CRIT_EVENT); }
protocol_execute_runtime(); // Check and execute run-time commands protocol_execute_runtime(); // Check and execute run-time commands
if (sys.abort) { return; } // Check for system abort if (sys.abort) { return; } // Check for system abort
@ -316,7 +316,7 @@ void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate)
mc_line(target, feed_rate, invert_feed_rate); // Bypass mc_line(). Directly plan homing motion. mc_line(target, feed_rate, invert_feed_rate); // Bypass mc_line(). Directly plan homing motion.
#endif #endif
sys.execute |= EXEC_CYCLE_START; bit_true(sys.execute, EXEC_CYCLE_START);
protocol_buffer_synchronize(); // Complete pull-off motion. protocol_buffer_synchronize(); // Complete pull-off motion.
if (sys.abort) { return; } // Did not complete. Alarm state set by mc_alarm. if (sys.abort) { return; } // Did not complete. Alarm state set by mc_alarm.
@ -337,7 +337,7 @@ void mc_reset()
{ {
// Only this function can set the system reset. Helps prevent multiple kill calls. // Only this function can set the system reset. Helps prevent multiple kill calls.
if (bit_isfalse(sys.execute, EXEC_RESET)) { if (bit_isfalse(sys.execute, EXEC_RESET)) {
sys.execute |= EXEC_RESET; bit_true(sys.execute, EXEC_RESET);
// Kill spindle and coolant. // Kill spindle and coolant.
spindle_stop(); spindle_stop();
@ -348,7 +348,7 @@ void mc_reset()
// the steppers enabled by avoiding the go_idle call altogether, unless the motion state is // the steppers enabled by avoiding the go_idle call altogether, unless the motion state is
// violated, by which, all bets are off. // violated, by which, all bets are off.
if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_HOMING)) { if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_HOMING)) {
sys.execute |= EXEC_ALARM; // Flag main program to execute alarm state. bit_true(sys.execute, EXEC_ALARM); // Flag main program to execute alarm state.
st_go_idle(); // Force kill steppers. Position has likely been lost. st_go_idle(); // Force kill steppers. Position has likely been lost.
} }
} }

View File

@ -44,9 +44,9 @@
// Bit field and masking macros // Bit field and masking macros
#define bit(n) (1 << n) #define bit(n) (1 << n)
#define bit_true(x,mask) (x |= mask) #define bit_true(x,mask) {uint8_t sreg = SREG; cli(); (x) |= (mask); SREG = sreg; }
#define bit_false(x,mask) (x &= ~mask) #define bit_false(x,mask) {uint8_t sreg = SREG; cli(); (x) &= ~(mask); SREG = sreg; }
#define bit_toggle(x,mask) (x ^= mask) #define bit_toggle(x,mask) {uint8_t sreg = SREG; cli(); (x) ^= (mask); SREG = sreg; }
#define bit_istrue(x,mask) ((x & mask) != 0) #define bit_istrue(x,mask) ((x & mask) != 0)
#define bit_isfalse(x,mask) ((x & mask) == 0) #define bit_isfalse(x,mask) ((x & mask) == 0)

View File

@ -45,7 +45,7 @@ void probe_state_monitor()
if (probe_get_state()) { if (probe_get_state()) {
sys.probe_state = PROBE_OFF; sys.probe_state = PROBE_OFF;
memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS); memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS);
sys.execute |= EXEC_FEED_HOLD; bit_true(sys.execute, EXEC_FEED_HOLD);
} }
} }
} }

View File

@ -296,4 +296,4 @@ void protocol_buffer_synchronize()
// NOTE: This function is called from the main loop and mc_line() only and executes when one of // NOTE: This function is called from the main loop and mc_line() only and executes when one of
// two conditions exist respectively: There are no more blocks sent (i.e. streaming is finished, // two conditions exist respectively: There are no more blocks sent (i.e. streaming is finished,
// single commands), or the planner buffer is full and ready to go. // single commands), or the planner buffer is full and ready to go.
void protocol_auto_cycle_start() { if (sys.auto_start) { sys.execute |= EXEC_CYCLE_START; } } void protocol_auto_cycle_start() { if (sys.auto_start) { bit_true(sys.execute, EXEC_CYCLE_START); } }

View File

@ -157,9 +157,9 @@ ISR(SERIAL_RX)
// Pick off runtime command characters directly from the serial stream. These characters are // Pick off runtime command characters directly from the serial stream. These characters are
// not passed into the buffer, but these set system state flag bits for runtime execution. // not passed into the buffer, but these set system state flag bits for runtime execution.
switch (data) { switch (data) {
case CMD_STATUS_REPORT: sys.execute |= EXEC_STATUS_REPORT; break; // Set as true case CMD_STATUS_REPORT: bit_true(sys.execute, EXEC_STATUS_REPORT); break; // Set as true
case CMD_CYCLE_START: sys.execute |= EXEC_CYCLE_START; break; // Set as true case CMD_CYCLE_START: bit_true(sys.execute, EXEC_CYCLE_START); break; // Set as true
case CMD_FEED_HOLD: sys.execute |= EXEC_FEED_HOLD; break; // Set as true case CMD_FEED_HOLD: bit_true(sys.execute, EXEC_FEED_HOLD); break; // Set as true
case CMD_RESET: mc_reset(); break; // Call motion control reset routine. case CMD_RESET: mc_reset(); break; // Call motion control reset routine.
default: // Write character to buffer default: // Write character to buffer
next_head = rx_buffer_head + 1; next_head = rx_buffer_head + 1;

View File

@ -46,9 +46,9 @@ ISR(PINOUT_INT_vect)
if (bit_isfalse(PINOUT_PIN,bit(PIN_RESET))) { if (bit_isfalse(PINOUT_PIN,bit(PIN_RESET))) {
mc_reset(); mc_reset();
} else if (bit_isfalse(PINOUT_PIN,bit(PIN_FEED_HOLD))) { } else if (bit_isfalse(PINOUT_PIN,bit(PIN_FEED_HOLD))) {
sys.execute |= EXEC_FEED_HOLD; bit_true(sys.execute, EXEC_FEED_HOLD);
} else if (bit_isfalse(PINOUT_PIN,bit(PIN_CYCLE_START))) { } else if (bit_isfalse(PINOUT_PIN,bit(PIN_CYCLE_START))) {
sys.execute |= EXEC_CYCLE_START; bit_true(sys.execute, EXEC_CYCLE_START);
} }
} }
} }